我想使用直接 JavaScript 截断动态加载的字符串。它是一个 url,所以没有空格,而且我显然不关心单词边界,只关心字符。
这是我得到的:
var pathname = document.referrer; //wont work if accessing file:// paths
document.getElementById("foo").innerHTML = "<a href='" + pathname +"'>" + pathname +"</a>"
我想使用直接 JavaScript 截断动态加载的字符串。它是一个 url,所以没有空格,而且我显然不关心单词边界,只关心字符。
这是我得到的:
var pathname = document.referrer; //wont work if accessing file:// paths
document.getElementById("foo").innerHTML = "<a href='" + pathname +"'>" + pathname +"</a>"
使用子串方法:
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>"
这是您可以使用的一种方法。这是 FreeCodeCamp 挑战之一的答案:
function truncateString(str, num) {
if (str.length > num) {
return str.slice(0, num) + "...";
} else {
return str;
}
}
是的,子串。你不需要做 Math.min; 索引比字符串长度更长的子字符串以原始长度结束。
但!
document.getElementById("foo").innerHTML = "<a href='" + pathname +"'>" + pathname +"</a>"
这是个错误。如果 document.referrer 中有撇号怎么办?或者在 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 源代码。
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('');
}