我看了一個教程,上面寫了一個用自定義的傳統事件綁定函數來代替IE8及以上的老IE的attachEvent方法,主講老師寫了一點看不懂,哪位能解釋一下,代碼如下:
HTML代碼:
<body>
<input type="button" value="按鈕" id="button" />
</body>
JS代碼:
addEvent(obj, type, fn){
//先創建一個保存事件的容器obj.events對象
if(!obj.events) obj.events = {};
//再創建一個保存事件處理函數的容器obj.events[type]數組
if(!obj.events[type]){
var obj.events[type] = [];
if(obj['on'+type]) obj.events[type][0] = fn; //這裡就不同了,先寫出主講老師的方法
}
//第二次執行時保存
obj.events[type][addEvent.ID++] = fn;
//開始執行
obj['on'+type] = function(){
for(var i in obj.events[type]){
obj.events[type][i]();
}
}
}
//事件計數器
addEvent.ID = 1;
//開始執行
addEvent(window, 'load', function(){
var button = document.getElementById('button');
addEvent(button, 'click', fn1);
addEvent(button, 'click', fn2);
addEvent(button, 'click', fn3);
});
function fn1(){
alert(1);
}
function fn2(){
alert(2);
}
function fn3(){
alert(3);
}
主講老師在用obj.events[type][0]保存fn時,前面加了一個判斷,即if(obj['on'+type]),這個判斷的結果是點擊了按鈕後,分別彈出1、2、3,而不加這個判斷,則為1、1、2、3四次。
我自己沒有用這個辦法,而是加了一個else分支,也能實現彈出1、2、3三次
if(!obj.events[type]){
var obj.events[type] = [];
obj.events[type][0] = fn;
} else {
obj.events[type][addEvent.ID++] = fn;
}
我想問的是,主講老師講的辦法即加了一個if(obj['on'+type])的判斷是如何起作用的?為何加了之後也能將原來多出來的一次1彈窗去掉呢?
http://m.blog.csdn.net/blog/ruoyiqing/39341191