【问题标题】:In Javascript and/or jQuery how can I get the first line of text in a wrapped div在 Javascript 和/或 jQuery 中,如何在包装的 div 中获取第一行文本
【发布时间】:2018-04-27 11:16:16
【问题描述】:

我想获取 div 文本内容的第一行,由于 div 的样式仅显示第一行,因此浏览器将文本换成了几行。这是用于隐藏除第一行之外的所有内容的 HTML div 和样式:

<div id="element"
     style="display: inline-block; height: 20px; overflow: hidden;
            width: 70px;">asdfl asf af adf adsf dsaf adsf adsfdsa fdsaf dsa fdas fdsa f dsaf dsa fdsa f dsaf sad</div>

div内的文字没有预先换行,and标签和包含的文字都在同一行(如图),没有嵌入换行符(\n),字体不固定(因此无法计算字符串中的字符)。

当我检查 div 时,innerHTML 和 innerText 都包含:

"asdfl asf af adf adsf dsaf adsf adsfdsa fdsaf dsa fdas fdsa f dsaf dsa fdsa f dsaf sad"

对于此示例,我只想在修剪任何尾随空格(如果有的话)后获取“asdfl asf”。

问题的核心是能够在浏览器包装字符串时获取字符串。

【问题讨论】:

  • 这将需要 div 有用的宽度 abd 字体大小来计算行的长度,而不是获取可以放入的字符串部分。

标签: javascript html css word-wrap


【解决方案1】:

为了获得第一行,您需要删除所有文本并在循环中逐个添加字符,如果文本的高度大于单个字符,则前一个字符是最后一个。

function get_first_line(element) {
    var original = element.text();
    element.text(original[0]);
    var height = element.height();
    var first = original;
    for (var i = 2; i < original.length; ++i) {
        element.text(original.slice(0, i));
        if (element.height() > height) {
            first = original.slice(0, i - 1);
            break;
        }
    }
    element.text(original);
    return first;
}

编辑这里是带连字符的工作代码,解决方案是将每个字符包装在 span 中,它们是内联元素,因此它们在包装方面与字符相同。

function get_first_line(element) {
  var original = element.text();
  var text = original.trim();
  // if you care about IE change it to normal function
  element.html(text.split('').map((c) => '<span>' + c + '</span>'));
  var chars = element.find('span');
  var offset = chars.eq(0).offset();
  var first = original;
  for (var i = 1; i < chars.length; i++) {
    if (chars.eq(i).offset().top > offset.top) {
      first = text.slice(0, i);
      break;
    }
  }
  element.text(original);
  return first;
}

还有codepen演示https://codepen.io/jcubic/pen/erBRmb?editors=1010

【讨论】:

  • 我认为您可能会遇到一些边缘情况,但情况并非如此简单。 Foooooooo-Baaaaaar 不符合行时,很可能会在连字符处被浏览器拆分为第二行;但是Foooooooo-Baaaa 可能仍然合适,所以当你添加下一个a 然后你的脚本意识到文本开始中断时,前一个字符不会是仍然显示在上一行的那个。
  • @CBroe 也许有人会想出更好的解决方案。
  • 并不是说它“不好”,只是这个问题比人们最初想象的要复杂 ;-)
  • @CBroe 通过将每个字符包装在 span 中创建了另一个解决方案(包装工作相同,因为字符是与 span 相同的内联元素)。
  • 干得好,现在绝对值得 +1。 (虽然软连字符仍然会带来一些问题,codepen.io/anon/pen/zjozpO - 但处理 那些 以及它们可能导致的中断,我想可能会变得更加复杂,所以除非 OP 声明为一个明确的要求,可能不值得费心。)
猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 2013-04-19
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多