我正在管理 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
当名称不在列表中时,我克隆跨度。
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 和 Chromium 进行了测试。Firefox isEqualNode 返回 false,但 Chromium 返回 true。感谢菲利克斯指出这一点。