截断直接JavaScript字符串


166

我想使用直接JavaScript截断动态加载的字符串。这是一个url,所以没有空格,而且我显然不在乎单词边界,只在乎字符。

这是我得到的:

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

1
您想截断哪一部分?您的示例不能很好地传达意图。
拉森纳尔

1
哦,好吧-我想用一定数量的字符截断URL,以便当我设置“ foo”的innerHTML时,如果它太长,它不会流出div。
鲍勃(Bob)

1
*但是-仅是innerHTML,而不是var路径名本身。
鲍勃(Bob)

1
为什么不只使用CSS隐藏div的溢出?溢出:隐藏
塞缪尔

2
@Samuel因为在UI方面不适合实践-如果用户期望看到他们刚来自(url.document.referrer)的url,并且我正在缩短它,我想向他们表明他们只看到一部分网址,并且没有错误。除此之外,您建议的方法会将字符切成两半,这看起来很可怕。
鲍勃(Bob)

Answers:


333

使用子字符串方法:

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

1
如果您想要一个从0开始的子字符串,那么substr函数将执行相同的操作,减少3个字符;)
jackocnr 2014年

1
SUBSTR行为怪异,如果串短于length-返回空
RozzA

如果您的“字符串”是数字,则还需要插入.toString().以将其转换为substring()可以处理的字符串。
not2qubit


16

是的,子字符串。您不需要执行Math.min;索引长于字符串长度的子字符串以原始长度结束。

但!

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

这是个错误。如果document.referrer中带有撇号怎么办?或其他在HTML中具有特殊含义的其他字符。在最坏的情况下,引荐来源网址中的攻击者代码可能会将JavaScript注入您的页面,这是XSS安全漏洞。

虽然可以手动转义路径名中的字符以阻止这种情况的发生,但这有点痛苦。与使用innerHTML字符串相比,使用DOM方法最好。

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

我很困惑,您的解决方案如何避免安全漏洞?
鲍勃”

10
当您使用诸如“ createTextNode”和“ .href = ...”之类的DOM方法时,您将直接设置真正的基础纯文本值。在HTML文件中或通过innerHTML编写HTML时,必须遵守HTML转义规则。因此,虽然'createTextNode('A <B&C')'很好,但是使用innerHTML时,您将不得不说'innerHTML ='A&lt; B&amp; C'。
2009年

11

以为我会提到Sugar.js。它有一个截断方法,非常聪明。

文档中

截断字符串。除非split为true,否则truncate不会拆分单词,而是丢弃出现截断的单词。

例:

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

输出:

just sitting on...

9
Sugar is a Javascript library that extends native objects…在JavaScript中扩展本机对象通常被认为是Bad Idea™。
Jezen Thomas

@JezenThomas有时候坏主意是最合适的主意。
viditkothari

10

下面的代码将截断字符串,并且不会拆分单词,而是丢弃发生截断的单词。完全基于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('');
    }

2
如果结果!== str;添加“ ...”会很好。
Leo Caseiro '16

9

这是您可以使用的一种方法。这是FreeCodeCamp挑战之一的答案:

function truncateString(str, num) {


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

6

更新的ES6版本

const truncateString = (string, maxLength = 50) => {
  if (!string) return null;
  if (string.length <= maxLength) return string;
  return `${string.substring(0, maxLength)}...`;
};

truncateString('what up', 4); // returns 'what...'

即使没有必要,它也会始终调用子字符串...
Clint Eastwood

@ClintEastwood很好的反馈,我已经更新了答案。检查字符串长度与最大长度也意味着我可以删除showDots const和三进制,使其更整齐。干杯。
山姆·洛根

3

是的,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;
};

0

如果您想按单词截断。

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


0

var pa = document.getElementsByTagName('p')[0].innerHTML;
var rpa = document.getElementsByTagName('p')[0];
// console.log(pa.slice(0, 30));
var newPa = pa.slice(0, 29).concat('...');
rpa.textContent = newPa;
console.log(newPa)
<p>
some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here some text here
</p>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.