我想实现readmore / less功能。即我将获得HTML内容,我将从该内容中显示前几个字符,并且会在其前面显示更多链接。我目前正在使用此代码:
var txtToHide= input.substring(length);
var textToShow= input.substring(0, length);
var html = textToShow+ '<span class="readmore"> … </span>'
+ ('<span class="readmore">' + txtToHide+ '</span>');
html = html + '<a id="read-more" title="More" href="#">More</a>';
上面的输入是输入字符串,长度是最初显示的字符串的长度。
此代码存在问题,假设我想从此字符串中删除20个字符:
"Hello <a href='#'>test</a> output"
,html标签介于两者之间,如果将其部分剥离,它会弄乱页面。我想要的是,如果html标签介于范围之间,它应该覆盖整个标签,即我需要输出"Hello <a href='#'>test</a>"
。我怎么能这样做
答案 0 :(得分:6)
不是手动做太多,我更喜欢你使用下面的jQuery插件。
http://plugins.learningjquery.com/expander/index.html#getting-started
它会扩展和折叠您的文本以获取更多选项,同时为您提供更多自定义。
希望这会有所帮助。
谢谢!
侯赛因
答案 1 :(得分:0)
这很难,因为HTML不是常规语言,所以使用正则表达式会很麻烦。
真的希望你需要做的是使用jQuery $('html text')
将HTML解析为DOM结构,然后使用.text()
递归遍历获取每个元素文本长度的元素,当你来到element with导致到目前为止的累积文本长度超过限制,在该点拆分此元素文本并将元素的文本设置为拆分的左侧。
然后将所有元素保留在此元素之前,并忽略此元素之后出现的所有兄弟元素等。但是我不知道如何简单地实现它。
另一方面,您可以将HTML标签剥离,为什么还要麻烦。
答案 2 :(得分:0)
如果你在dom元素中有文本,你可以使用dom元素的innerText / textContent属性来获得没有标签的文本。可以使用此文本的子字符串而无需担心标记。
var post_dom = document.getElementById('#post-content');
var input = post_dom.innerText || post_dom.textContent;
答案 3 :(得分:0)
我认为这里最好的解决方案是使用
var textToHide = input;
var textToShow = $("<div/>").html(input).text().substring(0, length);
将HTML转换为纯文本并提取摘要的前几个字符。然后在点击省略号时在它们之间切换,而不是尝试同时显示两者。
答案 4 :(得分:0)
也许你可以重新考虑这个问题:你可以修改它在页面上显示的方式,而不是修改你的文字。
假设您只想显示3行内容,可以将内容的容器样式修改为等于一个内容行* 3的高度的高度。
无论如何,这可以在jquery中轻松实现,如果你利用它的动画功能,你可以轻松制作自己的插件,如:
(function($){ $.fn.lessDetails = function(desiredHeight){ var desiredHeight = desiredHeight || 20; //or any other "default" value return this.each(function(i){ $(this).realHeight = $(this).css("height"); $(this).css('height',desiredHeight);//or you could animate it }); }; $.fn.moreDetails = function(){ return this.each(function(i){ $(this).css('height',$(this).realHeight || "auto");//or you could animate it }); }; })(jQuery);
然后你可以打电话:
$('.less').lessDetails();
$('.showMore').click(function(){$('#'+$(this).attr('rel')).moreDetails();});'
将您的html结构化为:
< div class="container">
< div id="1" class="less">content goes here </div>
< a href="#" rel="1" class="showMore"> show more</a>
</ div >
没有测试过,但它应该有用,或者至少应该给你一个基本的解决方案。