原文地址: JS 跨浏览器的dom事件封装
上次的 《JS面试题 跨浏览器的事件处理函数的绑定和解绑定》一文中提供的跨浏览器事件处理函数的绑定中缺失了对event对象的跨浏览器处理。这里对它进行补完。 在兼容DOM的浏览器中,无论使用DOM0级(element.onXXX=handler)还是DOM2级(element.addEventListener)来绑定事件处理函数,event对象都会作为事件处理函数的参数被传入。然而在IE中,使用DOM0级方法绑定事件处理函数却没有将event对象当做参数传入,而是作为window对象的一个属性存在。因此,跨浏览器获得一个事件对象需要如下的代码 标准的event对象包含以下属性及方法 而IE的事件对象包含如下属性 基于上述对比,需要兼容处理的属性和方法有 event.target 和 event.srcElement ,event.stopPropogation 和 event.cancelBubble ,event.preventDefault 和 event.returnValue 。 虽然IE中的event对象与标准的event对象还有很多不一致的接口(属性,方法),但是不是每个事件处理函数都会用到所有的属性和方法,如果在compatibleEvent方法中做更多的兼容处理就有可能不会被用到而消耗了不必要的内存,所以只是提供几个简单的兼容是更好的选择。 这样在LIZ.dom.addEventListener的处理中对向其注册的事件处理函数传入使用
1
element.onclick =
function
(event){
2
event = event || window.event;
3
}
属性/方法
类型
读写
说明
bubbles
Boolean
只读
表明事件是否会冒泡
cancelable
Boolean
只读
表明是否可以取消事件的默认行为
currentTarget
Element
只读
即绑定该事件处理函数的元素,不一定是事件的目标元素,因为事件可以冒泡至绑定了相应事件的上层元素
eventPhase
Integer
只读
调用事件处理程序的阶段:1.捕获阶段 2.处于目标 3.冒泡阶段
type
String
只读
事件类型
target
Element
只读
事件的目标元素,例如点击的dom中最深层次的元素
preventDefault
Function
只读
取消事件的默认行为的方法。只有事件的cancelable为true时调用此方法才有效。
stopPropogation
Function
只读
取消事件的进一步冒泡或捕获。
属性/方法
类型
读写
说明
cancelBubble
Boolean
读写
默认值为false,将其设置为true就可以阻止事件冒泡。
returnValue
Boolean
读写
默认为true,将其设置为false就可以取消事件的默认行为,但没有其他属性可以说明是否有效。
type
String
只读
事件类型
srcElement
Element
只读
事件的目标元素,与DOM事件中的target属性一样。
可以提供一个跨浏览器的事件对象类型来处理兼容问题。可以提供一个方法来简单的处理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
if
(
typeof
event.target ===
'undefined'
){
10
event.target = event.srcElement;
11
}
12
13
if
(
typeof
event.stopPropogation !==
'function'
){
14
event.stopPropogation =
function
(){
15
this
.cancelBubble =
true
;
16
};
17
}
18
19
if
(
typeof
event.preventDefault !==
'function'
){
20
event.preventDefault =
function
(){
21
this
.returnValue =
false
;
22
}
23
}
24
25
return
event;
26
};
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
if
(
typeof
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
}
相关推荐
尽管JavaScript本身没有提供一个统一的跨浏览器事件系统,但它允许开发者利用浏览器提供的DOM(文档对象模型)事件模型。这个模型允许开发者为页面中的DOM元素添加事件处理器,从而响应各种事件。 然而,由于早期...
在JavaScript中,DOM事件处理程序的封装是跨浏览器兼容性的一个关键步骤,因为不同的浏览器对事件处理有不同的实现。本文主要讨论了在将DOM事件处理程序封装到名为`event.js`的文件时可能出现的低级错误,并提供了...
这款"js 日历 控件"特别强调了其支持跨浏览器使用,并且具有中国特色的汉字显示,为国内用户提供了更友好的界面体验。 在开发这样的日历控件时,主要涉及到以下几个关键知识点: 1. **JavaScript基础**:日历控件...
在JavaScript中,事件处理是网页交互的核心部分,而跨浏览器的事件处理则显得尤为重要,因为不同的浏览器可能有不同的实现方式。本文将深入探讨如何使用JavaScript来实现跨浏览器的事件侦听器(事件监听器)和事件...
总结,"EventUtil:跨浏览器事件封装"是一个优秀的JavaScript库,它解决了浏览器间事件处理的不一致性,提高了代码的可读性和可维护性。通过理解和使用EventUtil,开发者可以更专注于业务逻辑,而不是解决浏览器的...
由于不同浏览器对事件处理的支持有所不同,因此在封装事件处理程序时,开发者经常会遇到一些低级错误。本文主要介绍了在封装JavaScript事件处理程序至event.js文件中时遇到的一些典型错误,并提出了相应的解决方案。...
在探讨如何利用JavaScript调用浏览器的打印模块实现点击按钮时触发自定义函数的过程中,我们首先需要了解浏览器提供的打印API以及如何通过编程方式触发打印任务。现代浏览器通常提供了window.print()方法,该方法...
通常的做法是将自定义的`eventUtil`对象中的方法封装到一个独立的JavaScript文件中,并在项目中需要的地方引用这个文件,从而实现整个项目的事件处理程序跨浏览器兼容。这种方式有助于提高代码的可维护性和可重用性...
jQuery对象封装了多个DOM元素,可以执行链式操作,简化了跨浏览器的兼容性问题。例如,`$('div').hide()`一句就完成了原生JavaScript可能需要多行代码才能实现的效果。 联系方面,jQuery对象内部实际上包含了DOM...
JSDOM是一个JavaScript库,它实现了大部分W3C DOM规范,使得开发者在Node.js环境中也能像在浏览器中一样操作DOM。 **项目实践:点击链接切换图片与文字** 在这个“JSDOM图片转换小练习”中,我们将运用JavaScript...
在给定的代码中,`eventUtil`对象被用来封装了事件的添加、移除以及相关辅助方法,以实现跨浏览器的兼容性。 1. **事件添加和移除** - `addEvent`函数用于向元素添加事件监听器。首先,它会检查元素是否支持`...
- **跨浏览器兼容性**:讨论不同浏览器对DOM API的支持差异,并提供解决方案来确保代码在各种环境下都能正常运行。 4. **最佳实践与模式** - **模块化设计**:推荐使用模块化的编程方式来组织代码,提高可维护性...
JavaScript(Js)是一种广泛用于网页和网络应用的脚本语言,尤其在操作HTML DOM(文档对象模型)方面具有重要作用。DOM是HTML和XML文档的一种结构化表示,它允许通过编程方式访问和修改文档内容、样式以及结构。这篇...
要编写兼容各个浏览器的...但是,为了确保网站的兼容性和用户体验,在实际开发中仍然推荐使用上述的兼容性封装方法,或者使用流行的库(如jQuery)来处理事件监听,这样可以进一步简化跨浏览器事件处理的代码编写。
在JavaScript的世界里,jQuery是一个广泛使用的库,它简化了DOM操作、事件处理、动画效果以及Ajax交互等任务。为了深入理解jQuery的工作原理以及浏览器端的封装和兼容性处理,我们可以通过编写一个迷你jQuery-like库...
总的来说,WBrowser项目提供了一个C#环境下封装IE浏览器的实例,通过学习该项目,开发者可以了解到如何利用.NET平台和C#语言来操作和控制IE浏览器,包括但不限于加载网页、执行JavaScript、处理DOM事件、安全控制等...
为了实现用JavaScript代码触发DOM事件,我们可以利用Web标准提供的API接口。其中,dispatchEvent方法允许开发者向一个指定的DOM元素派发一个事件。当使用dispatchEvent方法触发的事件发生时,它会按照预期的事件捕获...
5. **jQuery封装**:jQuery是一款广泛使用的JavaScript库,它简化了DOM操作、事件处理、动画效果和Ajax请求,是封装JavaScript的一个经典实例。$.ajax、$(selector).click()等API让开发者能快速上手。 6. **React...
8. 跨浏览器兼容性:解决不同浏览器对DOM和JavaScript API支持上的差异,可能涉及polyfills、feature detection等技巧。 9. JavaScript面向对象编程:介绍如何在JavaScript中实现面向对象的编程模式,包含继承、...