jQuery实现长文本收缩展开插件

大家都知道,很多网站都有那种把较长文本收缩起来,只显示一小部分,后面有个展开/收缩按钮,点击可切换全部显示和只显示一小部分状态。

将要实现效果如下:

    

说句实话,这是一个简单得不能再简单的东西了,我也用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])+$/
                    });
                    });
                });

 

 

 

 

posted @ 2013-01-19 09:22  Adming  阅读(3027)  评论(1编辑  收藏  举报