我看到这已被问过很多次了。但是,遗憾的是我没有遇到过直接的解决方案。大多数解决方案都围绕div中的多个节点。
所以这是问题所在。我有以下标记:
<div class="test">Text1<span></span></div>
我需要将“Text1”替换为“Text2”,而不会影响附加到span标记的span标记和事件处理程序。
执行$('.test')html('Text2<span></span>')
之类的操作会替换文本。但是,删除span标记上的事件处理程序,这是不希望的。我正在寻找一种快速有效的方法。
答案 0 :(得分:4)
使用标记包装可替换文本:
<div class="test"><span class="test-text">Text1</span><span></span></div>
答案 1 :(得分:3)
您可以使用Text Node访问contents。现在,如果你知道元素以文本开头,你可以这样做:
$($('.test').contents()[0]).replaceWith('New Text');
现在,如果您不知道文本节点数组中的位置,可以使用以下内容进行过滤:
return this.nodeType === 3;
并比较文本值(如果你知道的话)。
答案 2 :(得分:0)
如果要添加带有.live
或.on
函数的事件处理程序(取决于jQuery版本).html('Text2')可以正常工作。
答案 3 :(得分:0)
假设要替换的文本总是在现有范围之前,那么它将始终是firstChild
和,它将是一个未包装的textNode:
$('.test').click(
function() {
this.firstChild.nodeValue = 'Text2';
});
确保只更改第一个textNode,无论它在.test
元素中的位置如何:
$('.test').click(
function(e) {
var newText = 'Text2',
children = e.target.childNodes;
for (var i=0,len=children.length;i<len;i++){
if (children[i].nodeName == '#text'){
children[i].nodeValue = newText;
return false;
}
}
});