我有这个功能:
//add links to called classes
function addLinks () {
var classElements = [];
var idElements = [];
var finalRender;
var expand = document.createTextNode("+");
var contract = document.createTextNode("-");
var elementsList = [];
var count = 0;
//create the dom nodes
renderPElements = document.createElement ("p");
renderAElements = document.createElement ("a");
renderAElements.setAttribute("href", "#");
renderAElements.setAttribute("class", "expander");
renderAElements.appendChild(expand);
finalRender = renderPElements.appendChild(renderAElements);
//get arrays of elements with class or id set to provided string
for (var i = 0; i< show_hide_class_selectors.length; i++) {
classElements[i] = document.getElementsByClassName(show_hide_class_selectors[i]);
//if prevents null value appearing in array and freezing script
if (document.getElementById(show_hide_class_selectors[i])) {
idElements[i] = document.getElementById (show_hide_class_selectors[i]);
}
}
//loop though selected id's / classes and generate a single array of selected elements
for (var i = 0; i< idElements.length; i++) {
elementsList[count] = idElements[i];
count = count +1;
}
//must loop twice as variable is 2 dimensional i=class name y=elements of that class
for (var i = 0; i< classElements.length; i++) {
for (var y = 0; y< classElements[i].length; y++) {
elementsList[count] = classElements[i][y];
count = count +1;
}
}
//render
for (var i = 0; i< elementsList.length; i++) {
alert ("render");
elementsList[i].parentNode.firstChild.appendChild(finalRender);
alert (elementsList[i]);
}
}
这意味着将一个类/ ID数组作为全局变量提供,并生成一个包含所有请求元素的数组。然后,它应该通过使用appendchild循环生成的数组,将子节点(在这种情况下为链接)附加到兄弟节点。
然而,不是导致页面上有一堆额外链接,而是最后一个循环会附加子进程然后立即将其删除,继续循环,直到最后一个元素被允许保留它的生成链接。
我找不到这种行为或任何有类似问题的人的解释。
答案 0 :(得分:2)
您不能将元素附加到DOM中的多个位置。每次循环时,您需要附加一个单独的副本 finalRender
(和后代):
elementsList[i].parentNode.firstChild.appendChild(finalRender.cloneNode(true));
请记住,不同的浏览器会以不同的方式处理带有绑定事件的克隆元素:有些浏览器最终会使克隆具有与原始事件绑定的相同事件,其他浏览器则不会。
此外,为简洁起见,这些循环正在尖叫。中间两个可以完全替换为:
elementList = idElements;
for (var i=0; i<classElements.length; ++i)
elementList = elementList.concat(classElements[i]);
或者,更好的是,只需在第一个循环中直接构造elementList
,这样就不会制作一堆以后实际上没有使用的数组,甚至是最好的,只需要在第一个循环。