使用javascript substring()创建一个读取更多链接

时间:2009-10-22 10:31:14

标签: javascript jquery asp-classic

我正在开发一个经典ASP页面,它从数据库中提取一些内容,并在前100个字符后创建一个Read more链接,如下所示;

<div class="contentdetail"><%=StripHTML(rspropertyresults.Fields.Item("ContentDetails").Value)%></div>

<script type="text/javascript">
    $(function() {

        var cutoff = 200;
        var text = $('div.contentdetail').text();
        var rest = $('div.contentdetail').text().substring(cutoff);
        if (text.length > 200) {
          var period = rest.indexOf('.');
          var space = rest.indexOf(' ');
          cutoff += Math.max(Math.min(period, space), 0);
        }

        var visibleText = $('div.contentdetail').text().substring(0, cutoff);

        $('div.contentdetail')
            .html(visibleText + ('<span>' + rest + '</span>'))
            .append('<a title="Read More" style="font-weight:bold;display: block; cursor: pointer;">Read More&hellip;</a>')
            .click(function() {
                $(this).find('span').toggle();
                $(this).find('a:last').hide();
            });

        $('div.contentdetail span').hide();
    });
</script>

然而,脚本显然只是在100个字符后关闭文本。例如,我希望它继续写文本直到第一个句号或空格。这可能吗?

谢谢。

3 个答案:

答案 0 :(得分:3)

var cutoff = 100;
var text = $('div.contentdetail').text();
var rest = text.substring(cutoff);
if (text.length > cutoff) {
  var period = rest.indexOf('.');
  var space = rest.indexOf(' ');
  cutoff += Math.max(Math.min(period, space), 0);
}
// Assign the rest again, because we recalculated the cutoff
rest = text.substring(cutoff);
var visibleText = $('div.contentdetail').text().substring(0, cutoff);

编辑:稍微缩短了一点。 编辑:修正了一个错误 编辑:QoL改进

答案 1 :(得分:2)

怎么样:

var text= $('div.contentdetail').text();
var match= text.match( /^(.{100}([^ .]{0,20}[ .])?)(.{20,})$/ );
if (match!==null) {
    var visibleText = match[1];
    var textToHide = match[3];
    ...do replacement...
}

{0,20}期待最多20个字符的空格或句点,然后放弃并打破100个字符。这样就可以阻止长度限制突破长度限制。最后{20,}会停止匹配,只会隐藏无意义的少量内容。

至于替换代码,执行此操作:

.html(visibleText + ('<span>' + textToHide + '</span>'))

这是将纯文本插入HTML上下文而不进行任何转义。如果visibleTexttextToHide包含任何<&个字符,您将对其进行修改,可能会在此过程中导致XSS安全问题。

而是分别创建div的text()和跨度,因为这是您首先阅读文本的方式。

答案 2 :(得分:0)

这是一种相当简单的方法,可以在单词级别获得结尾,并为字符中的拍摄。

var limit        = 100,
    text         = $('div.contentdetail').text().split(/\s+/),
    word,
    letter_count = 0,
    trunc        = '',
    i            = 0;

while (i < text.length && letter_count < limit) {
  word         = text[i++];
  trunc       += word+' ';
  letter_count = trunc.length-1;

}

trunc = $.trim(trunc)+'...';
console.log(trunc);