Fork me on GitHub
.net求学者

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!");
  }
});

 

委托详解

posted @ 2014-07-18 09:43  hy31337  阅读(592)  评论(0编辑  收藏  举报
.net求学者