1, 下面是JQuery之父推荐的添加移除事件方法。
-
-
-
-
-
-
functionaddEvent(obj,type,fn)
-
{
-
if
(obj.attachEvent)
-
{
-
obj[
'e'
+type+fn]=fn;
-
obj[type+fn]=function()
-
{
-
obj[
'e'
+type+fn](window.event);
-
}
-
obj.attachEvent(
'on'
+type,obj[type+fn]);
-
}
-
else
-
obj.addEventListener(type,fn,
false
);
-
}
-
-
-
-
-
-
functionremoveEvent(obj,type,fn)
-
{
-
if
(obj.detachEvent)
-
{
-
obj.detachEvent(
'on'
+type,obj[type+fn]);
-
obj[type+fn]=
null
;
-
}
-
else
-
obj.removeEventListener(type,fn,
false
);
-
}
-
-
-
2.《Pro JavaScript Techniques》来看,John Resig大大推荐了Dean Edwards的addEvent()方法,而没推荐自己更精简的作品,他这样评价Edwards的addEvent()的:
1
,可以在所有浏览器中工作,就算是古老得无任何支持的浏览器;
-
2
,
this
关键字可在所有的绑定函数中使用,指向的是当前元素;
-
3
,中和了所有防止浏览器默认行为和阻止事件冒泡的各种浏览器特定函数;
-
4
,不管浏览器类型,事件对象总是作为第一个对象传入;
-
5
,唯一缺点是仅工作在冒泡阶段(因为深入使用事件绑定的传统方法)。
-
6
,addEvent/removeEvent函数如此强大,绝对没有任何理由不在你的代码中使用。
1, 可以在所有浏览器中工作,就算是古老得无任何支持的浏览器;
2, this关键字可在所有的绑定函数中使用,指向的是当前元素;
3, 中和了所有防止浏览器默认行为和阻止事件冒泡的各种浏览器特定函数;
4, 不管浏览器类型,事件对象总是作为第一个对象传入;
5, 唯一缺点是仅工作在冒泡阶段(因为深入使用事件绑定的传统方法)。
6, addEvent/removeEvent函数如此强大,绝对没有任何理由不在你的代码中使用。
而Dean Edwards这样说:
My solution is very different.
* it performs no object detection
* it does not use the addeventListener/attachEvent methods
* it keeps the correct scope (the this keyword)
* it passes the event object correctly
* it is entirely cross-browser (it will probably work on IE4 and NS4)
* and from what I can tell it does not leak memory
下面是Dean Edwards的addEvent/removeEvent函数:
-
-
-
functionaddEvent(element,type,handler){
-
if
(element.addEventListener){
-
element.addEventListener(type,handler,
false
);
-
}
else
{
-
-
if
(!handler.$$guid)handler.$$guid=addEvent.guid++;
-
-
if
(!element.events)element.events={};
-
-
varhandlers=element.events[type];
-
if
(!handlers){
-
handlers=element.events[type]={};
-
-
if
(element[
"on"
+type]){
-
handlers[
0
]=element[
"on"
+type];
-
}
-
}
-
-
handlers[handler.$$guid]=handler;
-
-
element[
"on"
+type]=handleEvent;
-
}
-
};
-
-
addEvent.guid=
1
;
-
-
functionremoveEvent(element,type,handler){
-
if
(element.removeEventListener){
-
element.removeEventListener(type,handler,
false
);
-
}
else
{
-
-
if
(element.events&&element.events[type]){
-
deleteelement.events[type][handler.$$guid];
-
}
-
}
-
};
-
-
functionhandleEvent(event){
-
varreturnValue=
true
;
-
-
event=event||fixEvent(((
this
.ownerDocument||
this
.document||
this
).parentWindow||window).event);
-
-
varhandlers=
this
.events[event.type];
-
-
for
(variinhandlers){
-
this
.$$handleEvent=handlers[i];
-
if
(
this
.$$handleEvent(event)===
false
){
-
returnValue=
false
;
-
}
-
}
-
return
returnValue;
-
};
-
-
functionfixEvent(event){
-
-
event.preventDefault=fixEvent.preventDefault;
-
event.stopPropagation=fixEvent.stopPropagation;
-
return
event;
-
};
-
fixEvent.preventDefault=function(){
-
this
.returnValue=
false
;
-
};
-
fixEvent.stopPropagation=function(){
-
this
.cancelBubble=
true
;
-
};
分享到:
相关推荐
此外,还介绍了一个`addEvent`函数,这是一个用于添加事件监听器的函数,它考虑了对同一个事件类型的多个监听器的管理。 4. 事件对象:在处理事件时,会有一个事件对象传递给事件处理函数,通过这个事件对象可以...
- **添加事件**:当调用`addEvent`函数时,事件信息会被添加到`listEvents`中。 - **清除事件**:`flush`方法用于在页面卸载时移除所有已绑定的事件监听器。这里使用了`removeEventListener`和`detachEvent`来确保...
如果该参数为`true`,则事件处理函数会在捕获阶段执行;如果为`false`(默认),则在冒泡阶段执行。在IE8及以上版本,这两个方法也得到了支持,但在此之前,需要使用`attachEvent`和`detachEvent`,它们不支持事件...
因此,为了兼容不同浏览器,我们需要编写一个通用的添加事件监听函数addEvent。在这个函数中,我们首先检查节点是否具有addEventListener方法,如果有,使用W3C标准方法来添加事件监听器,并通过指定第三个参数为...
W3C推荐的`addEventListener`方法允许添加多个事件监听器,且支持事件捕获和冒泡阶段。每个监听函数都可以独立处理事件,`this`指向触发事件的元素。但遗憾的是,Internet Explorer(IE)早期版本不支持此方法。 3...
W3C标准的事件监听方法是`addEventListener`,它允许在同一事件句柄上注册多个监听函数,并可以选择在捕获或冒泡阶段执行。例如: ```javascript elem.addEventListener('click', function() {...}, false); ``` 这...
通常,我们使用`addEventListener`方法添加事件监听器,传入三个参数:事件类型、回调函数和是否在捕获阶段触发。然而,iScroll采取了一种非典型的方式,将事件处理器设置为一个对象,而不是直接使用函数。例如,当...
为了实现跨浏览器的事件绑定,我们可以编写一个兼容函数,如示例中的`addEvent`。这个函数会检查浏览器是否支持`addEventListener`,如果支持就使用该方法,否则回退到`attachEvent`。需要注意的是,当调用这个函数...
element.addEventListener("事件类型", 事件处理函数, 是否使用捕获阶段); ``` - `事件类型`:不包含`on`前缀,例如`click`、`mouseover`。 - `事件处理函数`:当指定的事件发生时被调用的函数。 - `是否使用捕获...
在这段代码中,我们定义了一个名为 `addEvent` 的通用函数,它接受三个参数:`obj` 表示要绑定事件的 DOM 元素,`type` 表示事件类型(如 click、mouseover 等),`fn` 表示事件处理函数。该函数首先检查目标对象...
在JavaScript中,事件处理程序是用于响应用户或浏览器行为的函数。本文将详细阐述JavaScript中的五种事件处理程序方式,帮助开发者更好地理解和使用这些机制。 1. HTML事件处理程序 这是最基础的事件处理方式,通过...
- `this`关键字在事件处理函数中指向触发事件的元素,有助于访问和操作元素。 - **缺点**: - 只支持事件冒泡阶段,不支持事件捕获。 - 一个元素只能绑定一个事件处理函数,新的绑定会覆盖旧的。 - 在非IE浏览...
其中,`element`是你要添加事件的元素,`eventName`是事件类型(如"click"),`eventHandler`是事件处理函数,`useCapture`是一个可选参数,用于指定事件在捕获阶段还是冒泡阶段执行,默认为`false`。 2. **...
如果支持,那么就使用`addEventListener`添加事件处理函数,参数包括事件类型(如`'click'`)、处理函数以及是否使用捕获阶段(通常为`false`,表示使用冒泡阶段)。对于不支持`addEventListener`的浏览器(主要是IE...
这里,`event` 参数指的是需要监听的事件类型(如'click'、'load'等),`function` 是当事件被触发时要执行的函数,`useCapture` 是一个布尔值,指示事件是否在捕获或冒泡阶段执行。通常,为了更好的性能和兼容性,...
该方法包含三个参数:事件类型、要绑定的函数和一个布尔值参数,用来指定监听器在捕获阶段还是冒泡阶段执行。示例代码如下: ```javascript function addEvent(element, e, fn) { if (element.addEventListener) {...
`type`是事件名称(不带"on"前缀),`listener`是事件处理函数,`useCapture`指定事件是采用冒泡还是捕获(通常用`false`表示冒泡)。 2. `removeEventListener(type, listener, useCapture)`:移除元素上指定类型...
也可以编写一个通用的事件监听函数,如:`function addEvent(element, type, handler) { element.addEventListener(type, handler) }`。 8. DOM 和 BOM 的区别 DOM(Document Object Model)是文档对象模型,用于...