【发布时间】:2012-12-30 15:58:36
【问题描述】:
我正在管理 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 的样子:
<span style="font-weight: bold ; color: #003380 ;">Pikrass</span>
目前我只是让检查不那么严格(我可以只检查跨度内的文本数据,而不是依赖 isEqualNode),但我对为什么克隆节点可能与原始节点不同感兴趣, 根据 isEqualNode。
相关规格:cloneNode、isEqualNode
编辑:我用 Firefox 和 Chromium 进行了测试。 Firefox isEqualNode 返回 false,但 Chromium 返回 true。感谢 Felix 指出这一点。
【问题讨论】:
-
哪个浏览器?它似乎在 Chrome 中工作:jsfiddle.net/WhxQP.
-
有趣的问题。这是一个简化的示例:jsfiddle.net/QtJJb
-
这个小提琴在 Firefox 17.x 中不起作用。
-
所以,
.clone似乎没有复制 ID 属性,这可以解释差异。但是,在您的示例中,span元素没有 ID 属性。它在你的实际代码中吗? -
@Felix Kling:我建议您将其发布为答案。
标签: javascript html dom