大师推荐的经典方法(持续更新)

本文介绍了三种跨浏览器的事件处理方法:John Resig的addEvent/removeEvent,Jeremy Keith的load方法,以及Dean Edwards改进的addEvent/removeEvent。Dean Edwards的方法在不同浏览器中表现一致,并妥善处理了this关键字和事件对象传递等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录:

1, John Resig自己获奖的addEvent/removeEvent方法;
2, Jeremy Keith的load方法;
3, Dean Edwards修改版的addEvent/removeEvent方法。



1, 下面是JQuery之父推荐的添加移除事件方法。

/*
*obj 要绑定事件的对象
*type 事件类型,指"click", "load", "submit", "mouseover"等
*fn 函数名
*/
function addEvent( 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 );
}
/*
*obj 要删除事件的对象
*type 事件类型,指"click", "load", "submit", "mouseover"等
*fn 函数名
*/
function removeEvent( obj, type, fn )
{
if ( obj.detachEvent )
{
obj.detachEvent( 'on' + type, obj[type + fn] );
obj[type + fn] = null;
}
else
obj.removeEventListener( type, fn, false );
}


//addEvent( document.getElementById('foo'), 'click', doSomething );


我都没怎么翻译,大家可以看原文:http://ejohn.org/apps/jselect/event.html。

2, 下面是在Dom Scripting书上介绍的添加启动事件的方法addLoadEvent(func)。

<script language="javascript" type="text/javascript">

function addLoadEvent(func)
{
var oldonload = window.onload;

if (typeof window.onload != 'function')
{
window.onload = func;
}
else
{
window.onload = function()
{
oldonload();
func();
}
}
}

function event1() {alert("function 1!");}
function event2() {alert("function 2!");}
function event3() {alert("function 3!");}
function event4() {alert("function 4!");}
function event5(msg) {alert(msg)}

addLoadEvent(event1);
addLoadEvent(event2);
addLoadEvent(event3);
addLoadEvent(event4);
//参数传递的方式
addLoadEvent(function(){ event5('myArgument') });

</script>


3, 周六借了本《Pro JavaScript Techniques》来看,没有想到John Resig大大推荐了Dean Edwards的addEvent()方法,而没推荐自己更精简的作品,他这样评价Edwards的addEvent()的:
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函数:

// http://dean.edwards.name/weblog/2005/10/add-event/

function addEvent(element, type, handler) {
if (element.addEventListener) {
element.addEventListener(type, handler, false);
} else {
// 为每一个事件处理函数赋予一个独立的ID
if (!handler.$$guid) handler.$$guid = addEvent.guid++;
// 为元素建立一个事件类型的Hash表
if (!element.events) element.events = {};
// 为每对元素/事件建立一个事件处理函数的Hash表
var handlers = element.events[type];
if (!handlers) {
handlers = element.events[type] = {};
// 存储已有的事件处理函数(如果已存在一个)
if (element["on" + type]) {
handlers[0] = element["on" + type];
}
}
// 在Hash表中存储该事件处理函数
handlers[handler.$$guid] = handler;
// 赋予一个全局事件处理函数来处理所有工作
element["on" + type] = handleEvent;
}
};
// 创建独立ID的计数器
addEvent.guid = 1;

function removeEvent(element, type, handler) {
if (element.removeEventListener) {
element.removeEventListener(type, handler, false);
} else {
// 从Hash表中删除事件处理函数
if (element.events && element.events[type]) {
delete element.events[type][handler.$$guid];
}
}
};

function handleEvent(event) {
var returnValue = true;
// 获取事件处理对象(IE使用全局的事件对象)
event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
// 获取事件处理函数Hash表的引用
var handlers = this.events[event.type];
// 依次处理每个事件处理函数
for (var i in handlers) {
this.$$handleEvent = handlers[i];
if (this.$$handleEvent(event) === false) {
returnValue = false;
}
}
return returnValue;
};
//增加一些IE事件对象的缺乏的方法
function fixEvent(event) {
// 增加W3C标准事件方法
event.preventDefault = fixEvent.preventDefault;
event.stopPropagation = fixEvent.stopPropagation;
return event;
};
fixEvent.preventDefault = function() {
this.returnValue = false;
};
fixEvent.stopPropagation = function() {
this.cancelBubble = true;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值