javascript窗口事件

时间:2010-04-21 16:02:50

标签: javascript events

我希望以下函数能够处理所有支持事件的对象,方法是传递相应的事件,而不仅仅是onload。

function eve(ev, fnc) {
    if(typeof window.addEventListener!= 'undefined'){
        window.addEventListener('load',fnc,false); 
        }elseif(typeof window.attachEvent!='undefined'){
        window.attachEvent('onload', fnc );
    }else{
        var old = this.onload;  
        this.onload=function(e){  
            old();  
            fnc();  
        };
    }
}
// for instance onclick
eve('onclick', myFunc);

任何想法都会欣赏它

2 个答案:

答案 0 :(得分:3)

最简单,最强大的方法是使用库为您执行此操作,例如PrototypejQueryClosure等。这样,您就可以获得其他人发现和报告/修复错误的好处,而不是自己完成所有这些。 : - )

可是:

DOM元素在它们上面也有addEventListener(以及attachEvent,因此,为此创建一个通用函数相当容易:

function hook(obj, event, handler) {

    if (obj.attachEvent) {
        obj.attachEvent("on" + event, handler);
    }
    else if (obj.addEventListener) {
        obj.addEventListener(event, handler);
    }
    else {
        // Fail, probably
    }
}

(请注意,IE变体使用“on”[例如“onclick”],标准不会[“点击”]。)

测试一次然后使用浏览器所具有的效率会更高效,但是:

var hook = (function() {
    var elm = document.createElement('div');

    if (elm.attachEvent)
    {
        return hookWithAttachEvent;
    }
    if (elm.addEventListener)
    {
        return hookWithAddEventListener;
    }
    return hookFail;

    function hookWithAttachEvent(obj, event, handler) {

        obj.attachEvent("on" + event, handler);
        return obj;
    }

    function hookWithAddEventListener(obj, event, handler) {

        obj.addEventListener(event, handler);
        return obj;
    }

    function hookFail() {
        throw "Don't know how to hook events on this platform.";
    }
})();

一次检测到应该使用哪个变体并使用该变量返回一个函数,然后在使用hook时直接调用该函数。

答案 1 :(得分:0)

function eve(obj, ev, fnc) {
    if(typeof window.addEventListener!= 'undefined'){
        obj.addEventListener(ev.replace(/on/,""),fnc,false); 
    }elseif(typeof window.attachEvent!='undefined'){
        obj.attachEvent(ev, fnc );
    }else{
        var old = obj[ev];  
        obj[ev]=function(e){  
            old();  
            fnc();  
        };
    }
}
// for instance onclick
eve(obj, 'onclick', myFunc);