克隆节点不等于原始节点(使用isEqualNode)

Pik*_*ass 11 html javascript dom

我正在管理Javascript中的名称列表.选中复选框后,您的姓名将显示在列表中.当你取消选中它时,它会被划掉.当您将框设置为不确定状态时,您的名称将被删除.

我已经在隐藏的div中获得了当前登录用户的名称.名称是具有样式属性的跨度.

我用isEqualNode检查名称是否已经在列表中.当页面加载时它在列表中,它工作正常:找到名称,因此当框选中状态更改时更新名称.

for(var i=0 ; i < bullet.childNodes.length ; i++) {
    var node = bullet.childNodes[i];
    if(node.className == 'crossed')
        node = node.firstChild;
    if(node.isEqualNode(document.getElementById('curUser').firstChild))
        break;
}
// if i < bullet.childNodes.length, then we found the user's name in the list
Run Code Online (Sandbox Code Playgroud)

当名称不在列表中时,我克隆了span.

var newName = document.getElementById('curUser').firstChild.cloneNode(true);
bullet.appendChild(newName);
Run Code Online (Sandbox Code Playgroud)

这在视觉上有效.

但我偶然发现了一些棘手的事情:newName.isEqualNode(document.getElementById('curUser').firstChild)是假的!因此,如果盒状态再次改变,则不会找到新添加的名称,并且将再次创建新名称.

这是跨度的样子:

<span style="font-weight: bold ; color: #003380 ;">Pikrass</span>
Run Code Online (Sandbox Code Playgroud)

目前我只是简单地检查一下(我可以只检查跨度内的文本数据而不是依赖于isEqualNode),但我感兴趣的是为什么克隆节点可能与原始节点不同,根据isEqualNode.

相关规范:cloneNode,isEqualNode


编辑:我测试了Firefox和Chromium.使用Firefox isEqualNode返回false,但使用Chromium它返回true.感谢Felix指出这一点.

Pik*_*ass 0

迟到总比不到好。:)

我无法再使用 Firefox 17 重现该问题,因此正如评论中所讨论的,这可能是 Gecko 中的一个错误,现已修复。

但是我找不到任何错误报告。我暂时将此答案标记为已接受,但如果有人可以找到错误报告或对幕后情况的解释,我会接受。

贝尔吉的评论对于其他两个答案来说是正确的。