我想使用 JavaScript 截断带有省略号的文本或行

IT技术 javascript string truncate
2021-03-22 15:54:04

我正在寻找一个简单的脚本,它可以用省略号 (...)

我想截断像'this is a very long string''this is a ve...'

我不想使用 CSS 或 PHP。

6个回答
function truncate(input) {
   if (input.length > 5) {
      return input.substring(0, 5) + '...';
   }
   return input;
};

或在 ES6 中

const truncate = (input) => input.length > 5 ? `${input.substring(0, 5)}...` : input;
这 (string.substr(0,5)+'...';) 对我有用。
2021-04-23 15:54:04
如果你想取悦印刷师,你可以使用它是一个专用的省略号字形,点之间的空间有点窄。
2021-05-10 15:54:04

KooiInc 对此有一个很好的回答。总结一下:

String.prototype.trunc = 
      function(n){
          return this.substr(0,n-1)+(this.length>n?'…':'');
      };

现在你可以这样做:

var s = 'not very long';
s.trunc(25); //=> not very long
s.trunc(5); //=> not...

如果你更喜欢它作为一个函数,根据@AlienLifeForm 的评论:

function truncateWithEllipses(text, max) 
{
    return text.substr(0,max-1)+(text.length>max?'…':''); 
}

对此KooiInc 全权负责。

简洁是好的。我用它作为:function truncateWithEllipses(text, max) {return text.substr(0,max-1)+(text.length>max?'…':''); }
2021-04-22 15:54:04
带结束参数的 ES6 函数: truncateWithEllipses = (text, max, ending = '…') => text.length > max ? text.substr(0, max - ending.length) + ending : text;
2021-04-28 15:54:04
这是一个很好的单行,但即使它的长度没有超过限制,它也会截断字符串。我会添加一个条件(ES6 示例):export const characterLimit = (text, limit) => text.length > limit ? (text.substr(0, limit - 1).trim() + '...') : text;
2021-05-10 15:54:04
@KévinBerthommiertruncateWithEllipses如果您还提供了一个ending参数,可能不应该调用,因为您可以更改endingis ,然后它就不再是WithEllipses
2021-05-11 15:54:04
我喜欢@AlienLifeForm 上面评论中的解决方案非常优雅
2021-05-18 15:54:04

这会将其限制为您希望限制的多行并且是响应式的

一个没有人提出过的想法,根据元素的高度来做,然后从那里剥离它。

小提琴 - https://jsfiddle.net/hutber/u5mtLznf/ <- ES6 版本

但基本上你想获取元素的行高,遍历所有文本并在达到特定行高时停止:

'use strict';

var linesElement = 3; //it will truncate at 3 lines.
var truncateElement = document.getElementById('truncateme');
var truncateText = truncateElement.textContent;

var getLineHeight = function getLineHeight(element) {
  var lineHeight = window.getComputedStyle(truncateElement)['line-height'];
  if (lineHeight === 'normal') {
    // sucky chrome
    return 1.16 * parseFloat(window.getComputedStyle(truncateElement)['font-size']);
  } else {
    return parseFloat(lineHeight);
  }
};

linesElement.addEventListener('change', function () {
  truncateElement.innerHTML = truncateText;
  var truncateTextParts = truncateText.split(' ');
  var lineHeight = getLineHeight(truncateElement);
  var lines = parseInt(linesElement.value);

  while (lines * lineHeight < truncateElement.clientHeight) {
    console.log(truncateTextParts.length, lines * lineHeight, truncateElement.clientHeight);
    truncateTextParts.pop();
    truncateElement.innerHTML = truncateTextParts.join(' ') + '...';
  }
});

CSS

#truncateme {
   width: auto; This will be completely dynamic to the height of the element, its just restricted by how many lines you want it to clip to
}
发现没有比这更好的了!干得好
2021-04-26 15:54:04

就像是:

var line = "foo bar lol";
line.substring(0, 5) + '...' // gives "foo b..."
这不是一个完整的解决方案。您需要检查字符串实际上是否大于您要截断的数量。如果为假,则...不应出现。仅使用line.substring(0, max_char)将是不够的解决方案。
2021-05-16 15:54:04

用于防止在单词中间或标点符号之后出现点。

let parseText = function(text, limit){
  if (text.length > limit){
      for (let i = limit; i > 0; i--){
          if(text.charAt(i) === ' ' && (text.charAt(i-1) != ','||text.charAt(i-1) != '.'||text.charAt(i-1) != ';')) {
              return text.substring(0, i) + '...';
          }
      }
       return text.substring(0, limit) + '...';
  }
  else
      return text;
};
    
    
console.log(parseText("1234567 890",5))  // >> 12345...
console.log(parseText("1234567 890",8))  // >> 1234567...
console.log(parseText("1234567 890",15)) // >> 1234567 890

我喜欢你的解决方案,但你的函数有一个错误,没有return text.substring(0, limit) + '...';. 我编辑了您的答案并将该行添加到您的代码中 + 其他一些微更改。没有那条线,parseText("1234567 890",5)返回undefined但现在它运行良好。
2021-04-27 15:54:04