[英]Event Delegation / Attaching events to dynamically created elements using Vanilla JavaScript
[英]Attaching Event handlers to dynamically created elements with a class using plain JavaScript
我构建了一个将事件处理程序附加到类的函数。 它与页面加载期间DOM中已经存在的元素配合使用很好,但是在页面加载后动态添加到DOM的元素上静默失败。 我感谢任何建议。 下面的代码是我正在开发的名为launchjs https://github.com/bytewarestudios/launchjs的JavaScript库的一部分。 建议的其他解决方案仅指向我已经知道如何使用的JQuery代码,并且需要没有JQuery的JavaScript解决方案。
我相信有一种解决方案与我在动态绑定元素上进行事件绑定时所需要的解决方案接近吗? 由Ram swaroop提供,但我不认为这是我将事件附加到动态创建的元素时遇到的根本问题,它不能像本页上可接受的答案那样详尽地解释它。
代码的最终结果应允许用户使用以下代码结构将事件附加到具有类的元素上。
l(".className").on("click",function(event){
//do something here
});
JavaScript:
/*
The type parameter passed in to this function is "click" and the
selector variable value equals .view
Note: the isClass function returns true if the selector value is prefixed
with a .
*/
this.on = function(type,fn){//begin on function
//store the events
var events = ["click","mouseover","mouseout","submit","dblclick"];
//if the event array contains the event and the selector is not a class
if(events.indexOf(type) !== -1 && !isClass()){//begin if then
//add the event listenter to the document
document.addEventListener(type,function(event){//begin function
/*
if the event listener target id equals the selector id passed to the launch
function and the selectors doesn't contain the . prefix or class prefix.
*/
if(event.target.id === selector){//begin if then
//call the function passed in as a parameter, pass the event so it can be used.
fn(event);
}//end if then
});//end function
}//end if then
//if the event array contains the event and the selector is a class
if(events.indexOf(type) !== -1 && isClass()){//begin if then
//store the collection of classes
var classes = document.getElementsByClassName(selector.split(".")[1]);
//loop through the classes and add the event listeners
for(var i = 0; i < classes.length; i++){
classes[i].addEventListener(type,function(event){//begin addEventListener function
//add functionality for classes
if(event.target.className === selector.split(".")[1] && isClass()){//begin if then
//call the function passed in as a parameter,pass the event so it can be used.
fn(event);
}//end if then
});//end addEventListener function
}//end for loop
}//end if then
};//end on function
您要么在每次添加新元素时都需要运行此代码,同时确保您没有将事件侦听器两次附加到旧元素,或者可以使用委托事件的技术,例如jQuery中的.on() 。 。
简而言之,您将事件侦听器附加到全局容器,然后检查单击的元素是否有指定的类。 这是有关此概念的文章: 没有jQuery的DOM事件委托
还有一个由同一个人针对特定情况编写的库: https : //github.com/ftlabs/ftdomdelegate
请看我关于这个概念的简短例子:
var area = document.getElementsByClassName('clickable-area')[0]; area.onclick = function(e) { if (e.target.className === 'add-children') { var button = document.createElement('button'); button.className = 'child-button'; button.innerText = 'Child button'; area.appendChild(button); } else if (e.target.className === 'child-button') { e.target.innerText = 'Dynamically added child is clicked'; } }
html, body { width: 100%; height: 100%; padding: 0; margin: 0; } .clickable-area { display: block; cursor: pointer; background: #eee; width: 100%; height: 100%; }
<div class="clickable-area"> <button class="add-children">Add children</button> </div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.