zoukankan      html  css  js  c++  java
  • Javascript添加事件的addEventListener()及attachEvent()区别分析,事件委托

    Mozilla中:

    addEventListener的使用方式:

    target.addEventListener(type, listener, useCapture);

    target: 文档节点、document、window 或 XMLHttpRequest。
    type: 字符串,事件名称,不含“on”,比如“click”、“mouseover”、“keydown”等。
    listener :实现了 EventListener 接口或者是 JavaScript 中的函数。
    useCapture :是否使用捕捉,一般用 false 。例如:document.getElementById("testText").addEventListener("keydown", function (event) { alert(event.keyCode); }, false);

    IE中:

    target.attachEvent(type, listener);
    target: 文档节点、document、window 或 XMLHttpRequest。
    type: 字符串,事件名称,含“on”,比如“onclick”、“onmouseover”、“onkeydown”等。
    listener :实现了 EventListener 接口或者是 JavaScript 中的函数。 例如:document.getElementById("txt").attachEvent("onclick",function(event) {alert(event.keyCode);});

    W3C 及 IE 同时支持移除指定的事件, 用途是移除设定的事件, 格式分别如下:

    W3C格式:

    removeEventListener(event,function,capture/bubble);

    Windows IE的格式如下:

    detachEvent(event,function);


    target.addEventListener(type, listener, useCapture);
    target 文档节点、document、window 或 XMLHttpRequest。
    type 字符串,事件名称,不含“on”,比如“click”、“mouseover”、“keydown”等。
    listener 实现了 EventListener 接口或者是 JavaScript 中的函数。
    useCapture 是否使用捕捉,看了后面的事件流一节后就明白了,一般用 false
    事件触发时,会将一个 Event 对象传递给事件处理程序,比如:
    document.getElementById("testText").addEventListener("keydown", function (event) { alert(event.keyCode); }, false);
    适应的浏览器版本不同,同时在使用的过程中要注意
    attachEvent方法 按钮onclick IE中使用
    addEventListener方法 按钮click fox中使用
    两者使用的原理:可对执行的优先级不一样,下面实例讲解如下:
    attachEvent方法,为某一事件附加其它的处理事件。(不支持Mozilla系列)
    addEventListener方法 用于 Mozilla系列
    举例: document.getElementById("btn").onclick = method1;
    document.getElementById("btn").onclick = method2;
    document.getElementById("btn").onclick = method3;如果这样写,那么将会只有medhot3被执行
    写成这样:
    var btn1Obj = document.getElementById("btn1"); //object.attachEvent(event,function);
    btn1Obj.attachEvent("onclick",method1);
    btn1Obj.attachEvent("onclick",method2);
    btn1Obj.attachEvent("onclick",method3);执行顺序为method3->method2->method1
    如果是Mozilla系列,并不支持该方法,需要用到addEventListener var btn1Obj = document.getElementById("btn1");
    //element.addEventListener(type,listener,useCapture);
    btn1Obj.addEventListener("click",method1,false);
    btn1Obj.addEventListener("click",method2,false);
    btn1Obj.addEventListener("click",method3,false);执行顺序为method1->method2->method3

     ex.on = function (el, ev, fn) {
            if (el.attachEvent) {
                el.attachEvent("on" + ev, function () {
                    fn.apply(el, arguments)
                });
            } else {
                el.addEventListener(ev, fn, false)
            }
        };

    委托

    jquery live()函数原理及实现

    <script type="text/javascript">  
                function live(targetObject, type, fn){    //元素类型,事件类型,执行函数  
                    document.onclick = function(event){  
                        var e = event ? event : window.event;  
                        addRow();  
                        alert(1);  
                        //解决浏览器兼容的问题,e.srcElement IE,e.target FF  
                        var target = e.srcElement || e.target;                    
                        if(e.type == type && target.tagName.toLocaleLowerCase() == targetObject){  
                            alert(3);  
                            fn();    //如果元素类型和事件类型同时匹配,则执行函数  
                        }  
                    }  
                }  
                function addRow(){  
                    var x=document.getElementById("tb").insertRow(0);  
                    var y=x.insertCell(0);  
                    var z=x.insertCell(1);  
                    y.innerHTML="NEW CELL1";  
                    z.innerHTML="NEW CELL2";  
                }  
                  
                //实例:将所有的td(包括后续js添加的)绑定click事件  
                live("td", "click", function(){  
                    alert("live");  
                });  
            </script>  
    // 获取父节点,并为它添加一个click事件
    document.getElementById("parent-list").addEventListener("click",function(e) {
      // 检查事件源e.targe是否为Li
      if(e.target && e.target.nodeName.toUpperCase == "LI") {
        // 真正的处理过程在这里
        console.log("List item ",e.target.id.replace("post-")," was clicked!");
      }
    });

    委托详解

  • 相关阅读:
    为什么我们从Yarn切换到pnpm
    🔑 最佳密码长度是多少?
    vue + ArcGIS 地图应用系列二:加载地图
    vue + ArcGIS 地图应用系列一:arcgis api本地部署(开发环境)
    玩转 GitHub 的几个小技巧
    在 Array.some 中正确使用 async
    如何正确的在 Array.map 使用 async
    一道关于JavaScript 代码执行顺序的面试题解析
    Git 常用命令及应用这一篇就够了(新手向)
    VUE 子组件向父组件传值 , 并且触发父组件方法(函数)
  • 原文地址:https://www.cnblogs.com/elves/p/3852754.html
Copyright © 2011-2022 走看看