浅谈window.attachEvent

本文详细解释了JavaScript中使用attachEvent和addEventListener方法为事件指派多个处理过程的方法,包括这两种方法的差异、使用场景及示例代码。

以前写 JavaScript 脚本时,事件都是采用
object.event = handler;
的方式初始化。这种方式对于 Internet Explorer、Mozilla/Firefox 和 Opera 来说很通用。但是有一个问题就是,这种方式只能一个事件对应一个事件处理过程。如果希望一个事件可以依次执行多个处理过程就不好用了。

但是 Internet Explorer 从 5.0 开始提供了一个 attachEvent 方法,使用这个方法,就可以给一个事件指派多个处理过程了。attachEvent 对于目前的 Opera 也适用。但是问题是 Mozilla/Firefox 并不支持这个方法。但是它支持另一个 addEventListener 方法,这个方法跟 attachEvent 差不多,也是用来给一个事件指派多个处理过程的。但是它们指派的事件有些区别,在 attachEvent 方法中,事件是以 “on” 开头的,而在 addEventListener 中,事件没有开头的 “on”,另外 addEventListener 还有第三个参数,一般这个参数指定为 false 就可以了。

因此要想在你的程序中给一个事件指派多个处理过程的话,只要首先判断一下浏览器,然后根据不同的浏览器,选择使用 attachEvent 还是 addEventListener 就可以了。实例如下:

 

            if (window.attachEvent) {
                window.attachEvent("onload", remove);
            } else if (window.addEventListener) {
                window.addEventListener("load", remove, false);  
            }            
            function remove() {
                var div = document.getElementById("divprogressbar");
                document.body.removeChild(div);
            }

=============或者也可以用

if (document.all){window.attachEvent('onload',remove)}//IE
else{window.addEventListener('load',remove,false);} //FireFox

注意:attachEvent 所指派的多个过程的执行顺序是随机的,所以这几个过程之间不要有顺序依赖。另外 attachEvent 和 addEventListener 不仅仅适用于 window 对象,其他的一些对象也支持该方法。

转载于:https://www.cnblogs.com/9988/archive/2011/12/06/2278573.html

你遇到的错误信息 `n.attachEvent is not a function` 通常出现在尝试在支持 `attachEvent` 的对象上调用该方法时。`attachEvent` 是 Internet Explorer(IE)早期版本(主要是 IE8 及更早)中用于绑定事件的非标准方法。现代浏览器使用标准的 `addEventListener` 方法来绑定事件。 --- ### 常见原因 1. **尝试在非DOM元素上调用 `attachEvent`** 比如,`n` 可能是一个普通的 JavaScript 对象或函数,而是一个 DOM 元素。 2. **代码兼容性问题** 有些旧的库或代码片段试图使用 `attachEvent` 来兼容旧版 IE,但如果你在现代浏览器中运行这段代码,就会出错。 3. **第三方库兼容性问题** 使用了一些老旧的 JavaScript 插件或脚本,它们没有做浏览器兼容性检测。 --- ### 解决方案 #### ✅ 推荐使用 `addEventListener` 来绑定事件 ```javascript // 正确方式:使用 addEventListener var element = document.getElementById('myButton'); if (element.addEventListener) { element.addEventListener('click', function() { console.log('按钮被点击了'); }); } else if (element.attachEvent) { // 兼容旧版IE element.attachEvent('onclick', function() { console.log('按钮被点击了'); }); } ``` #### ✅ 更加健壮的写法(自动检测浏览器支持) ```javascript function addEvent(element, eventName, handler) { if (element.addEventListener) { element.addEventListener(eventName, handler, false); } else if (element.attachEvent) { element.attachEvent('on' + eventName, handler); } else { element['on' + eventName] = handler; } } // 使用示例 var btn = document.getElementById('myButton'); addEvent(btn, 'click', function() { console.log('按钮被点击了'); }); ``` --- ### 常见错误写法示例 ```javascript var n = {}; n.attachEvent('click', function() {}); // 错误:n 是 DOM 元素 ``` --- ### 如何调试 1. 打开浏览器开发者工具(F12) 2. 查看报错的代码位置 3. 检查 `n` 是什么对象:`console.log(n)` 4. 确保 `n` 是一个有效的 DOM 元素 --- ### 相关问题 1. `addEventListener` 和 `attachEvent` 的区别是什么? 2. 如何判断一个对象是否是 DOM 元素? 3. 如何兼容 IE8 及以下浏览器的事件绑定? 4. `addEventListener` 的第三个参数 `useCapture` 是什么意思? --- 如果你能提供具体的代码片段,我可以更准确地帮你定位问题所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值