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

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

将要实现效果如下:

    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])+$/

                    });

                    });

                });

 

 

 

 

你可能感兴趣的:(jquery)