1

我看到这个问题已经被问过很多次了。但是,不幸的是,我还没有遇到直接的解决方案。大多数解决方案都围绕 div 中的多个节点。

所以这里有问题。我有以下标记:

<div class="test">Text1<span></span></div>

我需要将“Text1”替换为“Text2”而不影响跨度标记和附加到跨度标记的事件处理程序。

做类似$('.test')html('Text2<span></span>')的事情会替换文本。但是,删除 span 标记上的事件处理程序,这是不希望的。我正在为此寻找一种快速有效的方法。

4

4 回答 4

4

用标签包裹可替换文本:

<div class="test"><span class="test-text">Text1</span><span></span></div>
于 2012-04-09T19:23:26.703 回答
3

您可以使用contents访问文本节点本身。现在,如果您知道元素以文本开头,您可以这样做:

$($('.test').contents()[0]).replaceWith('New Text')​;

现在,如果您不知道文本节点数组中的位置,您可以使用以下方法进行过滤:

return this.nodeType === 3;

并比较文本值(如果你知道的话)。

小提琴

于 2012-04-09T19:28:25.810 回答
0

if you would add event handler with .live or .on functions (depends on jQuery version) .html('Text2') would work just fine.

于 2012-04-09T19:25:34.160 回答
0

假设要替换的文本总是在现有跨度之前,它将始终是firstChild 并且它将是一个未包装的 textNode:

$('.test').click(
    function() {
        this.firstChild.nodeValue = 'Text2';
    });​

JS 小提琴演示

为了确保只有第一个 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;
            }
        }
    });​

JS 小提琴演示

于 2012-04-09T19:31:07.387 回答