当前位置:编程学习 > JS >>

Js跨浏览器的dom事件封装

 

上次的 《JS面试题 跨浏览器的事件处理函数的绑定和解绑定》一文中提供的跨浏览器事件处理函数的绑定中缺失了对event对象的跨浏览器处理。这里对它进行补完。

在兼容DOM的浏览器中,无论使用DOM0级(element.onXXX=handler)还是DOM2级(element.addEventListener)来绑定事件处理函数,event对象都会作为事件处理函数的参数被传入。然而在IE中,使用DOM0级方法绑定事件处理函数却没有将event对象当做参数传入,而是作为window对象的一个属性存在。因此,跨浏览器获得一个事件对象需要如下的代码

element.onclick = function (event){

    event = event || window.event;

}

标准的event对象包含以下属性及方法

属性/方法      类型       读/写      说明

bubbles   Boolean   只读       表明事件是否会冒泡

cancelable       Boolean   只读       表明是否可以取消事件的默认行为

currentTarget  Element  只读       即绑定该事件处理函数的元素,不一定是事件的目标元素,因为事件可以冒泡至绑定了相应事件的上层元素

eventPhase      Integer    只读       调用事件处理程序的阶段:1.捕获阶段2.处于目标3.冒泡阶段

typeString     只读       事件类型

target      Element  只读       事件的目标元素,例如点击的dom中最深层次的元素

preventDefault       Function  只读       取消事件的默认行为的方法。只有事件的cancelable为true时调用此方法才有效。

stopPropogation     Function  只读       取消事件的进一步冒泡或捕获。

而IE的事件对象包含如下属性

属性/方法      类型       读/写      说明

cancelBubble  Boolean   读/写      默认值为false,将其设置为true就可以阻止事件冒泡。

returnValue     Boolean   读/写      默认为true,将其设置为false就可以取消事件的默认行为,但没有其他属性可以说明是否有效。

typeString     只读       事件类型

srcElement     Element  只读       事件的目标元素,与DOM事件中的target属性一样。

基于上述对比,需要兼容处理的属性和方法有event.target 和event.srcElement ,event.stopPropogation 和event.cancelBubble ,event.preventDefault 和event.returnValue 。可以提供一个跨浏览器的事件对象类型来处理兼容问题。

1

LIZ.dom.Event = function ( event ){

2

    event = event || window.event;

3

    this.type = event.type;

4

    this.target = event.target || event.srcElement;

5

 

6

    this.preventDefault = function (){

7

        if ( event.preventDefault ){

8

            event.preventDefault();

9

        } else {

10

            event.returnValue = false;

11

        }

12

    };

13

 

14

    this.stopPropogation = function (){

15

        if ( event.stopPropogation ){

16

            event.stopPropogation();

17

        } else {

18

            event.cancelBubble = true;

19

        }

20

    };

21

 

22

    //为提供一点灵活性,此处提供一个getEvent方法返回真正的event对象

23

    this.getEvent = function (){

24

        return event;

25

    };

26

 

27

    return this;

28

};

这样在LIZ.dom.addEventListener的处理中对向其注册的事件处理函数传入使用LIZ.dom.Event类型处理过的event对象,就可以在事件处理函数中使用跨浏览器的事件对象了。

1

addEventListener : function (element, type, handler){

2

 

3

    var observer = this.getData(element, 'observer'),

4

    proxyHandler = function (event){

5

        observer.fire( new LIZ.dom.Event( event ) );

6

    };

7

    if( !observer || !(observer instanceof LIZ.patterns.Observer) ){

8

        observer = new LIZ.patterns.Observer(element);

9

        this.setData(element, 'observer', observer);

10

    }

11

    if( typeof observer[type] == 'undefined' ){

12

        if( element.addEventListener ){

13

            element.addEventListener(type, proxyHandler, false);

14

        } else if ( element.attachEvent ){

15

            element.attachEvent('on'+type, proxyHandler);

16

        } else {

17

            element['on'+type] = proxyHandler;

18

        }

19

    }

20

    observer.addListener(type, handler);

21

}

补充:web前端 , JavaScript ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,