`
LiZn
  • 浏览: 10270 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

JS 跨浏览器的dom事件封装

阅读更多

 

原文地址: JS 跨浏览器的dom事件封装

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

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

1 element.onclick = function (event){
2     event = event || window.event;
3 }

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

属性/方法 类型 读写 说明
bubbles Boolean 只读 表明事件是否会冒泡
cancelable Boolean 只读 表明是否可以取消事件的默认行为
currentTarget Element 只读 即绑定该事件处理函数的元素,不一定是事件的目标元素,因为事件可以冒泡至绑定了相应事件的上层元素
eventPhase Integer 只读 调用事件处理程序的阶段:1.捕获阶段 2.处于目标 3.冒泡阶段
type String 只读 事件类型
target Element 只读 事件的目标元素,例如点击的dom中最深层次的元素
preventDefault Function 只读 取消事件的默认行为的方法。只有事件的cancelable为true时调用此方法才有效。
stopPropogation Function 只读 取消事件的进一步冒泡或捕获。

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

属性/方法 类型 读写 说明
cancelBubble Boolean 读写 默认值为false,将其设置为true就可以阻止事件冒泡。
returnValue Boolean 读写 默认为true,将其设置为false就可以取消事件的默认行为,但没有其他属性可以说明是否有效。
type String 只读 事件类型
srcElement Element 只读 事件的目标元素,与DOM事件中的target属性一样。

基于上述对比,需要兼容处理的属性和方法有 event.target 和 event.srcElement ,event.stopPropogation 和 event.cancelBubble ,event.preventDefault 和 event.returnValue 。可以提供一个跨浏览器的事件对象类型来处理兼容问题。可以提供一个方法来简单的处理event的兼容性。使用之前所说的创建一个跨浏览器的事件对象类型的话存在很多弊端,一方面创建了新的对象消耗过大,一方面要使用其它事件特有的值还需要再调用方法获取原事件对象,这一方法创建了闭包会造成一些内存消耗。

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 };
1 /**
2 * 在LIZ.util中创建一个处理event兼容性的方法
3 * 只需要对IE的event对象进行兼容处理,向标准靠拢
4 * 给IE的event对象添加其本身不具备的标准的属性和方法
5 */
6 LIZ.util.compatibleEvent = function ( event ){
7     event = event || window.event;
8  
9     iftypeof event.target === 'undefined' ){
10         event.target = event.srcElement;
11     }
12  
13     iftypeof event.stopPropogation !== 'function' ){
14         event.stopPropogation = function (){
15             this.cancelBubble = true;
16         };
17     }
18  
19     iftypeof event.preventDefault !== 'function' ){
20         event.preventDefault = function (){
21             this.returnValue = false;
22         }
23     }
24  
25     return event;
26 };

虽然IE中的event对象与标准的event对象还有很多不一致的接口(属性,方法),但是不是每个事件处理函数都会用到所有的属性和方法,如果在compatibleEvent方法中做更多的兼容处理就有可能不会被用到而消耗了不必要的内存,所以只是提供几个简单的兼容是更好的选择。

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

1 addEventListener : function (element, type, handler){
2     var observer = this.getData(element, 'observer'),
3     proxyHandler = function (event){
4         observer.fire( LIZ.util.compatibleEvent( event ) );
5     };
6     if( !observer || !(observer instanceof LIZ.patterns.Observer) ){
7         observer = new LIZ.patterns.Observer(element);
8         this.setData(element, 'observer', observer);
9     }
10     iftypeof observer[type] == 'undefined' ){
11         if( element.addEventListener ){
12             element.addEventListener(type, proxyHandler, false);
13         else if ( element.attachEvent ){
14             element.attachEvent('on'+type, proxyHandler);
15         else {
16             element['on'+type] = proxyHandler;
17         }
18     }
19     observer.addListener(type, handler);
20 }

 

本博客文章由LiZn创作或分享,以创作公用CC 姓名标示-非商业性-相同方式分享 3.0 Unported 授权条款共享。 
希望本文能够对你有所帮助,欢迎留言讨论,如果你喜欢本站文章,可以使用该 RSS订阅地址来订阅本站。

 

1
6
分享到:
评论

相关推荐

    javascript 跨浏览器的事件系统

    尽管JavaScript本身没有提供一个统一的跨浏览器事件系统,但它允许开发者利用浏览器提供的DOM(文档对象模型)事件模型。这个模型允许开发者为页面中的DOM元素添加事件处理器,从而响应各种事件。 然而,由于早期...

    JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题.docx

    在JavaScript中,DOM事件处理程序的封装是跨浏览器兼容性的一个关键步骤,因为不同的浏览器对事件处理有不同的实现。本文主要讨论了在将DOM事件处理程序封装到名为`event.js`的文件时可能出现的低级错误,并提供了...

    js 日历 控件(可跨浏览器-国内样式)

    这款"js 日历 控件"特别强调了其支持跨浏览器使用,并且具有中国特色的汉字显示,为国内用户提供了更友好的界面体验。 在开发这样的日历控件时,主要涉及到以下几个关键知识点: 1. **JavaScript基础**:日历控件...

    js跨浏览器的事件侦听器和事件对象的使用方法

    在JavaScript中,事件处理是网页交互的核心部分,而跨浏览器的事件处理则显得尤为重要,因为不同的浏览器可能有不同的实现方式。本文将深入探讨如何使用JavaScript来实现跨浏览器的事件侦听器(事件监听器)和事件...

    EventUtil:跨浏览器事件封装

    总结,"EventUtil:跨浏览器事件封装"是一个优秀的JavaScript库,它解决了浏览器间事件处理的不一致性,提高了代码的可读性和可维护性。通过理解和使用EventUtil,开发者可以更专注于业务逻辑,而不是解决浏览器的...

    JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题

    由于不同浏览器对事件处理的支持有所不同,因此在封装事件处理程序时,开发者经常会遇到一些低级错误。本文主要介绍了在封装JavaScript事件处理程序至event.js文件中时遇到的一些典型错误,并提出了相应的解决方案。...

    js调用浏览器打印模块实现点击按钮触发自定义函数

    在探讨如何利用JavaScript调用浏览器的打印模块实现点击按钮时触发自定义函数的过程中,我们首先需要了解浏览器提供的打印API以及如何通过编程方式触发打印任务。现代浏览器通常提供了window.print()方法,该方法...

    js事件处理程序跨浏览器解决方案

    通常的做法是将自定义的`eventUtil`对象中的方法封装到一个独立的JavaScript文件中,并在项目中需要的地方引用这个文件,从而实现整个项目的事件处理程序跨浏览器兼容。这种方式有助于提高代码的可维护性和可重用性...

    javascript 原生Dom对象和jQuery对象的联系和区别

    jQuery对象封装了多个DOM元素,可以执行链式操作,简化了跨浏览器的兼容性问题。例如,`$('div').hide()`一句就完成了原生JavaScript可能需要多行代码才能实现的效果。 联系方面,jQuery对象内部实际上包含了DOM...

    JSDOM图片转换小练习

    JSDOM是一个JavaScript库,它实现了大部分W3C DOM规范,使得开发者在Node.js环境中也能像在浏览器中一样操作DOM。 **项目实践:点击链接切换图片与文字** 在这个“JSDOM图片转换小练习”中,我们将运用JavaScript...

    纯JavaScript实现的兼容各浏览器的添加和移除事件封装

    在给定的代码中,`eventUtil`对象被用来封装了事件的添加、移除以及相关辅助方法,以实现跨浏览器的兼容性。 1. **事件添加和移除** - `addEvent`函数用于向元素添加事件监听器。首先,它会检查元素是否支持`...

    JavaScript DOM编程艺术 第2版

    - **跨浏览器兼容性**:讨论不同浏览器对DOM API的支持差异,并提供解决方案来确保代码在各种环境下都能正常运行。 4. **最佳实践与模式** - **模块化设计**:推荐使用模块化的编程方式来组织代码,提高可维护性...

    Js操控Html Dom

    JavaScript(Js)是一种广泛用于网页和网络应用的脚本语言,尤其在操作HTML DOM(文档对象模型)方面具有重要作用。DOM是HTML和XML文档的一种结构化表示,它允许通过编程方式访问和修改文档内容、样式以及结构。这篇...

    javascript 兼容各个浏览器的事件

    要编写兼容各个浏览器的...但是,为了确保网站的兼容性和用户体验,在实际开发中仍然推荐使用上述的兼容性封装方法,或者使用流行的库(如jQuery)来处理事件监听,这样可以进一步简化跨浏览器事件处理的代码编写。

    一个迷你jQuerylike库的实现旨在理解相似类库的原理及浏览器端常见封装和兼容的实现

    在JavaScript的世界里,jQuery是一个广泛使用的库,它简化了DOM操作、事件处理、动画效果以及Ajax交互等任务。为了深入理解jQuery的工作原理以及浏览器端的封装和兼容性处理,我们可以通过编写一个迷你jQuery-like库...

    WBrowser IE浏览器封装

    总的来说,WBrowser项目提供了一个C#环境下封装IE浏览器的实例,通过学习该项目,开发者可以了解到如何利用.NET平台和C#语言来操作和控制IE浏览器,包括但不限于加载网页、执行JavaScript、处理DOM事件、安全控制等...

    详解用js代码触发dom事件的实现方案

    为了实现用JavaScript代码触发DOM事件,我们可以利用Web标准提供的API接口。其中,dispatchEvent方法允许开发者向一个指定的DOM元素派发一个事件。当使用dispatchEvent方法触发的事件发生时,它会按照预期的事件捕获...

    国内外javascript经典封装

    5. **jQuery封装**:jQuery是一款广泛使用的JavaScript库,它简化了DOM操作、事件处理、动画效果和Ajax请求,是封装JavaScript的一个经典实例。$.ajax、$(selector).click()等API让开发者能快速上手。 6. **React...

    DOM Scripting Web Design with JavaScript and the Document Object Model

    8. 跨浏览器兼容性:解决不同浏览器对DOM和JavaScript API支持上的差异,可能涉及polyfills、feature detection等技巧。 9. JavaScript面向对象编程:介绍如何在JavaScript中实现面向对象的编程模式,包含继承、...

Global site tag (gtag.js) - Google Analytics