我希望以下函数能够处理所有支持事件的对象,方法是传递相应的事件,而不仅仅是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);
任何想法都会欣赏它
答案 0 :(得分:3)
最简单,最强大的方法是使用库为您执行此操作,例如Prototype,jQuery,Closure等。这样,您就可以获得其他人发现和报告/修复错误的好处,而不是自己完成所有这些。 : - )
可是:
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);