动态添加元素后,发现元素绑定的事件不生效

问题描述

提示:这里描述项目中遇到的问题:
动态添加元素后,发现为listitem[index]元素绑定的事件不生效

 top2()
    function top2(){
    let str=''
    getAjaxRequst("uSelectCatalogid",null,function(res){
        res.data.map((item,index)=>{
          str+=   `
          <li class="topfont" id="textscorll"  >${item.author}</li>
        `
        })
        document.querySelector(".group_31").innerHTML = str;
     })}
    //激活切换
    var listitem=document.querySelectorAll(".group_31 > li");
    listitem.forEach((i,index)=>{
        listitem[index].addEventListener("click",function(e){
          listitem.forEach(item=>{
            item.classList.remove("active")
          })
          e.srcElement.classList.add("active")
        },false)
    })

原因分析:

当使用JavaScript动态向HTML中添加元素时,如果在添加元素之前绑定了事件监听器,这些监听器可能对新添加的元素不起作用。这是因为事件监听器是在页面加载时绑定的,而不会自动适应后来添加的元素。

解决这个问题的方法之一是使用事件委托(Event Delegation)。事件委托是将事件监听器绑定到父元素上,然后通过事件冒泡原理在父元素上捕获子元素的事件。这样就可以处理动态添加的元素。


解决步骤:

动态添加元素: 使用JavaScript的DOM操作或类库(如jQuery)向HTML中添加元素。

document.querySelector(".group_31").innerHTML = str;

事件委托: 将事件监听器绑定到静态的父元素(或更高层次的祖先),然后通过事件对象的属性判断触发事件的元素。target

document.querySelector(".group_31").addEventListener("click", function (e) {
  if (e.target.tagName === "LI") {
    // 处理事件逻辑
  }
});

元素选择器和querySelector:使用CSS选择器语法来选择元素,document.querySelector方法返回匹配选择器的第一个元素。

document.querySelector(".group_31 li");

forEach 方法: 遍历数组或类数组对象的每个元素,对每个元素执行提供的函数。

document.querySelectorAll(".group_31 li").forEach(item => {
  item.classList.remove("active");
});

完整代码

top2();

function top2() {
  let str = '';
  getAjaxRequst("uSelectCatalogid", null, function (res) {
    res.data.map((item, index) => {
      str += `<li id="textscorll">${item.author}</li>`;
    });
    document.querySelector(".group_31").innerHTML = str;
  });
}

//  将事件监听器绑定到静态的父元素(或更高层次的祖先),然后通过事件对象的属性判断触发事件的元素
document.querySelector(".group_31").addEventListener("click", function (e) {
  if (e.target.tagName === "LI") {
    document.querySelectorAll(".group_31 li").forEach(item => {
      item.classList.remove("active");
    });
    e.target.classList.add("active");
  }
});
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值