JavaScript-5.2-JavaScript 事件-JavaScript 的事件模型

JavaScript 的事件模型

  • 在 JavaScript 中事件的半丁方式被称为“事件模型”

一:DOM0 事件模型

  • DOM0 事件模型是最早诞生的事件模型,也是最常用的事件绑定方式

1、内联模型

  • 内联模型又称为“行内绑定”,其绑定事件的方式是直接将函数名作为 HTML 标签某个事件的属性值
<button onclick="func()">按钮</button>

缺点:
违反 W3C 关于 HTML 与 JavaScript 分离的基本原则

2、脚本模型

  • 脚本模型又被称为“动态绑定”
  • 通过在 JavaScript 中选中一个节点,并给节点的 onclick 事件添加监听函数
// 给 window 对象添加 onload 事件
window.onload = function(){}

// 选中 div 节点,并添加 onclick 事件
document.getElementById("div").onclick = function(){}

优点:
实现了 HTML 与 JavaScript 分离,符合 W3C 的基本原则

缺点:
1.同一节点只能绑定一个同类型事件,如果绑定多次,则只有最后一次生效
2.一旦绑定事件,无法取消事件绑定

二:DOM2 事件模型

1、添加事件绑定

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>DOM2 事件模型</title>
</head>
<body>
	<div>
		<button id="btn1">点击点击</button>
	</div>
</body>
<script type="text/javascript">
	var btn1 = document.getElementById('btn1'); // 获取 button 元素节点
	
	if(btn1.attachEvent){
		// 判断浏览器是否支持 attachEvent,
		btn1.attachEvent("onclick",function(){
		alert("嘻嘻");
		});
	}else{
		// 否则使用 addEventListener 进行绑定
		btn1.addEventListener("click",function(){
			alert("嘻嘻");
		},false);
	}
</script>
</html>

效果动态图
在这里插入图片描述

  • 针对浏览器版本不同,有两种不同的绑定方式
(1) attachEvent()
var btn = document.getElementById('btn1');
btn.attachEvent("onclick",function(){
	// onclick 触发时执行的回调函数
});
  • 主要针对 IE8 之前的浏览器
  • attachEvent() 接收两个参数
    • 第一个参数是触发的事件类型,主要事件名称需要用“on”开头
    • 第二个参数是触发事件时执行的回调函数
(2) addEventListener
var btn = document.getElementById("btn");
btn.addEventListener("click",function(){
	// click 触发时执行的回调函数
},true/false);
  • 除 IE8 之外的其他浏览器,统一使用 W3C 规范
  • addEventListener() 接收三个参数
    • 第一个参数是触发的事件类型,主要事件名称不需要用“on”开头
    • 第二个参数是触发事件时执行的回到函数
    • 第三个参数是模型参数,表示事件冒泡或事件捕获
      • false(默认):表示事件冒泡
      • true:表示事件捕获
(3) 兼容写法
var btn = document.getElementById('btn');
if(btn.attachEvent){
	btn.attachEvent("onclick",function{
		// onclick 触发时执行的回调函数
	});
}else{
	btn.addEventListener("click",function(){
		// click 触发时执行的回调函数
	},true/false);
}

2、取消事件绑定

  • DOM2 绑定的事件可以取消事件绑定
  • 如果要取消事件绑定,那么在绑定事件时,回调函数必须使用有名函数,而不能使用匿名函数
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>DOM2 事件模型</title>
</head>
<body>
	<div>
		<button id="btn1">点击点击</button>
	</div>
</body>
<script type="text/javascript">
	var btn1 = document.getElementById('btn1'); // 获取 button 元素节点

	// onclick 触发的函数
	function clickFunction(){
		alert("嘻嘻");
	}
	
	// 事件绑定
	if(btn1.attachEvent){
		// 判断浏览器是否支持 attachEvent,
		btn1.attachEvent("onclick",clickFunction);
	}else{
		// 否则使用 addEventListener 进行绑定
		btn1.addEventListener("click",clickFunction,false);
	}

	// 取消事件绑定
	if(btn1.attachEvent){
		btn1.detachEvent("onclick",clickFunction);
	}else{
		btn1.removeEventListener("click",clickFunction);
	}
</script>
</html>

为什么绑定的时候不能使用匿名函数作为回调函数呢
1.取消事件绑定的时候,语法要求必须传入需要取消的函数名
2.而匿名函数没有函数名

(1) detachEvent()
  • 针对 IE8 之前使用 attachEvent() 绑定的事件
btn.detachEvent("onclick",函数名);
(2) removeEventListener()
  • 针对其他浏览器使用 addEventListener() 绑定的事件
btn.removeEventListener('click',函数名);

3、DOM2 事件模型的优点

  • 实现了 HTML 与 JavaScript 的分离,符合 W3C 关于内容与行为分离的要求
  • 实现 DOM2 绑定的事件,可以取消事件绑定
  • 使用 DOM2 可以为同一节点添加多个同类型事件,多个事件可以同时生效,而不会被覆盖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值