繁体   English   中英

使用带有 appendchild 的 javascript 从一个 div 添加到另一个 div(不工作)

[英]Adding from one div to another with javascript with appendchild(not working)

嘿,所以我正在尝试制作一个“网站”,您可以在其中添加和删除列表中的人员并添加到另一个列表中。 添加有效但删除无法正常工作。 如您所见, add 和 remove 子句彼此非常相似,唯一的区别是getElementById()的 id。

let names = [];
names[0] = "Daniel";
names[1] = "Anna";
names[2] = "Sarah";
names[3] = "Karl";
names[4] = "Tim";
names[5] = "Simon";
names[6] = "Klara";
names[7] = "David";
names[8] = "Hugo";

document.getElementById("add").addEventListener("click",add);

document.getElementById("remove").addEventListener("click",remove);

for(let i = 0; i < 9; i++){
    document.getElementById("participants").innerHTML += "<div class='normal' id='"+names[i]+"'>"+names[i]+"</div>";
}

for(let i = 0; i < 9; i++){
    document.getElementById(names[i]).addEventListener("click",chosen); 
}

function chosen(){
    let item = document.getElementById(this.id);
    if(item.classList.contains("chosen")){
        item.classList.remove("chosen");
    }else{
        item.classList.add("chosen");
    }
}

function add(){
    let arr = [];
    arr = document.getElementsByClassName("chosen");

    for(let i = 0; i < arr.length; i++){
        document.getElementById("members").appendChild(arr[i]);
    }
}

function remove(){
    let test = []; 
    test = document.getElementsByClassName("chosen");
    console.log(test);

    for(let i = 0; i < test.length; i++){
        document.getElementById("participants").appendChild(test[i]);
    }
}

如果您先添加项目,然后设置事件侦听器,监听click父元素,则可以有更好的方法。 根据目标,您将分派chosen函数。

您可以利用事件冒泡来做到这一点。 当您创建单独的for语句时,不能保证在 for 语句完成运行后元素会立即在 DOM 中。

var participants = document.getElementById('participants');

participants.onclick = function(event){
   var id = event.target.id;

   if(id){
      let item = document.getElementById(this.id);
       if(item.classList.contains("chosen")){
          item.classList.remove("chosen");
        }else{             
          item.classList.add("chosen");

       }
 //... the rest of your code
   }
}

看,您可以将 id 参数传递给所选函数,这样您就可以获得正确的元素。

这边走:

document.getElementById(names[i]).addEventListener("click",chosen)
.
.
.
function chosen() { 
        let item = document.getElementById(this.id);
        if(item.classList.contains("chosen"))
           item.classList.remove("chosen");
        else
           item.classList.add("chosen");
} 

document.getElementById(names[i]).addEventListener("click",chosen(names[i])
.
.
.
function chosen(chosenId) { 
    const item = document.getElementById(chosenId);
    item.classList.toggle("chosen")
} 

并尝试在这样的场景中始终使用const变量,这为您的代码提供了更多的可预测性

您在代码中有几个错误,在添加和删除项目后没有清理所选类,并非所有元素都被添加或删除。 下面解决这些问题。 我建议你重构它并使它更通用,如果你需要帮助 ping 我。

const names = ["Daniel", "Anna", "Sarah", "Karl", "Tim" ,"Simon", "Klara", "David"];

document.getElementById("add").addEventListener("click",add);

document.getElementById("remove").addEventListener("click",remove);



for(let i = 0; i < names.length; i++){
    document.getElementById("participants").innerHTML += "<div class='normal' id='"+names[i]+"'>"+names[i]+"</div>";

}
for(let i = 0; i < names.length; i++){

    document.getElementById(names[i]).addEventListener("click",chosen); 
}

function chosen(){
    let item = document.getElementById(this.id);

        if(item.classList.contains("chosen")){
            item.classList.remove("chosen");

        }else{
            item.classList.add("chosen");

        }

}

function add(){
    members = document.getElementById("members");
    Array.from(document.querySelectorAll(".chosen")).forEach((item)=> { 
        members.append(item)
        item.classList.remove("chosen");
    })  
}

function remove(){
    participants = document.getElementById("participants");
    Array.from(document.querySelectorAll(".chosen")).forEach((item)=> { 
        participants.append(item)
        item.classList.remove("chosen");
    })  
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM