简体   繁体   English

Javascript-Click事件不适用于动态添加的元素

[英]Javascript - Click event dosen't work on dynamically added elements

How can I run an event on dynamically added elements, because my click event doesn't work on new elements. 如何在动态添加的元素上运行事件,因为click事件不适用于新元素。

I found some answer in here but all about jQuery so I'm coding with vanilla javascript. 我在这里找到了一些答案,但都是关于jQuery因此我正在使用香草javascript进行编码。 So do you have any advice ? 那么您有什么建议吗?

  document.querySelectorAll('.galeri-cart').forEach(function (cart) {
      cart.addEventListener('click', function () {
       // something awesome happening in here    
    })
  });

creating element codes; 创建元素代码;

success: function () {
let imageData = JSON.parse(this.files[i].xhr.response);
let img = document.createElement('img');
 img.setAttribute('src', imageData.url);
 img.setAttribute('data-id',imageData.id);
 img.setAttribute('alt', imageData.alt);
 let subDiv = document.createElement('div');
 subDiv.className = "galeri-cart";
 subDiv.appendChild(img);
 let midDiv = document.createElement('div');
 midDiv.className = "col-md-4";
 midDiv.appendChild(subDiv);
 let div = document.querySelector('.row');
 div.insertBefore(midDiv, div.childNodes[0]);
 i++
}

Since you are adding the elements to the DOM manually, you can simply attach the event listener after you create the element and before you append it to the DOM, like so: 由于您是手动将元素添加到DOM,因此您可以在创建元素之后,将元素附加到DOM之前简单地附加事件侦听器,如下所示:

function galeriClickHandler () {
  // something awesome happening in here
}

success: function () {
let imageData = JSON.parse(this.files[i].xhr.response);
let img = document.createElement('img');
 img.setAttribute('src', imageData.url);
 img.setAttribute('data-id',imageData.id);
 img.setAttribute('alt', imageData.alt);
 let subDiv = document.createElement('div');
 subDiv.className = "galeri-cart";
 // add event listener here
 subDiv.addEventListener('click', galeriClickHandler);
 subDiv.appendChild(img);
 let midDiv = document.createElement('div');
 midDiv.className = "col-md-4";
 midDiv.appendChild(subDiv);
 let div = document.querySelector('.row');
 div.insertBefore(midDiv, div.childNodes[0]);
 i++
}

Alternatively, you can use event delegation on the static parent element and listen for clicks on specific children, like so: 另外,您可以在静态父元素上使用事件委托 ,并监听特定子元素的点击,如下所示:

function galeriClickHandler () {
  // something awesome happening in here
}

// Get the parent DIV, add click listener...
document.querySelector(".row").addEventListener("click",function(e) {
    // e.target was the clicked element
  if (e.target && e.target.matches(".galeri-cart")) {
    galeriClickHandler();
  }
});

Since you didn't give any info on how you're adding the elements, the only direct code solution to give would be one that delegates the event handling to some container element. 由于您没有提供有关如何添加元素的任何信息,因此唯一可以提供的直接代码解决方案是将事件处理委托给某个容器元素。

 var par = document.querySelector("#parent"); var button = document.querySelector("button"); button.addEventListener("click", function() { par.insertAdjacentHTML("beforeend", `<p class=galeri-cart>cart ${getCarts().length+1}</p>`) }); par.addEventListener('click', function(event) { var cart = event.target.closest(".galeri-cart") if (cart) cart.textContent += " clicked!" }); function getCarts() { return par.querySelectorAll(".galeri-cart"); } 
 <button>Add Cart</button> <div id=parent> <p class=galeri-cart>cart 1</p> <p class=galeri-cart>cart 2</p> <p class=galeri-cart>cart 3</p> </div> 


You added your code. 您添加了代码。 You're already adding attributes and properties to the element, so you just do what you're already doing... bind the handler. 您已经在元素中添加了属性,所以您只需执行已完成的操作即可……绑定处理程序。

Here's a rewrite that makes your code much more concise and readable. 这是一个重写,使您的代码更加简洁和易读。

First, create the event handler. 首先,创建事件处理程序。

function clickHandler() {
   // your handler code
}

Then create the element and bind the handler to it. 然后创建元素并将处理程序绑定到该元素。

success: function() {
  let imageData = JSON.parse(this.files[i].xhr.response);
  let div = document.querySelector('.row');

  div.insertAdjacentHTML("afterbegin", `
<div class="col-md-4">
  <div class="galeri=cart">
    <img src="${imageData.url}" data-id="${imageData.id}" alt="${imageData.alt}">
  </div>
</div>`);

  div.firstElementChild
     .firstElementChild
     .addEventListener("click", clickHandler);

  i++;
}

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

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