我发现 cloneNode(true) 的一个行为是出乎意料的,并认为我会出于两个原因记录它。#1 - 从其他人那里得到证实,我认为我看到的是真实的。#2 - 给遇到这个问题的其他人一个提示,因为我在这个网站上没有找到这个问题的参考。
// var's not shown.
danglingNode = document.getElementById('Master').cloneNode(true);
// Modify all id names to make them unique.
allElements = danglingNode.getElementsByTagName('id');
for (i = 0; i < allElements.length; ++i) {
...
}
allElements.length 返回 0,尽管我知道有许多元素确实包含 id 标签名称。
为了测试,我将 'id' 更改为 'input' 并且长度现在是准确的,这意味着树结构存在,但无法通过 'id' 访问它。我写了一个 DOM walker 函数,果然,树在那里并且加载了 id 标签名称。我得出的结论是,克隆产生的重复 id 名称使通过 id 进行检索变得不可能。Mozilla 开发者网站警告说,克隆会导致重复的 id,并建议修改这些重复项以再次实现唯一性,但没有提供实现它的方法。我认为一个简单的循环就足够了,但这显然不是真的。
我尝试创建一个片段( document.createDocumentFragment() )并在其下方附加 danglingNode 以查看是否可以通过“id”提供访问,但没有这样的运气。
最终,我决定使用前面提到的 DOM walker 来不仅遍历树,而且还使用新的 id 名称修复它。该功能如下:
function fixIds(element, prefix) {
"use strict";
// This is a recursive function, designed to walk the tree below "element"
// and modify all id values by prefixing the existing id with a fixed "prefix".
do {
// console.log('typeof = ' + typeof element.id)
if (typeof element.id === 'string' && element.id !== '') {
if (debug) {console.log(element.id + ' -> ' + prefix + element.id);}
element.id = prefix + element.id;
}
if (element.hasChildNodes()) {
fixIds(element.firstChild, prefix);
}
} while (element = element.nextSibling);
}
有没有人有另一种处理克隆结构来修改重复 ID 的方法?
谁能看出我所做的有什么问题?
我错过了什么明显的东西吗?