我在这里玩jsfiddle:http://jsfiddle.net/dm9eebz9/
HTML
<div id="wrapper">
<p class="body">Line 1
<br>
<br>Line 3</p>
<p class="body">Line 1
<br>Line 2
<br>
<br>
<br>
<br>Line 6</p>
<p class="body">Line 1
<br>Line 2</p>
</div>
使用Javascript / jQuery的
$('#wrapper p.body').each(function () {
var temp = $(this).innerHTML;
this.innerHTML = temp.replace(/(<br>)+/gim, "<br>");
});
我的目标是在它们发生时试图摆脱2 <br>
以上。然而,它似乎并不认识临时。这是jsfiddle的行为,还是我犯了一个明显的错误?
答案 0 :(得分:1)
jsfiddled:http://jsfiddle.net/pe6w7z1e/1/
这个想法是:将有一个休息时间和一个/多个(一个/多个spacenewline + break)&gt;&gt;只用一次休息替换
以下是修改后的代码:
$('p.body').each(function () {
var elem = $(this)
var temp = elem.html();
elem.html(temp.replace(/<br>(\s+<br>)+/img, "<br>"));
});
如果它回答了您的问题,请标记为答案
我认为最好在所有情况下使用jquery。混合使用Jquery和原始javascript并不是一个好主意。
答案 1 :(得分:1)
使用.html()
而非innerHTML
;
正则表达式模式/(<br>\s*)+/
将\s*
的空格考虑在内,其中匹配0个或更多空白字符。
$('p.body').each(function () {
var temp = $(this).html();
$(this).html(temp.replace(/(<br>\s*)+/gim, "<br>"));
});
同样注释,use your browsers console用于调试,始终RTFM。
答案 2 :(得分:1)
我真的不认为正则表达式是正确的工具。您可以使用.contents
和.filter
的组合删除重复的<br />
代码:
var prev = null;
var $nodes = $('.body')
.contents()
.filter(function () {
return this.nodeType !== 3 || $.trim(this.data) !== "";
});
for (var i = 1; i < $nodes.length; i++) {
if ($nodes.eq(i).is('br') && $nodes.eq(i-1).is('br')) {
$nodes.eq(i).remove();
}
}
这里的复杂性是<br />
标签之间的文本节点,因此是两步过程。
答案 3 :(得分:0)
您需要为innerHTML
属性使用正确的对象。这是一个DOM对象属性,而不是一个jQuery。您可以在DOM元素上使用innerHTML
DOM属性:
$('p.body').each(function () {
var temp = this.innerHTML;
this.innerHTML = temp.replace(/(<br>)+/gim, "<br>");
});
JSFiddle:http://jsfiddle.net/dm9eebz9/6/
或在jQuery对象上使用html()方法:
$('p.body').each(function () {
var temp = $(this).html();
this.html(temp.replace(/(<br>)+/gim, "<br>"));
});
http://jsfiddle.net/dm9eebz9/7/
注意&#34;正确&#34;换行符是<br/>
,而不是<br>
,但我认为你无法改变