大家都知道,很多网站都有那种把较长文本收缩起来,只显示一小部分,后面有个展开/收缩按钮,点击可切换全部显示和只显示一小部分状态。
将要实现效果如下:
说句实话,这是一个简单得不能再简单的东西了,我也用Js实现功能(写死在每个页面),可我有十多个页面要用到这东西,就想着把它封装成插件,可我又从来没写过Js插件,项目要得很紧,也没时间去研究,所有就在百度上找看看有没有现成的。
结果找了好多都不是这种效果,到最后好不容易找了一个呢,是国外的,效果也能实现,不过有点小瑕疵。
1.因为作者是老外,所以分割文字时他是在指定的切割位置向后搜索,直到空格时才分割。因为英文单词是不能分割的,而单词间是以空格来区分的。这个用于中文的话就有问题,比如上图那个的文本,没一个空格的。
2.每展开并收缩一次,就会产生一个空的连接标签,虽然界面上看不到,但总觉得不爽。
3.那老外把收缩时的的标志省略号“...”写在展开连接里面的,不像上图是在文本尾部,这样就只能把连接和文本紧挨着,不然就很明显的看到省略号是在连接内。
因为又找不到其他的,一看那个JQuery插件代码也不是太多,所以就试着改一下。
好了,废话少说,直接贴代码。一个是未修改的源插件代码,一个是我改过的代码。
源插件代码(我只是格式化了),文件名:jquery.truncatable.js
View Code
1 (function($) {
2 $.fn.truncatable = function(options) {
3 var defaults = {
4 limit: 100,
5 more: '...',
6 less: false,
7 hideText: '[read less]'
8 };
9 var options = $.extend(defaults, options);
10 return this.each(function(num) {
11 var stringLength = $(this).html().length;
12 if (stringLength > defaults.limit) {
13 var splitText = $(this).html().substr(defaults.limit);
14 var splitPoint = splitText.substr(0, 1);
15 var whiteSpace = new RegExp(/^\s+$/);
16 for (var newLimit = defaults.limit; newLimit < stringLength; newLimit++) {
17 var newSplitText = $(this).html().substr(0, newLimit);
18 var newHiddenText = $(this).html().substr(newLimit);
19 var newSplitPoint = newSplitText.slice( - 1);
20 if (whiteSpace.test(newSplitPoint)) {
21 var hiddenText = '<span class="hiddenText_' + num + '" style="display:none">' + newHiddenText + '</span>';
22 var setNewLimit = (newLimit - 1);
23 var trunkLink = $('<a>').attr('class', 'more_' + num + '');
24 $(this).html($(this).html().substr(0, setNewLimit)).append('<a class="more_' + num + '" href="#">' + defaults.more + '<a/> ' + hiddenText);
25 $('a.more_' + num).bind('click',
26 function() {
27 $('span.hiddenText_' + num).show();
28 $('a.more_' + num).hide();
29 if (defaults.less == true) {
30 $('span.hiddenText_' + num).append('<a class="hide_' + num + '" href="" title="' + defaults.hideText + '">' + defaults.hideText + '</a>');
31 $('a.hide_' + num).bind('click',
32 function() {
33 $('.hiddenText_' + num).hide();
34 $('.more_' + num).show();
35 $('.hide_' + num).empty();
36 return false
37 })
38 }
39 });
40 newLimit = stringLength
41 }
42 }
43 }
44 })
45 }
46 })(jQuery);
下面是我修改的:
View Code
1 (function ($) {
2 $.fn.truncaString = function (options) {
3 var defaults = {
4 length: 100,
5 isHide: false, //初始时是否收缩
6 hideClue: false, //是否显示收缩提示符 “...”
7 moreText: '[Expansion]', //展开按纽文本
8 hideText: '[Shrink]', //收缩按纽文本
9 moreTitle: '', //展开按纽标题(鼠标移上时提示文字)
10 hideTitle: '', //收缩按纽标题(鼠标移上时提示文字)
11 boundary: /^\s+$/ //匹配分割符的正则表达式,匹配空格,因为英文单词不能从中间断开 /^(\s|\u002c|\u002e|\uff0c|\u3002|[\u4E00-\u9FA5])+$/
12 };
13 var options = $.extend(defaults, options);
14 return this.each(function (num) {
15 var stringLength = $(this).html().length;
16 if (stringLength > defaults.length) {
17 var whiteSpace = new RegExp(defaults.boundary);
18 var moreHtml = '<a class="more_' + num + '" href="#" title="' + defaults.moreTitle + '">' + defaults.moreText + '</a> ';//“展开”按纽
19 var hideHtml = '<a class="hide_' + num + '" href="#" title="' + defaults.hideTitle + '">' + defaults.hideText + '</a>';//“收缩”按纽
20
21 //循环把分割点向后移动,直到找到空格
22 for (var newLimit = defaults.length; newLimit < stringLength; newLimit++) {
23 var newSplitText = $(this).html().substr(0, newLimit); //分割点前的字符(一直要显示的)
24 var newHiddenText = $(this).html().substr(newLimit); //分割点后的字符(要隐藏的)
25 var newSplitPoint = newSplitText.slice(-1); //拷贝分割点前的字符
26 if (whiteSpace.test(newSplitPoint)) { //结尾是否匹配分割字符
27 var clue = defaults.hideClue ? '<span class="hideClue_' + num + '">...</span>' : '<span class="hideClue_' + num + '"></span>';
28 var hiddenText = '<span class="hiddenText_' + num + '">' + newHiddenText + '</span>'; //要隐藏的部分
29 var displayText = $(this).html().substr(0, newLimit - 1); //要显示的部分
30 $(this).html(displayText).append(clue + hiddenText + moreHtml + hideHtml);
31
32 $('a.more_' + num).bind('click', function () { //展开
33 $('span.hiddenText_' + num).show();
34 $('span.hideClue_' + num).hide();
35 $('a.more_' + num).hide();
36 $('a.hide_' + num).show();
37 return false;
38 });
39 $('a.hide_' + num).bind('click', function () { //隐藏
40 $('span.hiddenText_' + num).hide();
41 $('span.hideClue_' + num).show();
42 $('a.more_' + num).show();
43 $('a.hide_' + num).hide();
44 return false;
45 });
46
47 if (defaults.isHide) {
48 $('a.hide_' + num).click();
49 } else {
50 $('a.more_' + num).click();
51 }
52
53 newLimit = stringLength;
54 }
55 }
56 }
57 })
58 }
59 })(jQuery);
调用
$(function () {
$('#articleIntroStr').truncaString({
length: 150,
hideClue: true,
isHide: true,
moreText:"更多",
hideText:"收缩",
boundary: /^(\s|\u002c|\u002e|[\u4E00-\u9FA5])+$/
});
});
});