zoukankan      html  css  js  c++  java
  • 事件绑定和事件委托区别

    事件绑定:顾名思义就是给页面上的元素绑定事件(处理程序),分为动态绑定和静态绑定。

    静态绑定,也是最直接的事件绑定【通过事件属性,直接显示的给元素绑定事件,例如

    <div onlick="myfunc()" onmouseover="myfunc2()" >
    <script>
      function myfunc(){}
      function myfunc2(){}
    </script>
    、、、、、、、
    该方式缺点:当页面多元素都要添加事件时,定义繁琐。函数名称定义改变,一次要修改两个地方。

    动态绑定:

    <div id="mydiv">
    <script>
      var funcname1 = function(){}
      mydiv.onclick = funcname1 //直接对dom元素的onclick属性赋值函数
      mydiv.onclick = null //移除绑定事件
      
      《通过事件监听方式》
      mydiv.addEventListener('click',funcname1); //注意这里除了直接传递一个函数,还可以传递一个callback除了传递一个函数之外,还可以传递一个属性带有 HandleEvent 方法【名字必须是 HandleEvent】的对象obj,
                                 系统会自动去调用这个HandleEvent 方法!!!
      mydiv.removeEventListener('click', callback)
      《移除事件监听》
    </script>

    关于事件监听的适配:因为IE 有自己的事件监听 【attachEvent()detachEvent() 分别用于事件监听
         oBtn.attachEvent('onclick',funcname1); //IE 添加 监听
         oBtn.detachEvent('onclick',funcname1); ////IE 移除 监听
     
      所以添加监听之前可以先判断一下 dom元素是否存在属性 attachEvent ,有就走 使用 attachEvent()添加监听逻辑,没有就 addEventListener() 

     事件委托:顾名思义就是事件的处理不自己躬行,委托给他人帮忙处理。

     要了解实现委托,就必须先了解事件捕获和事件冒泡,别人网上有很多总结 【https://www.jianshu.com/p/c88c15c6074c,可以看看这篇,图文并茂,比较好理解】

    事件委托应用场景: 如果一类元素数量多且都需要加上js事件时,通过循环一个一个的为每个元素单独添加js事件显然造成内存的浪费。这样的场景就适合用事件委托。

    事件委托本质时事件冒泡的应用。

    大致流程:为父元素添加事件,点击子元素是由于事件冒泡,添加的会传递的会向上传递到父元素,父元素捕获到事件就进行 源头判断【 ev.target 】

    在进行相应处理就好了。

    ex:

    <ul id="parent">
        <li>c1</li>
        <li>c2</li>
        <li>c3</li>
    </ul>
    
    <script>
    (function(){
       
        parent.addEventListener('click',func); //id属性 可以直接拿来用 
        function func(e){
            e = e || window.event;
            var src = e.target;
            if(src && src.nodeName.toLowerCase() === 'li'){ //判断事件发起的源头
                alert(src.innerHTML);
            }
        }
    })();
    </script>

    事件委托优点:

    减少冗余重复代码的书写,对于同一个父节点下面类似的子元素,可以通过委托给父元素的监听函数来处理每个子节点的事件。

    不会因为元素的变动而改变事件的绑定

    对dom元素的引用少了,有效避免内存泄露问题。

  • 相关阅读:
    PureBasic 打开一个一行有多个数据的文件并读取其中某个数据
    正则表达式的30分钟教程
    【编程珠玑】读书笔记 第一章 开篇
    while ((ch = getchar()) != EOF)中ch定义为char还是int型?cin、scanf等如何结束键盘输入
    itoa函数的实现(不同进制)
    atoi函数的实现(考虑不同进制、溢出)
    函数重载二义性:error C2668: 'pow' : ambiguous call to overloaded function
    strcat与strncat的C/C++实现
    strcpy函数的C/C++实现
    strlen的C/C+++实现
  • 原文地址:https://www.cnblogs.com/Hijacku/p/14786129.html
Copyright © 2011-2022 走看看