DOM2兼容题目,除了语法上的区分,在处置惩罚的机制上也有以下题目:递次题目,反复题目,this对象题目。
语法题目
[规范]
curEle.addEventListener(‘type’, fn, false);
[IE6~8]
curEle.attachEvent(‘ontype’, fn)
var on = function (curEle, type, fn) {
if (document.addEventListener) {
//规范浏览器
curEle.addEventListener(type, fn, false);
return;
}
// IE6~8
curEle.attachEvent('on' + type, fn);
}
var off = function (curEle, type, fn) {
if (document.removeEventListener) {
//规范浏览器
curEle.removeEventListener(type, fn, false);
return;
}
// IE6~8
curEle.detachEvent('on' + type, fn);
};
递次题目
当事宜行动触发,实行对应事宜池中寄存的要领时,IE低版本浏览器实行要领递次是乱序的,而规范浏览器是根据绑定的先后递次顺次实行的。
var fn1 = function (e) {
console.log(1);
}
var fn2 = function (e) {
console.log(2);
}
var fn3 = function (e) {
console.log(3);
}
var fn4 = function (e) {
console.log(4);
}
on(document.body, 'click', fn1);
on(document.body, 'click', fn2);
on(document.body, 'click', fn3);
on(document.body, 'click', fn4);
规范浏览器中输出结果是: 1 2 3 4
IE6~8浏览器中输出结果是:4 3 2 1
假如增添更多个事宜,你会发明他们是乱序的。
反复题目
IE低版本浏览器在向事宜池中增添要领的时刻没有去重机制,那怕当前要领已寄存过了,还会反复的增添进去,而规范浏览器的事宜池机制很完美,能够自动去重(事宜池中已存在的要领,不允许在增添进来)。
on(document.body, 'click', fn8);
on(document.body, 'click', fn8);
on(document.body, 'click', fn8);
IE低版本浏览器中,会实行fn8 3次。没有举行去重处置惩罚。但是在规范浏览器中只会输出一次。
THIS题目
IE低版本浏览器中,当事宜行动触发,把事宜池中要领实行,此时要领中的this指向window,而规范浏览器中,this指向当前元素自身。
var fn1 = function (e) { console.log(1, this); }
on(document.body, 'click', fn1);
在规范浏览器中 this–> body
在IE低版本中 this–> window
究其基础,都是IE低版本浏览器关于它内置事宜池处置惩罚机制的不完美致使的。
DOM2事宜绑定兼容处置惩罚的道理:离别低版本的IE6~8的内置事宜池,而是本身建立一个类似于规范浏览器的“自定义事宜池”,规范浏览器不须要处置惩罚兼容,只要IE6~8中才须要处置惩罚兼容。