js事件代理理解

说到事件代理,首先得知道js的事件冒泡机制。

事件冒泡是指在一个dom节点触发一个事件比如onclick事件以后,这个事件会继续往节点的父节点传递,若父节点也绑定了onclick事件,则同样会触发父节点的onclick事件,然后继续往父节点的父节点传递....由内层往外层传递。

事件代理就是利用了事件冒泡机制,将一个节点的事件处理,交给它的父级去处理。举个栗子:若为多个li标签绑定事件。

1.一般的事件绑定方法:

1 <ul id="list">
2         <li>1</li>
3         <li>2</li>
4         <li>3</li>
5         <li>4</li>
6         <li>5</li>
7     </ul>
1 <script>
2         var list=document.getElementById(‘list‘);
3         var lis=list.getElementsByTagName(‘li‘);
4         for(var i=0;i<5;i++){
5             lis[i].addEventListener(‘click‘,function(){
6                 alert(‘li click‘);
7             })
8         }
9 </script>

2.使用事件代理

1 <script>
2     var list=document.getElementById(‘list‘);
3     // 让li的父节点绑定click事件,然后在内部判断事件触发的目标是否是li标签,如果是的话,执行相应操作,这样能达到直接绑定li标签同样的效果,且只用绑定一次
4     list.addEventListener(‘click‘,function(e){  //
5         if(e.target.nodeName===‘LI‘){
6             alert(‘li click‘);
7         }
8     })
9 </script>

从以上可以看出在使用事件代理可以减少dom操作,优化性能。使用代理还有一个好处就是:

例如在给动态加载的img图片绑定事件时,使用代理就不用每次给新增的标签绑定事件。例如:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>事件代理</title>
 6 </head>
 7 <body>
 8     <div id="box">
 9         <img src="" alt="1">
10         <img src="" alt="2">
11         <img src="" alt="3">
12         <img src="" alt="4">
13         <img src="" alt="5">
14         <!-- 下面还有很多需要动态加载的图片 -->
15     </div>
16     <button id="addImg">添加图片</button>
17     <script>
18         var box=document.getElementById(‘box‘);
19         var i=5;
20         var btn=document.getElementById(‘addImg‘);
21         btn.addEventListener(‘click‘,function(){
22             var img=document.createElement(‘img‘);
23             i++;
24             img.alt=i;
25             box.appendChild(img);
26         })
27         // 使用事件代理
28         box.addEventListener(‘click‘,function(e){
29             if(e.target.nodeName===‘IMG‘){
30                 alert(‘img click‘);
31             }
32         });
33         //不使用事件代理时,新增的图片没有事件绑定,需要重新绑定才行
34         /*var imgs=box.getElementsByTagName(‘img‘);
35         for(var j=0;j<i;j++){
36             imgs[j].addEventListener(‘click‘,function(){
37                 alert(‘img click‘);
38             })
39         }*/
40     </script>
41 </body>
42 </html>

3.写一个通用的事件绑定函数,既可以使用代理,也可以不使用代理

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件</title>
</head>
<body>
    <div id="div1">
        <a href="http://imooc.com" id="link1">imooc.com</a>
        <a href="http://imooc.com" id="link2">imooc.com</a>
        <a href="http://imooc.com" id="link3">imooc.com</a>
        <a href="http://imooc.com" id="link4">imooc.com</a>
        <a href="http://imooc.com" id="link5">imooc.com</a>
        <a href="http://imooc.com" id="link6">imooc.com</a>
        <p id="p1">this is p1</p>
        <p id="p2">this is p2</p>
    </div>
    <hr>
    <div id="div2">
        <p id="p3">this is p3</p>
        <p id="p4">this is p4</p>
    </div>
    <script>
        //简单的事件绑定函数
        var link1=document.getElementById(‘link1‘);
        // function on(ele,type,fn){
        //     ele.addEventListener(type,fn);
        // }
        // on(link1,‘click‘,function(e){
        //     e.preventDefault();
        //     alert(‘clicked‘);
        // })

        //事件代理
        var div1=document.getElementById(‘div1‘);
        // div1.addEventListener(‘click‘,function(e){
        //     e.preventDefault();
        //     if(e.target.nodeName===‘A‘){
        //         alert(‘clicked‘);
        //     }
        // })

        //完整的绑定事件函数
        function bindEvent(ele,type,selector,fn){
            if(fn==null){
                fn=selector;
                selector=null;
            }
            var target;
            ele.addEventListener(type,function(e){
                if(selector){
                    //事件代理
                    target=e.target;
                    //element.matches(selector),返回true或false
                    if(target.matches(selector)){
                        fn.call(target,e);
                    }
                }else{
                    //非事件代理
                    fn(e);
                }
            });
        }
        bindEvent(div1,‘click‘,‘a‘,function(e){
            e.preventDefault();
            alert(this.innerHTML);
        });
        var p1=document.getElementById(‘p1‘);
        bindEvent(p1,‘click‘,function(e){
            alert(p1.innerHTML);
        });
    </script>
</body>
</html>

原文地址:https://www.cnblogs.com/cherryshuang/p/8544780.html

时间: 2024-08-29 07:55:54

js事件代理理解的相关文章

js事件代理(事件委托)最简单的理解

1事件代理:当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委托给父节点来触发处理函数. 例如:点击按钮删除对应的条目. 如果给每一个按钮添加事件,极为繁琐,这时候需要用到事件代理. 事件代理是基于浏览器的事件冒泡机制. 下面是对应的代码: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <

js事件代理

事件代理: html代码: <ul id="ul1"> <li><a>目标1</a></li> <li><a>目标2</a></li> </ul> js代码: var ul1=document.getElementById("ul1");ul2.addEventListener('click',function(e){ var e=e||windo

js事件代理(委托)

JavaScript事件代理(委托)一般用于以下情况: 1. 事件注册在祖先级元素上,代理其子级元素.可以减少事件注册数量,节约内存开销,提高性能. 2. 对js动态添加的子元素可自动绑定事件. 之前一直用各种js库的事件代理,如 jQuery,非常方便实用.今天尝试用原生 js 实现该功能. 1 var addEvent = (function () { 2 if (document.addEventListener) { 3 return function (element, type, h

封装Js事件代理方法

// 封装事件代理 function delegateEvent(element, tag, event, listener) { // 判断是否支持addEventlistener if(element.addEventListener){ // 给父元素添加事件 element.addEventListener(event,function(e){ // 获取当前触发的元素 var target = e.target; // 判断当前元素是否是我需要的 if(target.nodeName.

Js - 事件代理

事件代理是利用了事件冒泡,制定一个事件处理程序,就可以管理某一类的所有事件.例如,click事件会一直冒泡到document层次(就是不断地向父元素传递至最上层的document).就是说可以为整个页面指定一个onclick事件处理程序,而不必单个元素分别添加处理程序. <ul id="ul1"> <li >item1</li> <li >item2</li> <li >item3</li> </

简述:js事件代理的7种方法

以为buttton元素绑定单击事件,来探讨事件绑定的几种方式: 1.最原始的方法:在button元素里面添加onclick事件,代码如下: <button onclick=function(){}></button> 这种方法虽然使用简单,但是有一个缺点就是:页面显示和事件处理混在一起,不符合网页开发设计的理念. 2.事件监听(addEventListener) 获取button元素,绑定事件监听 .addEventListener('click',fn,[true/false])

事件代理 event delegation

JS - 事件代理 如果你想给网页添加点JavaScript的交互性,也许你已经听过JavaScript的事件代理(event delegation),并且觉得这是那些发烧友级别的JavaScript程序员才会关心的什么费解的设计模式之一.事实上,如果你已经知道怎么添加JavaScript的事件处理器(event handler),实现事件代理也是件轻而易举的事情. JavaScript事件是所有网页互动性的根基(我指的是真正的互动性,而不仅是那些CSS下拉菜单).在传统的事件处理中,你按照需要

理解js事件冒泡事件委托事件捕获

js事件冒泡 javascript的事件传播过程中,当事件在一个元素上出发之后,事件会逐级传播给先辈元素,直到document为止,有的浏览器可能到window为止,这就是事件冒泡现象. <div id="col">    <p>        <a id="btn" href="#">button</a>    </p></div> <script> let b

Atitit. &#160;Js 冒泡事件阻止&#160;事件捕获&#160;&#160;&#160;事件传递 &#160;事件代理

Atitit.  Js 冒泡事件阻止 事件捕获   事件传递  事件代理   1. 事件冒泡1 2. 事件捕获1 3. 同时支持了事件捕获阶段和事件冒泡阶段ddEventListener的第三个参数1 4. 事件代理3 5. 冒泡还是捕获?3 6. Js 冒泡事件阻止3 6.1. 返回false5 7. 事件冒泡 使处理函数有范围较大的触发面积,在“拖拽效果”脚本中是必须的5 8. refe6 8.1.1. 浅谈事件冒泡与事件捕获 - ac黄博客精选 - SegmentFault6   1. 事