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

Dol*_*end 52 javascript string truncate

我正在寻找一个简单的脚本,它可以截断带省略号的字符串(...)

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

我不想使用CSS或PHP.

El *_*oco 92

function truncate(input) {
   if (input.length > 5)
      return input.substring(0,5) + '...';
   else
      return input;
};
Run Code Online (Sandbox Code Playgroud)

  • 这个(string.substr(0,5)+'...';)为我工作。 (3认同)
  • 如果您想取悦印刷师,您可以使用“...”,这是省略号的专用字形,其中点之间的空间有点窄。 (3认同)

Jar*_*rod 35

KooiInc对此有一个很好的答案.总结一下:

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

现在你可以这样做:

var s = 'not very long';
s.trunc(25); //=> not very long
s.trunc(5); //=> not...
Run Code Online (Sandbox Code Playgroud)

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

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

完全归功于KooiInc.

  • 简洁很好.我用它作为:`function truncateWithEllipses(text,max){return text.substr(0,max-1)+(text.length> max?'…':''); }` (5认同)
  • @KévinBerthommier如果您还提供了“ending”参数,则可能不应该被称为“truncateWithEllipses”,因为您可以更改“ending”是什么,然后它就不再是“WithEllipses”。 (2认同)

Jam*_*ber 13

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

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

小提琴 - 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(' ') + '...';
  }
});
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)


bob*_*bob 9

这会将省略号置于行的中心:

function truncate( str, max, sep ) {

    // Default to 10 characters
    max = max || 10;

    var len = str.length;
    if(len > max){

        // Default to elipsis
        sep = sep || "...";

        var seplen = sep.length;

        // If seperator is larger than character limit,
        // well then we don't want to just show the seperator,
        // so just show right hand side of the string.
        if(seplen > max) {
            return str.substr(len - max);
        }

        // Half the difference between max and string length.
        // Multiply negative because small minus big.
        // Must account for length of separator too.
        var n = -0.5 * (max - len - seplen);

        // This gives us the centerline.
        var center = len/2;

        var front = str.substr(0, center - n);
        var back = str.substr(len - center + n); // without second arg, will automatically go to end of line.

        return front + sep + back;

    }

    return str;
}

console.log( truncate("123456789abcde") ); // 123...bcde (using built-in defaults) 
console.log( truncate("123456789abcde", 8) ); // 12...cde (max of 8 characters) 
console.log( truncate("123456789abcde", 12, "_") ); // 12345_9abcde (customize the separator) 
Run Code Online (Sandbox Code Playgroud)

例如:

1234567890 --> 1234...8910
Run Code Online (Sandbox Code Playgroud)

和:

A really long string --> A real...string
Run Code Online (Sandbox Code Playgroud)

不完美,但功能齐全。请原谅菜鸟的过度评论。


小智 6

就像是:

var line = "foo bar lol";
line.substring(0, 5) + '...' // gives "foo b..."
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个完整的解决方案.您需要检查字符串是否实际大于要截断的量.如果为false,则不应出现```.只使用`line.substring(0,max_char)`将不够充分. (7认同)

Shl*_*sid 5

最简单灵活的方式:JSnippet DEMO

功能风格:

function truncString(str, max, add){
   add = add || '...';
   return (typeof str === 'string' && str.length > max ? str.substring(0,max)+add : str);
};
Run Code Online (Sandbox Code Playgroud)

原型:

String.prototype.truncString = function(max, add){
   add = add || '...';
   return (this.length > max ? this.substring(0,max)+add : this);
};
Run Code Online (Sandbox Code Playgroud)

用法:

str = "testing with some string see console output";

//By prototype:
console.log(  str.truncString(15,'...')  );

//By function call:
console.log(  truncString(str,15,'...')  );
Run Code Online (Sandbox Code Playgroud)


dav*_*vad 5

用于防止单词中间或标点符号后面的点。

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
Run Code Online (Sandbox Code Playgroud)