JavaScript事件监听机制

本文深入解析JavaScript事件监听机制,包括如何在同一个对象上绑定多个事件监听函数,以及不同浏览器环境下事件监听的兼容性问题,并提供了解决方案。通过实例演示了如何使用addEventListener、attachEvent和封装事件监听函数,确保代码在不同浏览器中都能正常工作。

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

初学JavaScript时,会用这样的方法监听事件

<html>
	<head>
		<meta charset="utf-8">
		<title>js事件监听机制</title>
	</head>
	<body>
		<input type="button" value="click me!" id="btn-1">
		<script type="text/javascript">
			btn1 = document.getElementById("btn-1");
			btn1.onclick = function(){
				alert("第一次点击按钮");
			}
			btn1.onclick = function(){
				alert("第二次点击按钮");
			}
		</script>
	</body>
</html>

然而和想象中的结果并不相同,当点击按钮时,弹出窗口这样显示


这是因为当同一个对象用.onclick触发多个写法时,后面的方法会把前面的覆盖掉,当事件发生时,只会执行最后的绑定方法,在上面的例子中,后面的方法把前面的覆盖了,所以只出现了一个窗口。


对于这种现象,我们可以用以下的方式来解决

1.addEventListener

语法

target.addEventListener(type, listener, useCapture);

target:文档节点

type:事件名称,不含on,例如click,keydown

listener:调用的函数

useCapture:是否绑定在捕获阶段,默认为falsel

示例代码

<html>
	<head>
		<meta charset="utf-8">
		<title>js事件监听机制</title>
	</head>
	<body>
		<input type="button" value="click me!" id="btn-1">
		<script type="text/javascript">
			function eventFirst(){
					alert("第一次点击按钮");
				}
				function eventSecond(){
					alert("第二次点击按钮");
				}
			window.onload = function(){
				btn1 = document.getElementById("btn-1");
				btn1.addEventListener("click", eventFirst);
				btn1.addEventListener("click", eventSecond);
			}

		</script>
	</body>
</html>
当点击按钮时,出现如下情况



点击确定


依次输出第一个监听事件和第二个监听事件

解除事件绑定

<span style="font-size:18px;">btn1.removeEventListener("click", eventFirst);</span>

这样就解除了第一个监听事件的绑定

当点击按钮时,只输出第二个监听事件

注意:解除事件绑定时一定要用函数的句柄,否则解绑无效

2.attachEvent

IE浏览器使用attachEvent来绑定事件

语法

target.attachEvent(type, listener);

target:文档节点

type:事件名称,带on,比如onclick,onkeydown等等

listener:调用的函数

3.兼容各大主流浏览器的写法

通过以上的实验,最终对函数进行封装

代码如下

<html>
	<head>
		<meta charset="utf-8">
		<title>js事件监听机制</title>
		<style type="text/css">
		#box{
			height:100px;
			width:100px;
			background-color:red;
		}
		</style>
	</head>
	<body>
		<div id="box">
			<input type="button" value="click me!" id="btn-1">
		</div>
		<script type="text/javascript">
			//监听元素事件函数
			function addEventHandler(target, type, func){
				if(target.addEventListener){
					//兼容IE9,Firefox以及Chrome
					target.addEventListener(type, func, false);
				}else if(target.attachEvent){
					//版本较低的IE浏览器
					target.attachEvent("on" + type, func);
				}else{
					target["on" + type] = func;
				}
			}
			//解除事件监听
			function removeEventHandler(target, type, func){
				if(target.removeEventListener){
					target.removeEventListener(type, func, false);
				}else if(target.detachEvent){
					target.detachEvent("on" + type, func);
				}else{
					delete target["on" + type];
				}
			}
			function eventFirst(){
				alert("点击按钮");
			}
			function eventSecond(){
				alert("点击div");
			}
			window.onload = function(){
				btn1 = document.getElementById("btn-1");
				box1 = document.getElementById("box");
				//给按钮添加监听事件
				addEventHandler(btn1, "click", eventFirst);
				//给div添加监听事件
				addEventHandler(box, "click", eventSecond);
				//解除div的监听事件
				removeEventHandler(box, "click", eventSecond);
			}
		</script>
	</body>
</html>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值