第一种:

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事件绑定的两种形式的更多相关文章

  1. js事件绑定的几种方式与on()、bind()的区别

    版权声明:本文为博主原创文章,未经博主允许不得转载 一直不是很理解几种js事件绑定之间的区别与联系,今天百度了一下,在此做一总结: 1.如果只是简单的绑定一个事件,可以直接写在行内,点击执行一个函数, ...

  2. js事件绑定的几种方式

    在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数 一. 在DOM元素中直接绑定 这里的DOM元素,可以理解为HTM ...

  3. JS事件绑定的三种方式比较

    js事件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  4. JS 事件绑定的几种方式 小笔记

    第一种 var test=document.getElementById('add'); add.onclick=function(){ alert('1'); } 直接在对象上注册事件 缺点:如果我 ...

  5. js事件绑定及深入

    学习要点: 1.传统事件绑定的问题2.W3C事件处理函数3.IE事件处理函数4.事件对象的其他补充 事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型),一种是现代事件绑定(DOM2级模型).现 ...

  6. 巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式&&onblur和onfocus事件&&window.onload解释&&小米商城讲解

    1.回顾上节内容(JavaScript) 一.JavaScript概述 1.ECMAScript和JavaScript的关系 2.ECMAScript的历史 3.JavaScript是一门前后端都可以 ...

  7. JS中事件绑定的三种方式

    以下是搜集的在JS中事件绑定的三种方式.   1. HTML onclick attribute     <button type="button" id="upl ...

  8. 原生JS事件绑定方法以及jQuery绑定事件方法bind、live、on、delegate的区别

    一.原生JS事件绑定方法: 1.通过HTML属性进行事件处理函数的绑定如: <a href="#" onclick="f()"> 2.通过JavaS ...

  9. js课程 5-13 js事件绑定和鼠标事件注意事项有哪些

    js课程 5-13  js事件绑定和鼠标事件注意事项有哪些 一.总结 一句话总结:js代码的灵魂就是改变标签的属性和样式,就这两种. 1.js触发改的东西是哪两样? 属性和样式 2.js如何让页面用标 ...

随机推荐

  1. CMDB表结构设计

    服务器 内存.cpu.disk.nic.raid.sn.model.os.status. disk_info = { } SERVER001 storage .... NET001 网络设备 eth ...

  2. 容器"共享"宿主机的hosts文件(终极方案)

    0.背景 有时候制作docker镜像生成容器时需要宿主机的hosts文件共享到容器中.首先想的是通过挂载的方式共享hosts文件,但是实践时发现根本行不通,hosts文件在/etc/目录下,如进行挂载 ...

  3. C语言 - C语言简介

    一.C语言的发展史 C语言的发展离不开B语言,我们先从B语言说起.在1970年时,贝尔实验室的肯.汤姆逊将BCPL语言进行修改,由于肯.汤姆逊是从BCPL语言进行修改,因此,此时B语言就诞生了,B的含 ...

  4. ant design Radio.Group defaultValue 默认选中没生效

    版本问题 (3.10.7 版本中使用 defaultValue) <div> <Radio.Group defaultValue="a" buttonStyle= ...

  5. springboot(一).初识springboot以及基本项目搭建

    初识springboot 以及基本项目搭建 由于新的项目需要搭建后台框架,之前的springmvc架构也使用多次,在我印象中springboot的微服务架构更轻量级更容易搭建,所以想去试试spring ...

  6. Spring Boot教程(二)关于RabbitMQ服务器整合

    准备工作 15min IDEA maven 3.0 在开始构建项目之前,机器需要安装rabbitmq,你可以去官网下载,http://www.rabbitmq.com/download.html ,如 ...

  7. [C++基础] 纯虚函数

    整理摘自https://blog.csdn.net/ithomer/article/details/6031329 1. 申明格式 class CShape { public: ; }; 在普通的虚函 ...

  8. es之文档更新过程中并发冲突问题

    1:乐观锁控制 ES是分布式的,也是异步并发的,我们的复制请求是并行发送的:这就意味着请求到达目的地的顺序是不可控制的,是乱序的: 如果是乱序的方式,很有可能出现这样的一个问题,新version的文档 ...

  9. [BZOJ2791]:[Poi2012]Rendezvous(塔尖+倍增LCA)

    题目传送门 题目描述 给定一个有n个顶点的有向图,每个顶点有且仅有一条出边.每次询问给出两个顶点${a}_{i}$和${b}_{i}$​​,求满足以下条件的${x}_{i}$和${y}_{i}$:   ...

  10. HBuilder使用逍遥Android模拟器

    Microvirt HBuilder使用逍遥Android模拟器 1.逍遥模拟器安装 地址: 点我下载 2.连接注意事项 a. 复制adb等文件 HBuilder安装目录中tools文件夹下的三个文件 ...