我需要使用jQuery更改一些HTML - (我无法控制HTML因此我需要使用客户端进行这种轻微的更改)
如果<br />
是名为“列”的div中的第一个元素,那么我需要删除它。
所以:
<div class="column">
<br />text here lorem ipsum blah<br />
会变成:
<div class="column">
text here lorem ipsum blah<br />
注意,我不想删除所有<br />
标记,只有<br />
标记直接位于开头标记后面。
我曾希望这样的事情会起作用,但没有快乐
$('<div class="column"><br />').replaceWith('<div class="column">');
任何帮助表示赞赏!非常感谢!
答案 0 :(得分:3)
这样的事情应该这样做:
var pattern = /^<br\/>/;
$("<div.column").each(function() {
var $this = $(this),
text = $this.text();
if(text.match(pattern)) {
$this.text(text.replace('<br/>', ''))
}
});
(忽略 - 留在原处以便理解下面的评论)
试试这个:
var pattern = /^\n*\s*<br>/;
$("div.column").each(function() {
var $this = $(this),
html = $this.html();
if(html.match(pattern)) {
$this.html(html.replace(pattern, ''))
}
});
<强> DEMO 强>
正如@minitech指出的那样,任何事件处理程序和附加到原始HTML的数据都将丢失,因此:
经过多次演奏,终于简洁明了。试试@ minitech的100%jQuery版本的方法:
$('.column').each(function() {
$.each(this.childNodes, function(i, c) {
return !$(c).filter('br').remove().end().text().trim();
});
});
<强> DEMO 强>
说明:内部循环依次访问每个childNode;如果当前节点为<br>
,则其单个语句将删除当前节点,但仅当当前节点为空或空格时才允许循环进行。请注意明智地使用.end()
将所有内容保存在一个方法链中。
效率:差 - jQuery方法链必须消耗几个CPU周期,但这似乎是一个很小的代价。
Readabiity:接近nada。
使用温和的模式,这将处理前导空格/ BR / HTML注释的任意组合:
$('.column').each(function() {
$(this.childNodes).each(function(i, c) {
return !$(c).filter('br').remove().end().text().trim();
});
});
与上一版本的不同之处在于jQuery对象$(this.childNodes)
不受节点删除的影响,而原始this.childNodes
受到影响且.each()
循环无法正常扫描。至少,这是我解释的最佳尝试。
<强> DEMO 强>
答案 1 :(得分:1)
原始节点操作!
$('.column').each(function() {
var firstChild = this.firstChild;
while(firstChild && (firstChild.nodeType === 3 && /^\s*$/.test(firstChild.nodeValue) || firstChild.nodeType === 8)) {
firstChild = firstChild.nextSibling;
}
if(firstChild && firstChild.nodeName === 'BR') {
this.removeChild(firstChild);
}
});
答案 2 :(得分:0)
如果在第一个位置删除它怎么样?
var relevantDiv = $('#someDiv');
var divHtml = relevantDiv.html();
if ($.trim(divHtml).indexOf('<br') == 0)
{
relevantDiv.html(divHtml.substr(divHtml.indexOf('>')+1));
}
在开始时处理所有类型的br标签和空白。
答案 3 :(得分:0)
怎么样:
$("div.column").each(function(){
var ws=true;
$(this).contents().filter(function(){
if (this.nodeName.toLowerCase() === 'br' && ws){
ws = false;
return true;
}
ws &= $.trim($(this).text()) === "" && this.nodeName === "#text";
return false;
}).remove();
});
答案 4 :(得分:-1)
这家伙怎么样:
var br = $("div.column br:first-child");
if(br.length > 0 && br[0].previousSibling == null)
{
br.remove();
}
答案 5 :(得分:-2)
尝试这样的事情:
var content = $('div.column').html();
// there remove <br /> from content if it exits
$('div.column').empty().append(content);