我正在管理Javascript中的名称列表。当您选中一个框时,您的名字将出现在列表中。当你取消选中时,它会被删除。当您将框设置为不确定状态时,您的名字被删除。克隆的节点不等于原始节点(使用isEqualNode)
我已经得到了隐藏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
当名称不在列表中时,我克隆了跨度。
var newName = document.getElementById('curUser').firstChild.cloneNode(true);
bullet.appendChild(newName);
这在视觉上起作用。
但我偶然发现了一些棘手的问题:newName.isEqualNode(document.getElementById('curUser').firstChild)
是错误的!所以如果箱子状态再次改变,那么新添加的名称将不会被找到,并且会再次创建新的名称。
这里是跨度的样子:
<span style="font-weight: bold ; color: #003380 ;">Pikrass</span>
目前我只会让检查不严格(我可以检查,而不是依靠isEqualNode跨度内的文本数据),但根据isEqualNode,我对克隆节点为何与原始节点不同有所感兴趣。
相关规范:cloneNode,isEqualNode
编辑:我与Firefox和铬测试。使用Firefox isEqualNode返回false,但使用Chromium它将返回true。感谢Felix指出了这一点。
哪个浏览器?它似乎在Chrome中工作:http://jsfiddle.net/WhxQP/。 –
有趣的问题。这里有一个简化的例子:http://jsfiddle.net/QtJJb/ –
这个小提琴在Firefox 17.x中不起作用。 –