JS事件绑定的两种形式
第一种:
obj.on*=function(){}
var btn=document.getElementById('myBtn');
btn.onclick=function(){
alert(1);
}
这种方法是很常用,就是将一个函数赋值给一个事件处理程序。
它的优点是简单,然后具有跨浏览器的优势,现代所有浏览器都支持。
如果要取消这种形式绑定的事件,可以将事件处理程序属性的值设为null:
btn.onclick=null; //删除事件处理程序
但是,这种形式的绑定有一个缺点,那就是不能在同一个对象上绑定两个事件,如下:
oDiv1.onclick=function(){
alert(1);
}
oDiv1.onclick=function(){
alert(2);
} //
上面代码在同一对象上分别绑定了两个事件,结果只弹出2,是因为后面绑定的事件会覆盖前面的事件。
要想在一个对象上同时绑定两个事件或多个事件,就需要第二种绑定形式了。
第二种:
这种形式称为“DOM2级事件”,定义了两个方法:addEventListener()和removeEventListener()。
他们都接受3个参数:
第一个参数:要处理的事件类型名称;
第二个参数:处理程序的函数;
第三个参数:布尔值,表示是否捕获,true则为捕获,false则为冒泡。
例:
var btn=document.getElementById('myBtn');
btn.addEventListener('click',function(){
alert(1);
},false);
通过addEventListener()添加的事件只能通过removeEventListener()来删除,
尤其注意的是,传入的匿名函数无法被删除,比如要删除上面代码绑定的事件,
btn.removeEventListener('click',function(){
alert(1);
},false)
这样写是没有用的,看似删除的是同一个处理函数,但其实是两个不同的函数了,虽然长的一样。
所以通常这样写:
var btn=document.getElementById('myBtn');
var show=function(){
alert(1);
}
btn.addEventListener('click',show,false);
//btn.removeEventListener('click',show,false);
同时,它可以在一个对象上绑定多个事件:
var show=function(){
alert(1);
}
var show2=function(){
alert(2);
}
btn.addEventListener('click',show,false); //
btn.addEventListener('click',show2,false); //
兼容:
addEventListener() 和 removeEventListener()不支持IE8及其以下版本,对于低版本IE,同样有两个方法:
attachEvent() 和 detachEvent(),他们各自接收两个参数:事件处理程序名称和事件处理函数。
因为IE8和更早版本只支持事件冒泡,所以通过这种方法添加的事件处理程序都会被添加到冒泡阶段。
var btn=document.getElementById('myBtn');
var show=function(){
alert(1);
}
btn.attachEvent('onclick',show);
//btn.detachEvent('onclick',show);
同样,删除时也必须提供相同参数,即传入匿名函数不能被删除,如上写法正确。
注意事件类型名称,要加上‘on’。
同时,它也可以在一个对象上绑定两个事件,但结果略微不同:
var btn=document.getElementById('myBtn');
var show=function(){
alert(1);
}
var show2=function(){
alert(2);
}
btn.attachEvent('onclick',show); //
btn.attachEvent('onclick',show2); //
在IE8及其以下版本,可以执行这段代码,但弹出结果是倒序的,即先弹出2,再弹出1。
我在IE9和IE10下测试,弹出结果又是正序的,先弹出1,再弹出2。
IE11不支持这个方法,同样Chrome和火狐也不支持。
总结!!!
标准浏览器(含ie): obj.addEventListener(事件名称,事件函数,是否捕获)
1.有捕获
2.事件名称没有on
3.事件执行的顺序是正序
4.this指向触发该事件的对象
ie: obj.attachEvent(事件名称,事件函数)
1.没有捕获
2.事件名称有on
3.事件函数执行的顺序:标准ie正序,非标准ie倒序
4.this指向window
关于this问题,可以通过call()方法修改。
JS事件绑定的两种形式的更多相关文章
- js事件绑定的几种方式与on()、bind()的区别
版权声明:本文为博主原创文章,未经博主允许不得转载 一直不是很理解几种js事件绑定之间的区别与联系,今天百度了一下,在此做一总结: 1.如果只是简单的绑定一个事件,可以直接写在行内,点击执行一个函数, ...
- js事件绑定的几种方式
在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数 一. 在DOM元素中直接绑定 这里的DOM元素,可以理解为HTM ...
- JS事件绑定的三种方式比较
js事件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...
- JS 事件绑定的几种方式 小笔记
第一种 var test=document.getElementById('add'); add.onclick=function(){ alert('1'); } 直接在对象上注册事件 缺点:如果我 ...
- js事件绑定及深入
学习要点: 1.传统事件绑定的问题2.W3C事件处理函数3.IE事件处理函数4.事件对象的其他补充 事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型),一种是现代事件绑定(DOM2级模型).现 ...
- 巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式&&onblur和onfocus事件&&window.onload解释&&小米商城讲解
1.回顾上节内容(JavaScript) 一.JavaScript概述 1.ECMAScript和JavaScript的关系 2.ECMAScript的历史 3.JavaScript是一门前后端都可以 ...
- JS中事件绑定的三种方式
以下是搜集的在JS中事件绑定的三种方式. 1. HTML onclick attribute <button type="button" id="upl ...
- 原生JS事件绑定方法以及jQuery绑定事件方法bind、live、on、delegate的区别
一.原生JS事件绑定方法: 1.通过HTML属性进行事件处理函数的绑定如: <a href="#" onclick="f()"> 2.通过JavaS ...
- js课程 5-13 js事件绑定和鼠标事件注意事项有哪些
js课程 5-13 js事件绑定和鼠标事件注意事项有哪些 一.总结 一句话总结:js代码的灵魂就是改变标签的属性和样式,就这两种. 1.js触发改的东西是哪两样? 属性和样式 2.js如何让页面用标 ...
随机推荐
- DevOps之持续集成SonarQube代码质量扫描
一.SonarQube介绍 SonarQube是一个用于代码质量检测管理的开放平台,可以集成不同的检测工具,代码分析工具,以及持续集成工具.SonarQube 并不是简单地把不同的代码检查 ...
- node.js入门学习(三)--npm
一.npm介绍 1)npm:node package manager是node.js默认的以js编写的软件包管理系统 官网:www.npmjs.com 文档:docs.npmjs.com 2)提到np ...
- spring自带工具类
在spring-core.jar包中,org.springframework.util package下有很多工具类,这些工具类十分具有参考意义.
- Mac 找文件或文件夹,以及开启其他程序,截图快捷键
Mac 图形化界面对操作惯 Win 的人来说比较奇怪. 有一组超级有用的快捷键,control + 空格 按下后会出现一个搜索框,输入计算机上任何你想要找的资源即可打开. 截取全屏:快捷键(Shift ...
- Android图片上传(头像裁切+原图原样)
下面简单铺一下代码: (一)头像裁切.上传服务器(代码) 这里上边的按钮是头像的点击事件,弹出底部的头像选择框,下边的按钮跳到下个页面,进行原图上传. ? 1 2 3 4 5 6 7 8 9 10 1 ...
- Python3学习笔记(七):字典
在python中,有一种通过名字来引用值的数据结构,这种类型的数据结构成为映射. 字典是Python中唯一内建的映射类型,具有以下特点: 字典中的值是无序的 值存在特定的键(key)下 键(key)可 ...
- Python 写 ACM 题目的一些技巧
目录 输入输出 input() 输入 split() 用于输入 strip() 输入清理 print() 输入 sort 排序 输入输出 input() 输入 Python3 中 input() 函数 ...
- 条形码(barcode)code128生成代码
条形码(barcode)code128生成代码 很简单 多些这位兄弟https://bbs.csdn.net/topics/350125614 下面是我的DEMO 直接放到VS2005下面编译即可 # ...
- c++11多线程---线程入口函数
1.普通函数(线程入口) #include <thread> #include <iostream> void hello(const char *name) { std::c ...
- ThreadLocal 源码分析
线程局部变量 ThreadLocal 用于实现线程隔离和类间变量共享. 创建实例 /** * 当前 ThreadLocal 实例的哈希值 */ private final int threadLoca ...