说说handleEvent这个东东

大家知道,原生的javascript绑定事件方法 :如下

 

1 <div id="handleEvent" style="width:200px;height:100px; border:solid 1px #ccc;">handleEvent 测试</div>
1 var handleEvents = document.getElementById("handleEvent");
2   var callback = function(){ alert("this is a test!");}
3   handleEvents.addEventListener('click', callback, false);
今天发现addEventListener 的第二个参数除了可以传入函数外 还可以传入一个对象, 
handleEvents.addEventListener('click', this, false);

事件会自动在传入对象中寻找handleEvent方法,也就是 this.handleEvent 举个例子 :

var obj = {
    handleEvent: function() {
        alert(this.dude);
    },
    dude: "holla"
};

element.addEventListener("click", obj, false);
var obj  =  {
    init: function() {
        document.getElementById("btn").addEventListener("click", this, false);
        document.getElementById("btn").addEventListener("touchstart", this, false);
    },
    handleEvent: function(e) {
        switch(e.type) {
            case "click":
                this.button();
                break;
            case "touchstart":
                this.button();
                break;
        }
    },
    dude: "holla",
    button: function() {
        alert(this.dude);
    }
};

obj.init();
changeHandleEvent: function(evt) {
    this._handleEvent = this.handleEvent;
    this.handleEvent = function(e) {
        var t = evt.target;
        
        if (t.id === "btn") {
        } else if(t.id === "btn3") {
            this.revertHandleEvent();
        }
    }
}
function on(el, evt, fn, bubble) {
    if("addEventListener" in el) {
        try {
            el.addEventListener(evt, fn, bubble);
        } catch(e) {
            if(typeof fn == "object" && fn.handleEvent) {
                el.addEventListener(evt, function(e){
                    fn.handleEvent.call(fn,e);
                }, bubble);
            } else {
                throw e;
            }
        }
    } else if("attachEvent" in el) {
        if(typeof fn == "object" && fn.handleEvent) {
            el.attachEvent("on" + evt, function(){
                fn.handleEvent.call(fn);
            });      
        } else {
            el.attachEvent("on" + evt, fn);
        }
    }
}

 

这样,在 el 触发event事件后,调用的是handleEvent方法,注意这里面的 this 是指向对象本身 (即 this ==obj //true),这个我们调用对象里面的方法提供极大的便利!而普通的函数,this传入函数里面的this 是指向事件的,因事件类型不同而不同,无法定位到this到底指向哪里。

参考:http://www.thecssninja.com/javascript/handleevent
posted @ 2013-09-24 16:00  qgd87  阅读(2315)  评论(1编辑  收藏  举报