我正在开发一个经典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…</a>')
.click(function() {
$(this).find('span').toggle();
$(this).find('a:last').hide();
});
$('div.contentdetail span').hide();
});
</script>
然而,脚本显然只是在100个字符后关闭文本。例如,我希望它继续写文本直到第一个句号或空格。这可能吗?
谢谢。
答案 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上下文而不进行任何转义。如果visibleText
或textToHide
包含任何<
或&
个字符,您将对其进行修改,可能会在此过程中导致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);