gpt4 book ai didi

javascript - JS 循环的appendChild 产生奇怪的行为

转载 作者:行者123 更新时间:2023-12-02 20:14:11 27 4
gpt4 key购买 nike

我有这个功能:

//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循环生成的数组来将子节点(在本例中为链接)附加到兄弟节点。

然而,最终的循环并没有导致页面上有一堆额外的链接,而是附加子级,然后立即删除它,通过循环进行工作,直到生成允许保留它的最终元素链接。

我找不到对此行为或任何有类似问题的人的解释。

最佳答案

您不能将一个元素附加到 DOM 中的多个位置。每次循环时,您都需要附加 finalRender(及其后代)的单独副本:

elementsList[i].parentNode.firstChild.appendChild(finalRender.cloneNode(true));

请记住,不同的浏览器以不同的方式处理具有绑定(bind)事件的克隆元素:有些浏览器最终会得到与原始浏览器绑定(bind)相同事件的克隆,而其他浏览器则不会。

此外,这些循环非常简洁。中间的两个可以完全替换为:

elementList = idElements;
for (var i=0; i<classElements.length; ++i)
elementList = elementList.concat(classElements[i]);

或者,更好的是,直接在第一个循环中构造 elementList ,这样您就不会创建一堆以后实际上不会使用的数组,或者最好,只需执行以下操作在第一个循环中向右追加。

关于javascript - JS 循环的appendChild 产生奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6547338/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com