关于 addEventListener 和 handleEvent 方法

使用 addEventListener 可以绑定事件,并传入回调函数。

Mozilla 0.9.1 和 Netscape 6.1 之后的版本不但支持传递函数引用,也都允许直接把拥有 handleEvent 方法的对象作为 addEventListener 方法的第二参数。

这在 DOM Level 2 的接口定义中也已经做了说明:

http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventListener

利用这个特性可以把任意对象注册为事件处理程序,只要它拥有 handleEvent 方法。

var o = {
    handleEvent : function () {
        alert(‘handleEvent executed‘);
    }
};
element.addEventListener(‘click‘, o, false);

当定义对象封装的时候,可以直接将 this 指针传入:

var o = {
    bind : function () {
        element.addEventListener(‘click‘, this, false);
    },
    handleEvent : function () {
        alert(‘handleEvent executed‘);
    }
};

IE9 是 IE 家族中第一个支持 addEventListener + handleEvent 的浏览器,IE9 之前的版本连 addEventListener 也没能支持。需要通过属性探测解决兼容问题:

function on(el, ev, fn, bubble) {
    if(el.addEventListener) {
        try {
            el.addEventListener(ev, fn, bubble);
        }
        // 黑莓等系统不支持 handleEvent 方法
        catch(e) {
            if(typeof fn == ‘object‘ && fn.handleEvent) {
                el.addEventListener(ev, function(e){
                    //以第一参数为事件对象
                    fn.handleEvent.call(fn, e);
                }, bubble);
            } else {
                throw e;
            }
        }
    } else if(el.attachEvent) {
        // 检测参数是否拥有 handleEvent 方法
        if(typeof fn == ‘object‘ && fn.handleEvent) {
            el.attachEvent(‘on‘ + ev, function(){
                fn.handleEvent.call(fn);
            });
        } else {
            el.attachEvent(‘on‘ + ev, fn);
        }
    }
}

完。

参考资料:

http://www.thecssninja.com/javascript/handleevent

http://topic.csdn.net/t/20040628/14/3128262.html

时间: 2024-10-12 21:09:25

关于 addEventListener 和 handleEvent 方法的相关文章

[转]addEventListener() 方法,事件监听

转载  白杨-M  http://www.cnblogs.com/baiyangyuanzi/p/6627401.html addEventListener() 方法,事件监听 你可以使用 removeEventListener() 方法来移除事件的监听. 语法 element.addEventListener(event, function, useCapture); 第一个参数是事件的类型 (如 "click" 或 "mousedown"). 第二个参数是事件触

对象里的handleEvent

最近看swipe.js源码看到handleEvent这个属性.查了一下资料才知道: 使用 addEventListener 可以绑定事件,并传入回调函数. Mozilla 0.9.1 和 Netscape 6.1 之后的版本不但支持传递函数引用,也都允许直接把拥有 handleEvent 方法的对象作为 addEventListener 方法的第二参数. 看例子1, 最简单的实现方式 html <div id="box" style="background:#ccc;w

addEventListener 的事件函数的传递【转载】

addEventListener 参数如下: addEventListener(type, listener[, useCapture]); type,事件名称 listener,事件处理器 useCapture,是否捕获 一直把 listener 记成是响应函数,function 类型.相信很多人也是这么理解的.多数时候是这么使用 elem.addEventListener('click', function(ev) { // todo }, false); 第一个参数没什么异议,第二个参数传

addEventListener之listener

addEventListener() 方法是将指定的事件监听器注册到目标对象上,当该对象触发指定的事件时,指定的回调函数就会被执行.语法: element.addEventListener(type, listener[, useCapture]); 其中listener:当指定的事件类型发生时被通知到的一个对象.该参数必须是实现EventListener接口的一个对象或函数.即,第二个参数除了可以传入函数外,还可以传入对象. 那么实现EventListener接口的对象有什么特征呢? inte

addEventListener的第二个参数——listener

addEventListener() 方法是将指定的事件监听器注册到目标对象上,当该对象触发指定的事件时,指定的回调函数就会被执行.语法: element.addEventListener(type, listener[, useCapture]); 其中listener:当指定的事件类型发生时被通知到的一个对象.该参数必是实现EventListener接口的一个对象或函数. 即,第二个参数除了可以传入函数外,还可以传入对象. 那么实现EventListener接口的对象有什么特征呢? // 注

addEventListener 的另类写法

addEventListener 参数如下 addEventListener(type, listener[, useCapture]); type,事件名称 listener,事件处理器 useCapture,是否捕获 一直把 listener 记成是响应函数,function 类型.相信很多人也是这么理解的.多数时候是这么使用 elem.addEventListener('click', function(ev) { // todo }, false); 第一个参数没什么异议,第二个参数传一

EventListener中的handleEvent

在研究代码时发现类似这样一段代码: 1 function TEST() {} 2 3 TEST.prototype = { 4 init:function() { 5 window.addEventListener('mousedown',this); 6 }, 7 handleEvent:function(e) { 8 alert('mousedown'); 9 } 10 }; 11 12 new TEST().init(); 最初对于第5行不是很理解,为什么可以传一个this作为参数,并且最

javascript 对象中的 handleEvent

在高级浏览器中,我们在绑定事件的时候 可以知道绑定一个对象,然后在这个对象中的 handleEvent 方法会自动进入指定的方法,不多说了举个例子吧!! var events = { handleEvent: function(event) { switch (event.type) { case 'touchstart': this.touchstart(event); break; case 'touchmove': this.touchmove(event); break; case 't

js中的addEventListener

JS:attachEvent和addEventListener 使用方法 attachEvent方法,为某一事件附加其它的处理事件.(不支持Mozilla系列) addEventListener方法 用于 Mozilla系列 举例: document.getElementByIdx_x("btn").onclick = method1;document.getElementByIdx_x("btn").onclick = method2;document.getEl