JavaScript中事件的绑定与解绑
目录
零、码仙励志
一、事件的绑定
1. 对象.on事件名字=事件处理函数
2. 对象.addEventListener("没有on的事件名字",事件处理函数,false);
3. 对象.attachEvent("有on的事件名字",事件处理函数);
4.总结绑定事件的区别
5.兼容代码
二、事件的解绑
1.注意(必看)
2.对象.on事件名字=null;
3.对象.removeEventListener("没有on的事件类型",函数名字,false);
4.对象.detachEvent("on事件类型",函数名字);
5.兼容代码
三、事件冒泡
1.解释
2.实例演示
3.阻止事件冒泡 window.event.cancelBubble=true;
4.阻止事件冒泡 e.stopPropagation();
四、事件阶段
五、为同一个元素绑定多个不同的事件,指向相同的事件处理函数
零、码仙励志
行动是治愈恐惧的良药,而犹豫、拖延将不断滋养恐惧
一、事件的绑定
1. 对象.on事件名字=事件处理函数
缺点:如果绑定多个事件,前面的事件会被后面的事件覆盖
<body>
<input type="button" value="按钮" id="btn"/>
<div id="dv"></div>
<script>document.getElementById("btn").onclick = function () {console.log("第一");};document.getElementById("btn").onclick = function () {console.log("第二");};
</script>
</body>
2. 对象.addEventListener("没有on的事件名字",事件处理函数,false);
解释:第三个参数在本篇文章的事件阶段中有解释
优点:可以绑定多个事件
缺点:谷歌和火狐支持,IE8不支持
<body>
<input type="button" value="按钮" id="btn"/>
<div id="dv"></div>
<script>document.getElementById("btn").addEventListener("click", function () {console.log("第一");}, false);document.getElementById("btn").addEventListener("click", function () {console.log("第二");}, false);
</script>
3. 对象.attachEvent("有on的事件名字",事件处理函数);
优点:可以绑定多个事件
缺点:谷歌和火狐不支持,IE8支持
<body>
<input type="button" value="按钮" id="btn"/>
<div id="dv"></div>
<script>document.getElementById("btn").attachEvent("onclik", function () {console.log("第一");});document.getElementById("btn").attachEvent("click", function () {console.log("第二");}, false);
</script>
</body>
4.总结绑定事件的区别
1.方法名不一样
2.参数个数不一样addEventListener三个参数
attachEvent两个参数
3.addEventListener 谷歌,火狐,IE11支持,IE8不支持
ttachEvent 谷歌火狐不支持,IE11不支持,IE8支持
4.this不同,addEventListener 中的this是当前绑定事件的对象
attachEvent中的this是window
5.addEventListener中事件的类型(事件的名字)没有on
attachEvent中的事件的类型(事件的名字)有on
5.兼容代码
<script>//为任意元素.绑定任意的事件, 任意的元素,事件的类型,事件处理函数function addEventListener(element, type, fn) {//判断浏览器是否支持这个方法if (element.addEventListener) {element.addEventListener(type, fn, false);} else if (element.attachEvent) {element.attachEvent("on" + type, fn);} else {element["on" + type] = fn;}};
</script>
测试
<body>
<input type="button" value="第一个按钮" id="btn"/>
<script>//为任意元素.绑定任意的事件, 任意的元素,事件的类型,事件处理函数function addEventListener(element, type, fn) {//判断浏览器是否支持这个方法if (element.addEventListener) {element.addEventListener(type, fn, false);} else if (element.attachEvent) {element.attachEvent("on" + type, fn);} else {element["on" + type] = fn;}}//测试addEventListener(document.getElementById("btn"), "click", function () {console.log("码仙1");});addEventListener(document.getElementById("btn"), "click", function () {console.log("码仙2");});addEventListener(document.getElementById("btn"), "click", function () {console.log("码仙3");});
</script>
</body>
二、事件的解绑
1.注意(必看)
用什么方式绑定事件,就应该用对应的方式解绑事件
1.解绑事件
对象.on事件名字=事件处理函数--->绑定事件
对象.on事件名字=null;
2.解绑事件
对象.addEventListener("没有on的事件类型",命名函数,false);---绑定事件
对象.removeEventListener("没有on的事件类型",函数名字,false);
3.解绑事件
对象.attachEvent("on事件类型",命名函数);---绑定事件
对象.detachEvent("on事件类型",函数名字);
2.对象.on事件名字=null;
<body>
<input type="button" value="第一个按钮" id="btn1"/>
<input type="button" value="干掉第一个按钮的事件" id="btn2"/>
<div id="dv"></div>
<script>document.getElementById("btn1").onclick = function () {console.log("码仙");};document.getElementById("btn2").onclick = function () {document.getElementById("btn1").onclick = null;};
</script>
</body>
3.对象.removeEventListener("没有on的事件类型",函数名字,false);
<body>
<input type="button" value="第一个按钮" id="btn1"/>
<input type="button" value="干掉第一个按钮的事件" id="btn2"/>
<div id="dv"></div>
<script>function f1() {console.log("第一个");};function f2() {console.log("第二个");};document.getElementById("btn1").addEventListener("click", f1, false);document.getElementById("btn1").addEventListener("click", f2, false);//点击第二个按钮把第一个按钮的第一个点击事件解绑document.getElementById("btn2").onclick = function () {//解绑事件的时候,需要在绑定事件的时候,使用命名函数document.getElementById("btn1").removeEventListener("click", f1, false);};
</script>
</body>
4.对象.detachEvent("on事件类型",函数名字);
<body>
<input type="button" value="第一个按钮" id="btn1"/>
<input type="button" value="干掉第一个按钮的事件" id="btn2"/>
<div id="dv"></div>
<script>function f1() {console.log("第一个");};function f2() {console.log("第二个");};document.getElementById("btn1").attachEvent("onclick", f1);document.getElementById("btn1").attachEvent("onclick", f2);document.getElementById("btn2").onclick = function () {document.getElementById("btn1").detachEvent("onclick", f1);};
</script>
</body>
5.兼容代码
//解绑事件的兼容//为任意的一个元素,解绑对应的事件function removeEventListener(element, type, fnName) {if (element.removeEventListener) {element.removeEventListener(type, fnName, false);} else if (element.detachEvent) {element.detachEvent("on" + type, fnName);} else {element["on" + type] = null;}}
测试
<body>
<input type="button" value="按钮" id="btn1"/>
<input type="button" value="干掉第一个按钮的事件" id="btn2"/>
<script>//绑定事件的兼容function addEventListener(element, type, fn) {if (element.addEventListener) {element.addEventListener(type, fn, false);} else if (element.attachEvent) {element.attachEvent("on" + type, fn);} else {element["on" + type] = fn;}}//解绑事件的兼容//为任意的一个元素,解绑对应的事件function removeEventListener(element, type, fnName) {if (element.removeEventListener) {element.removeEventListener(type, fnName, false);} else if (element.detachEvent) {element.detachEvent("on" + type, fnName);} else {element["on" + type] = null;}}function f1() {console.log("第一个");}function f2() {console.log("第二个");}addEventListener(document.getElementById("btn1"), "click", f1);addEventListener(document.getElementById("btn1"), "click", f2);document.getElementById("btn2").onclick = function () {removeEventListener(document.getElementById("btn1"), "click", f1);};
</script>
</body>
三、事件冒泡
1.解释
多个元素嵌套,有层次关系,这些元素都注册了相同的事件,如果里面的元素的事件触发了,外面的元素的该事件自动的触发了
2.实例演示
<head><meta charset="UTF-8"><title>title</title><style>#dv1 {width: 300px;height: 200px;background-color: red;}#dv2 {width: 250px;height: 150px;background-color: green;}#dv3 {width: 200px;height: 100px;background-color: blue;}</style>
</head>
<body>
<div id="dv1"><div id="dv2"><div id="dv3"></div></div>
</div>
<script>document.getElementById("dv1").onclick = function () {console.log(this.id);};document.getElementById("dv2").onclick = function () {console.log(this.id);};document.getElementById("dv3").onclick = function () {console.log(this.id);};
</script>
</body>
点击蓝色div
3.阻止事件冒泡 window.event.cancelBubble=true;
<script>document.getElementById("dv1").onclick = function () {console.log(this.id);};document.getElementById("dv2").onclick = function () {console.log(this.id);//阻止事件冒泡// IE特有的,谷歌支持,火狐不支持window.event.cancelBubble=true;};document.getElementById("dv3").onclick = function () {console.log(this.id);};
</script>
4.阻止事件冒泡 e.stopPropagation();
<script>document.getElementById("dv1").onclick = function () {console.log(this.id);};document.getElementById("dv2").onclick = function (e) {console.log(this.id);//阻止事件冒泡//谷歌和火狐支持e.stopPropagation();};document.getElementById("dv3").onclick = function () {console.log(this.id);};
</script>
四、事件阶段
通过e.eventPhase这个属性可以知道当前的事件是什么阶段你的
如果这个属性的值是:
1---->捕获阶段
2---->目标阶段
3---->冒泡阶段
一般默认都是冒泡阶段,很少用捕获阶段
冒泡阶段:从里向外
捕获阶段:从外向里
addEventListener方法的第三个参数是false的时候是冒泡阶段
addEventListener方法的第三个参数是true的时候是捕获阶段
<head><meta charset="UTF-8"><title>title</title><style>#dv1 {width: 300px;height: 200px;background-color: red;}#dv2 {width: 250px;height: 150px;background-color: green;}#dv3 {width: 200px;height: 100px;background-color: blue;}</style>
</head>
<body>
<div id="dv1"><div id="dv2"><div id="dv3"></div></div>
</div>
<script>//同时注册点击事件var objs = [document.getElementById("dv3"), document.getElementById("dv2"), document.getElementById("dv1")];//遍历注册事件objs.forEach(function (ele) {//为每个元素绑定事件ele.addEventListener("click", function (e) {console.log(this.id + "====>" + e.eventPhase);}, false);});
</script>
</body>
点击蓝色div
addEventListener方法的第三个参数是true的时候,点击蓝色div
五、为同一个元素绑定多个不同的事件,指向相同的事件处理函数
<body>
<input type="button" value="码仙" id="btn"/>
<script>//为同一个元素绑定多个不同的事件,指向相同的事件处理函数document.getElementById("btn").onclick = f1;document.getElementById("btn").onmouseover = f1;document.getElementById("btn").onmouseout = f1;function f1(e) {switch (e.type) {case "click":alert("好帅哦");break;case "mouseover":this.style.backgroundColor = "red";break;case "mouseout":this.style.backgroundColor = "green";break;}}
</script>
</body>
本篇博客来自于传智播客视频教程的总结以及笔记的整理,仅供学习交流,切勿用于商业用途,如有侵权,请联系博主删除,博主QQ:194760901
JavaScript中事件的绑定与解绑相关推荐
- vue:组件自定义事件、绑定、解绑事件
vue:组件自定义事件.绑定.解绑事件 自定义组件绑定事件: 使用方法:在引入组件中的methods定义一个回调方法,在组件标签中使用如下两种方式自定义事件,去到引入的组件的中,使用 this.$em ...
- js 事件(绑定、解绑、三个阶段、相关方法)
事件绑定与解绑: DOM0级事件(这类事件可以使用 return false来阻止事件往下执行,包含默认事件) 绑定: html内<input οnclick=''> js中el.οncl ...
- js元素事件的绑定与解绑,绑定事件的区别
一.元素事件的绑定 第一种方式 /** * @param {*} element 元素 * @param {*} type 事件类型* @param {*} fn 事件处理函数 */ element[ ...
- JS中事件的绑定和解绑
JS中事件的绑定和解绑 一. 了解事件 1. 事件的三要素 2. 事件绑定分类 2-1. dem0级 事件 2-2. dom2级 事件 二. 事件的绑定 1. dom0级 事件 2. dom2级 事件 ...
- 组件的自定义事件(绑定、解绑)
温馨提示:总结在最下方,如若不想看代码,请滚动至最下方查看相关知识点,谢谢! App.vue <template><div class="app">< ...
- jQuery事件绑定与解绑
一.jQuery事件 方法 描述 执行时机 click() 触发或将函数绑定到指定元素的click事件 单击鼠标时 dblclick() 触发或将函数绑定到指定元素的dblclick事件 双击鼠标时 ...
- jQuery的绑定与解绑方法
jQuery的4种绑定方法 一.bind()与unbind() I.bind():绑定 1.定义 2.语法 3.参数 4.案例 (1)绑定单一事件 (2)绑定多个事件 II.unbind():解绑 1 ...
- Android 蓝牙开发(扫描设备、绑定、解绑)Kotlin版
Kotlin版 蓝牙开发 (扫描设备.绑定.解绑) 前言 运行效果图 正文 ① 配置项目 ② 布局和样式 ③ 编码 1. 通知栏样式修改 2. 蓝牙设备列表适配器编写 3. 权限请求 4. 初始化蓝牙 ...
- Android 蓝牙开发(扫描设备、绑定、解绑)
Android 蓝牙开发(扫描设备.绑定.解绑) 前言 效果图 一.配置项目 二.布局和样式 三.编码 四.源码 前言 公司最近给我丢了一个蓝牙开发的项目,不了解怎么办呢,那当然是从最基础的开始了,所 ...
最新文章
- 如何修改计算机网络时间,在Win7系统中,电脑时间改不了怎么办?
- 基于centos6.7的docker私有仓库搭建
- Jquery对象和DOM对象---Jquery API (1)
- 查询oracle 数据库中回滚段中一个时间点被修改的表数据并还原表中原来数据
- 【文本匹配】Question Answering论文
- signature=6c079696129d622a67d7c54abb9b893c,合肥2017年1月24日至2017年2月10日交通违章查询...
- imx6ul linux4,iMX6UL 4秒快速启动-飞凌嵌入式iMX6UL启动加速
- KNN算法(10折交叉验证)
- MySQL创建网吧管理系统_java网吧信息管理系统
- 坐标变换(5)—用旋转轴和旋转角表示旋转
- torch.cat()函数的官方解释,详解以及例子
- 复制带随机指针的链表<难度系数⭐⭐>
- 计算机无法安装蓝牙设备,笔记本蓝牙无法添加设备解决方法
- XP的点滴(C语言)
- esb和eai的区别
- 记住这曾经平静美好的小城-汶川(组图)
- 下列关于python的说法正确的是_1.??下列关于Python2.x和Python3.x的说法,正确的是()...
- 栈:栈的基本操作总结
- Linux 驱动开发研究
- P1143 飘飘乎居士的约会
热门文章
- python计算球体体积_鬼斧神工:求n维球的体积
- IntelliJ IDEA在Mac下格式化代码快捷键
- git仓库服务器SSH认证示例
- C++Primer 第9章 顺序容器
- 苹果手机越狱软件_俄罗斯要求 iPhone 预装本国软件,苹果称等同于越狱无法接受...
- MySQL报错:SQL错误[1146][42s02]: Table 'tablename' doesn't exist(记一次以为自己删库的经历)
- JAVA点餐系统计算机毕业设计Mybatis+系统+数据库+调试部署
- 快鲸公寓管理系统:职业房东、公寓运营商的共同选择
- MultiMC的离线模式启动
- ilm 和dlm差异_NetPro 耐特普羅資訊:技術應用 / 漫談ILM與DLM-3 由DLM著手落實ILM的精神...