# Javascript # DOM2兼容处置惩罚

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中才须要处置惩罚兼容。

    原文作者:大煜儿
    原文地址: https://segmentfault.com/a/1190000019422469
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞