【问题标题】:Multiline Text Truncation Issue多行文本截断问题
【发布时间】:2015-10-12 11:23:52
【问题描述】:

我目前有一个 jQuery 的 sn-p,当子字符串大于父容器时,它成功地截断了我的文本(见下文)。

var initial = $('.js-text').text();
$('.js-text').text(initial);
while($('.js-text').outerHeight() > $('.js-text-truncator').height()) {
  $('.js-text').text(function(index, text) {
    return text.replace(/\W*\s(\S)*$/, '...');
  });
}

我已经使用了我所拥有的语义,因为我计划在现有标记中的多个位置使用这个小 jQuery 组件,如下所示:

<div class="existing-first-div-container js-text-truncator">
  <p class="existing-first-string js-text">The quick brown fox</p>
</div>
<div class="existing-second-div-container js-text-truncator">
  <p class="existing-second-string js-text"> jumped over the lazy red dog.</p>
</div>

如果你已经读到这里并且已经猜到了我的问题顺便说一句......

所以问题是我的 jQuery 正在存储文本,但它正在存储 all 文本。因此,这两个现有的 div 都被截断,但最终都显示为“快速的棕色狐狸跳过了懒惰的红狗”。而不是第一读“敏捷的棕狐”和第二读“跳过懒惰的红狗”。

是否可以按照我的意图使用我的 js-text-truncator 作为我的标记的扩展,而不是一次存储所有截断的文本实例?

【问题讨论】:

    标签: jquery html scalability markup truncate


    【解决方案1】:

    .text明确说明

    获取匹配元素集合中每个元素的组合文本内容,包括它们的后代,或者设置匹配元素的文本内容。

    一旦你的元素集带有.js-text,对它们执行.each,然后分别获取、截断和设置.text

    如果您希望它在窗口重新调整大小时重新运行,我建议您通过超时来完成(因此代码在窗口停止调整大小至少 400 毫秒后运行一次)。如果没有这种解决方法,它往往会对性能产生很大影响。

    var resizeTimeout = false;
    $(window).resize(onWindowResize); // bind resize event.
    
    trimAllText(); //run once at start.
    
    function onWindowResize() {
        if(resizeTimeout){
            clearTimeout(resizeTimeout);
        }
        resizeTimeout = setTimeout(function(e){ 
            resizeTimeout = false; 
    
            // this is code that is ran at the "end" of a resize.
            trimAllText();
        }, 400);
    }
    
    function trimAllText(){
      var initialElements = $('.js-text');
      initialElements.each(function(){
        var elem = $(this);
        while(elem.outerHeight() > elem.closest('.js-text-truncator').height()) {
          elem.text(function(index, text) {
            return text.replace(/\W*\s(\S)*$/, '...');
          });
        });
      });
    }
    

    【讨论】:

    • 谢谢,这会截断两者。不过,我可能没有提供足够的细节......调整浏览器窗口时,这不会存储或添加/删除文本:jsfiddle.net/ts7bs9q3
    • 如果你想在窗口上调整大小,你可以将相同的函数绑定到 .resize :) 给我一点时间把它添加到答案中。
    • 您好,您的第一个解决方案是在没有 400 毫秒延迟的情况下成功地即时修剪文本。但是,如果您将浏览器的大小调整得更大,它仍然不会添加文本。我怀疑这是因为我们最初没有存储每个文本?我会在你的答案上打勾,因为你在技术上回答了我的问题。但是如果你有更多的想法那就太棒了;)
    • 啊,我错过了重新添加它的想法!在第一次替换之前,您可以使用属性将原始文本存储在标记中,例如 data-init="put initial text here"。或者,您可以计算一个包含元素和初始文本的对象数组。 var inits = [{elem = $('some$obj'), text = "$('some$obj').text()"}, ...]
    猜你喜欢
    • 1970-01-01
    • 2019-01-04
    • 2019-03-09
    • 1970-01-01
    • 2014-10-21
    • 2016-12-02
    • 2014-06-17
    • 2018-02-07
    • 1970-01-01
    相关资源
    最近更新 更多