您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

JavaScript事件委托的技术原理

2025/10/19 6:45:12发布16次查看
如今的javascript技术界里最火热的一项技术应该是‘事件委托(event delegation)’了。使用事件委托技术能让你避免对特定的每个节点添加事件监听器;相反,事件监听器是被添加到它们的父元素上。事件监听器会分析从子元素冒泡上来的事件,找到是哪个子元素的事件。基本概念非常简单,但仍有很多人不理解事件委托的工作原理。这里我将要解释事件委托是如何工作的,并提供几个纯javascript的基本事件委托的例子。
假定我们有一个ul元素,它有几个子元素:
<ul id="parent-list"> <li id="post-1">item 1</li> <li id="post-2">item 2</li> <li id="post-3">item 3</li> <li id="post-4">item 4</li> <li id="post-5">item 5</li> <li id="post-6">item 6</li></ul>
我们还假设,当每个子元素被点击时,将会有各自不同的事件发生。你可以给每个独立的li元素添加事件监听器,但有时这些li元素可能会被删除,可能会有新增,监听它们的新增或删除事件将会是一场噩梦,尤其是当你的监听事件的代码放在应用的另一个地方时。但是,如果你将监听器安放到它们的父元素上呢?你如何能知道是那个子元素被点击了?
简单:当子元素的事件冒泡到父ul元素时,你可以检查事件对象的target属性,捕获真正被点击的节点元素的引用。下面是一段很简单的javascript代码,演示了事件委托的过程:
// 找到父元素,添加监听器...document.getelementbyid("parent-list").addeventlistener("click",function(e) { // e.target是被点击的元素! // 如果被点击的是li元素 if(e.target && e.target.nodename == "li") { // 找到目标,输出id! console.log("list item ",e.target.id.replace("post-")," was clicked!"); }});
第一步是给父元素添加事件监听器。当有事件触发监听器时,检查事件的来源,排除非li子元素事件。如果是一个li元素,我们就找到了目标!如果不是一个li元素,事件将被忽略。这个例子非常简单,ul和li是标准的父子搭配。让我们试验一些差异比较大的元素搭配。假设我们有一个父元素p,里面有很多子元素,但我们关心的是里面的一个带有”classa” css类的a标记:
// 获得父元素p, 添加监听器...document.getelementbyid("myp").addeventlistener("click",function(e) { // e.target是被点击的元素 if(e.target && e.target.nodename == "a") { // 获得css类名 var classes = e.target.classname.split(" "); // 搜索匹配! if(classes) { // for every css class the element has... for(var x = 0; x < classes.length; x++) { // if it has the css class we want... if(classes[x] == "classa") { // bingo! console.log("anchor element clicked!"); // now do something here.... } } } }});
上面这个例子中不仅比较了标签名,而且比较了css类名。虽然稍微复杂了一点,但还是很具代表性的。比如,如果某个a标记里有一个span标记,则这个span将会成为target元素。这个时候,我们需要上溯dom树结构,找到里面是否有一个 a.classa 的元素。
因为大部分程序员都会使用jquery等工具库来处理dom元素和事件,我建议大家都使用里面的事件委托方法,因为这里工具库里都提供了高级的委托方法和元素甄别方法。
希望这篇文章能帮助你理解javascript事件委托的幕后原理,希望你也感受到了事件委托的强大用处!
(英文:davidwalsh.)
推荐教程:《javascript基础教程》
以上就是javascript事件委托的技术原理的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product