截断一个string直的JavaScript

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

这是我得到的:

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

使用子string方法:

 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; 具有比string长度更长的索引的子string以原始长度结束。

但!

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

这是个错误。 如果document.referrer有一个撇号呢? 或者在HTML中具有特殊含义的其他各种字符。 在最糟糕的情况下,引用者中的攻击者代码可能会将JavaScript注入到您的页面中,这是XSS安全漏洞。

虽然可以手动转义path名中的字符来阻止这种情况的发生,但这有点痛苦。 使用DOM方法比使用innerHTMLstring更好。

 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 。 它有一个非常聪明的截断方法。

从文档 :

截断一个string。 除非分割为真,否则truncate不会分割单词,而是放弃截断发生的单词。

例:

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

输出:

 just sitting on... 

下面的代码截断了一个string,不会将单词分开,而是放弃发生截断的单词。 完全基于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(''); }