我想用JavaScript截断一个动态加载的字符串。这是一个url,所以没有空格,我显然不关心单词的边界,只关心字符。

以下是我得到的答案:

var pathname = document.referrer; //wont work if accessing file:// paths
document.getElementById("foo").innerHTML = "<a href='" + pathname +"'>" + pathname +"</a>"

使用substring方法:

var length = 3;
var myString = "ABCDEFG";
var myTruncatedString = myString.substring(0,length);
// The value of myTruncatedString is "ABC"

在你的例子中:

var length = 3;  // set to the number of characters you want to keep
var pathname = document.referrer;
var trimmedPathname = pathname.substring(0, Math.min(length,pathname.length));

document.getElementById("foo").innerHTML =
     "<a href='" + pathname +"'>" + trimmedPathname + "</a>"

是的,子字符串。你不需要做Math.min;索引比字符串长度长的子字符串以原始长度结束。

But!

document.getElementById("foo").innerHTML = "<a href='" + pathname +"'>" + pathname +"</a>"

这是一个错误。如果文件。推荐人有一个撇号?或者在HTML中具有特殊意义的各种其他字符。在最坏的情况下,引用器中的攻击者代码可能会将JavaScript注入您的页面,这是一个XSS安全漏洞。

虽然可以手动转义路径名中的字符来阻止这种情况发生,但这有点麻烦。你最好使用DOM方法,而不是摆弄innerHTML字符串。

if (document.referrer) {
    var trimmed= document.referrer.substring(0, 64);
    var link= document.createElement('a');
    link.href= document.referrer;
    link.appendChild(document.createTextNode(trimmed));
    document.getElementById('foo').appendChild(link);
}

我觉得应该提一下Sugar.js。它有一个截断方法,非常聪明。

从文档中可以看到:

截断字符串。除非split为true, truncate不会将单词拆分,而是 丢弃发生截断的单词。

例子:

'just sittin on the dock of the bay'.truncate(20)

输出:

just sitting on...

下面的代码截断字符串,不拆分单词,而是丢弃发生截断的单词。完全基于Sugar.js源代码。

function truncateOnWord(str, limit) {
        var trimmable = '\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u2028\u2029\u3000\uFEFF';
        var reg = new RegExp('(?=[' + trimmable + '])');
        var words = str.split(reg);
        var count = 0;
        return words.filter(function(word) {
            count += word.length;
            return count <= limit;
        }).join('');
    }

是的,substring工作得很好:

stringTruncate('Hello world', 5); //output "Hello..."
stringTruncate('Hello world', 20);//output "Hello world"

var stringTruncate = function(str, length){
  var dots = str.length > length ? '...' : '';
  return str.substring(0, length)+dots;
};

这里有一个你可以使用的方法。这是FreeCodeCamp挑战之一的答案:

function truncateString(str, num) {
  if (str.length > num) {
    return str.slice(0, num) + "...";
  } else {
    return str;
  }
}

以防你想按单词截断。

function limit(str, limit, end) { limit = (limit)? limit : 100; end = (end)? end : '...'; str = str.split(' '); if (str.length > limit) { var cutTolimit = str.slice(0, limit); return cutTolimit.join(' ') + ' ' + end; } return str.join(' '); } var limit = limit('ILorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus metus magna, maximus a dictum et, hendrerit ac ligula. Vestibulum massa sapien, venenatis et massa vel, commodo elementum turpis. Nullam cursus, enim in semper luctus, odio turpis dictum lectus', 20); console.log(limit);


var pa = document.getElementsByTagName('p')[0].innerHTML; var rpa = document.getElementsByTagName('p')[0]; / / console.log (pa。片(0,30)); var newPa = pa。片(0,29).concat(“…”); 战。textContent = newPa; console.log (newPa) < p > 一些文本这里一些文本一些文本这里一些文本一些文本这里一些文本一些文本这里一些文本一些文本这里一些文本一些文本这里一些文本一些文本这里一些文本一些文本 < / p >


ES6更新版本

const truncateString = (string = ", maxLength = 50) => 字符串。length > maxLength ? “${字符串。substring(0,最大长度)}……” :字符串 //演示上述函数 alert(truncateString('Hello World', 4));


var str = "Anything you type in.";
str.substring(0, 5) + "" //you can type any amount of length you want

如果您想通过Limit(符号)截断, 但对于不长的文本(例如标题),你不想删减单词(保留最后一个单词完整):

trancWord(str, limit) {
    str = str.split(' ');
    let summ = 0
    for (let [index, value]  of str.entries()) {
        summ  += value.length
        if (summ > limit) {
            let cutTolimit = str.slice(0, index);
            return str.slice(0, index).join(' ') + ' ' + '...';
        }
    }
    return str.join(' ');
}

对于长字符串(一些长文本后Vue-3使用过滤器):

trancWord  (str, max){
        if (str.length <= max) { return str; }
        let subString = str.substr(0, max);
        return (str ? subString.substr(0, subString.lastIndexOf(' ')) : subString) + '...';
}

除了子字符串方法,我找到了一个不错的小JS库用于此目的。

它在普通javascript中有多种有用的方法来截断字符串。

按字符截断:

Var pathname = 'this/is/thepathname'; . getelementbyid(“foo”)。innerHTML = " <类=链接的href = '“+路径名+”>“+路径名+”< / >” //调用插件-字符截断只需要一行init 新Cuttr(”。链接',{长度:10}); < script src = " https://cdnjs.cloudflare.com/ajax/libs/cuttr/1.3.2/cuttr.min.js " > < /脚本> < div id = " foo " > < / div >

简单地添加一个类到a和初始化插件。

多行文本剪辑也是可能的。 在github页面上的cutter .js文档中提到了更多的选项,如词序句子截断。


可以在内部JavaScript方法的帮助下修复此方法

Const truncate = (text, len) => { 如果(文本。长度> len && text。长度> 0){ 返回“${文本。(" ")。片(0,len)。Join(" ")}…'; }其他{ 返回文本; } };


要将字符串截断为特定长度,请在JavaScript中使用以下单线性箭头函数:

const truncate = (str, len) => str.slice?.(0, len);
    
console.log(truncate("Hello, World!", 5));
// Expected Output: Hello

上面的函数使用string .prototype.slice方法,该方法获取字符串的一个块,并将其作为一个新字符串返回,而不改变原始字符串。


一行ES6解决方案

如果字符串长度超过给定长度,它还会添加一个结束字符串,而不仅仅是截断字符串。

const limit = (string, length, end = "...") => {
    return string.length < length ? string : string.substring(0, length) + end
}

limit('Hello world', 5) // Hello...

逻辑如下

得到字符串的长度 如果大于阈值,则获取 子字符串并以省略号或其他符号结束 否则,返回输入字符串 函数truncateString(str: string, num: number, end: string = '…'){ 返回str.length > num ?str.slice(0, num) + end: str; }