0

我想获取 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”。

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

4

1 回答 1

2

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

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;
}

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

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

于 2018-04-27T11:41:05.843 回答