Усечь строку прямо JavaScript


Я хотел бы усечь динамически загруженную строку, используя прямой JavaScript. Это url-адрес, поэтому нет пробелов, и я, очевидно, не забочусь о границах слов, просто символы.

вот что я получил:

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

5 ответов:

использовать подстрока способ:

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>"

да, подстроки. Вам не нужно делать математику.min; подстрока с более длинным индексом, чем длина строки, заканчивается на исходной длине.

но!

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

Это ошибка. Что делать, если документ.у реферера был Апостроф? Или различные другие символы, которые имеют особое значение в HTML. В худшем случае код злоумышленника в реферере может внедрить JavaScript на вашу страницу, что является дырой безопасности XSS.

в то время как можно избежать символы в pathname вручную, чтобы остановить это происходит, это немного больно. Вам лучше использовать методы 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);
}

думал, что дам сахар.js упоминания. Он имеет метод усечения, который довольно умен.

С документация:

Усекает строку. Если split не является истинным, усечение не будет разделять слова, а вместо этого отбросьте слово, в котором произошло усечение.

пример:

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

выход:

just sitting on...

следующий код усекает строку и не разбивает слова, а вместо этого отбрасывает слово, где произошло усечение. Полностью на основе сахара.Яш источник.

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;
};