【问题标题】:Copying children elements of one division to another along with all associated events将一个部门的子元素以及所有相关事件复制到另一个部门
【发布时间】:2011-06-06 07:17:47
【问题描述】:

我正在尝试将某个 div 元素 parent 替换为另一个 newparent。我想只复制parent 的一些孩子并将它们放入newparent,然后将parent 替换为newparent。 这是我的代码的 sn-p:

var sb_button = parent.firstChild;
    var temp;
    while(sb_button) {
        console.log("loop: ");
        console.log(sb_button.id);
        temp = sb_button;
        if(sb_button.id != curr_button.id && sb_button.id != prev_button.id) {
            console.log("if");
            newparent.appendChild(temp);
            }
        else if(sb_button.id == curr_button.id) {
            console.log("elseif");
            newparent.appendChild(temp);
            newparent.appendChild(prev_button);
            }
        else {
            console.log("else");
            }
        sb_button.parentNode = parent;
        console.log(sb_button.id)
        console.log(sb_button.parentNode.children);
        sb_button = sb_button.nextSibling;
        }
    parent.parentNode.replaceChild(newparent,parent);

编辑:

所以当我执行newparent.appendChild(temp) 时,它会修改sb_button。解决方法是什么?

【问题讨论】:

  • 那么出了什么问题?你已经插入的所有日志记录了什么?

标签: javascript html appendchild


【解决方案1】:

我没有运行你的代码,但是有一些奇怪的事情,其中​​之一可能会导致问题或帮助清理代码,使问题更加明显。

  • 变量temp 似乎是sb_button 的别名:您可以删除变量声明并将所有引用替换为temp
  • sb_button 是任意子节点的混淆名称
  • 您在 if 语句中将sb_button 中的节点附加到newparent,但是在您尝试将sb_button_.parentNode 设置为parent 之后 - 那是not possible since parentNode is readonly,它肯定不会感觉 - 您不能将元素附加到一个元素但有不同的父元素。
  • 您是否尝试复制或移动节点?

编辑:鉴于您想要复制节点,我相信您正在寻找cloneNode:制作节点的副本并附加该副本,而不是原始节点。

作为一个简洁的设计,当事情变得复杂时,我会避免这种难以理解的 while 循环。相反,只需创建一个节点数组,按照您想要的方式对它们进行排序(您甚至可以使用sort 来做到这一点,以立即表明您只是在重新排列事物),然后创建一个采用newparent 的函数和数组并将所有元素的副本按数组顺序附加到newparent。您的示例并不那么复杂,但即使在这里,我也会更改 if 子句的顺序以在最后的 else 中使用“默认”情况。例如:

for(var child = parent.firstChild; child; child = child.nextSibling) 
    if(child.id == curr_button.id) { //insert prev_button after curr_button
        newparent.appendChild(child.cloneNode(true));
        newparent.appendChild(prev_button.cloneNode(true));
    } else if(child.id != prev_button.id) {
        newparent.appendChild(child.cloneNode(true));
    }
parent.parentNode.replaceChild(newparent, parent);

这个想法是让读者立即明白所有孩子都被处理一次。

【讨论】:

  • 假设我在 parent 中有 4 个兄弟姐妹,我想重新排序兄弟姐妹的排列方式。 (假设开始是 1 2 3 4 ,我想根据条件做 1 3 2 4 )。我已经更正了你提到的第三点。 .那么如何将sb_button 的确切行为复制到temp 并且现在对temp 的修改不应该影响sb_button
猜你喜欢
  • 1970-01-01
  • 2011-05-28
  • 2011-01-21
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 2021-09-03
  • 1970-01-01
相关资源
最近更新 更多