【问题标题】:How do I smartly truncate an HTML string in javascript?如何巧妙地截断 javascript 中的 HTML 字符串?
【发布时间】:2014-04-02 19:52:52
【问题描述】:

我有一个用户输入的内容,可以是任何类型的文本。

例如

这是一些示例文本。我可以使用特殊字符,例如 &&&&&&&&&&

然后我在网格中显示此内容,其中文本被截断为 80 个字符(以适应可用空间),如果用户将鼠标悬停在文本上,他们可以看到完整的字符串。

我有一个函数可以调用来为我执行此操作。

function GetDescriptionContent(data, type, row){            
    return 
        "<span title='" + data.replace(/'/g, '&#39;') + "'>" + 
            $('<div/>').text(data).html().substring(0, 80) + 
        "</span>";
}

但是,当我对 html 进行子字符串处理时,我有时会切掉特殊字符,例如 &amp;amp; &amp;lt; &amp;gt;
此外,当字符串中有特殊字符时,它会过早地切断字符串,否则长度可能还可以。

如何在 javascript 中巧妙地截断我的 HTML 字符串?

【问题讨论】:

    标签: javascript jquery string


    【解决方案1】:

    我发现我可以跟踪html实体并调整截断长度。

    function truncateToLength(
        stringToTruncate, 
        truncationLength, 
        truncationCharacter = "&hellip;")
    {
        //string is too small, does not need to be truncated
        if(stringToTruncate.length <= truncationLength){
            return stringToTruncate;
        }
    
        //find all html entities
        var splitOnAmpersandArray = stringToTruncate.split('&');
    
        //first instance of html entity is beyond our truncation length
        //return what we have plus truncation character
        if(splitOnAmpersandArray[0].length > truncationLength){
            return splitOnAmpersandArray[0].substring(0, truncationLength) 
                + truncationCharacter;
        }
    
        //first instance of html entity is inside our truncation length
        var truncatedString = splitOnAmpersandArray[0];
    
        //keep adding onto truncated string until:
        // it is longer than our length or 
        // we are out of characters to add on.
        for(var i = 1; i < splitOnAmpersandArray.length; i++){
            //find end of current html entity
            var htmlEntityLength = splitOnAmpersandArray[i].indexOf(';');
    
            //increase truncation length to account for size of current html entity
            truncationLength += htmlEntityLength + 1;
    
            //add up until next html entity
            truncatedString = truncatedString + '&' + splitOnAmpersandArray[i];
    
            //if our new length is too long, truncate and add truncation character
            if(truncatedString.length >= truncationLength){
                return truncatedString.substring(0,truncationLength) 
                    + truncationCharacter;
            }
        }
    
        //we ran out of characters to add onto string, return result
        return truncatedString;
    }
    

      var content = "&nbsp;&amp;&gt;&lt;&quot;&apos;&cent;&pound;&yen;&euro;&copy;&reg;";
      $('#sample').html(truncateToLength(content, 5));
      $('#sample').prop('title', $('<div/>').html(content).text());
    
    
    
    
        function truncateToLength(
            stringToTruncate, 
            truncationLength, 
            truncationCharacter = "&hellip;")
        {
            //string is too small, does not need to be truncated
            if(stringToTruncate.length <= truncationLength){
                return stringToTruncate;
            }
            
            //find all html entities
            var splitOnAmpersandArray = stringToTruncate.split('&');
    
            //first instance of html entity is beyond our truncation length
            //return what we have plus truncation character
            if(splitOnAmpersandArray[0].length > truncationLength){
                return splitOnAmpersandArray[0].substring(0, truncationLength) 
                    + truncationCharacter;
            }
    
            //first instance of html entity is inside our truncation length
            var truncatedString = splitOnAmpersandArray[0];
            
            //keep adding onto truncated string until:
            // it is longer than our length or 
            // we are out of characters to add on.
            for(var i = 1; i < splitOnAmpersandArray.length; i++){
                //find end of current html entity
                var htmlEntityLength = splitOnAmpersandArray[i].indexOf(';');
    
                //increase truncation length to account for size of current html entity
                truncationLength += htmlEntityLength + 1;
    
                //add up until next html entity
                truncatedString = truncatedString + '&' + splitOnAmpersandArray[i];
    
                //if our new length is too long, truncate and add truncation character
                if(truncatedString.length >= truncationLength){
                    return truncatedString.substring(0,truncationLength) 
                        + truncationCharacter;
                }
            }
    
            //we ran out of characters to add onto string, return result
            return truncatedString;
        }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id="sample"></div>

    【讨论】:

      猜你喜欢
      • 2022-01-11
      • 2011-05-10
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多