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

上面代码在同一对象上分别绑定了两个事件,结果只弹出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);  //1
btn.addEventListener(‘click‘,show2,false);  //2

兼容:

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);   //1
btn.attachEvent(‘onclick‘,show2);  //2

在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()方法修改。

时间: 2024-10-14 23:56:53

JS事件绑定的两种形式的相关文章

事件绑定的两种形式

到现在我学习的事件函数绑定对象都是使用的obj.on事件名称=函数名 这是我今天学习的第一种事件函数绑定对象方法. 这种方法有一个缺点就是这个对象的同意个事件只能绑定一个函数,那么就需要第二种事件函数绑定对象的方法了. 第二种方法存在着兼容性的问题ie:obj.attachEvent(事件名称,事件函数);//ie的非标准下顺序是倒序,事件名称有on前缀标准:obj.addEventListener(事件名称,事件函数,是否捕获)://事件名称没有on前缀是否捕获:默认是false false:

事件绑定的第二种形式

一.过去,给一个对象绑定一个事件,来处理函数的形式,如obj.onclick=fn1,我们称之为事件绑定的第一种形式(赋值形式). 这种形式的有一种缺点就是:同一个对象的同一个事件不能同时处理两个不同的函数. 例如: function fn1(){ alert("A") } function fn2(){ alert("B") } document.onclick=fn1; document.onclick=fn2;//后面一个事件会覆盖前面一个事件 二.为了解决上

事件绑定的第二种形式 & call

<script> //call 函数下的一个方法,call方法第一个参数可以改变函数执行过程中的内部this的指向,call方法第二个参数开始就是原来函数的参数列表. function fn1(a, b) { alert(this); alert(a + b); } fn1(); //window fn1.call(null, 10, 20); //调用函数 fn1() == fn1.call() </script> <script> //给一个对象绑定一个事件处理函数

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

js事件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> body{ width:100%; height:100%; } input{ display: block; margin-bottom:10px; } .active{ color:

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

第一种 var test=document.getElementById('add'); add.onclick=function(){ alert('1'); } 直接在对象上注册事件 缺点:如果我想给add再加onchange 就会覆盖掉前面的onclick 优点:简单方便明了 第二种 var test=document.getElementById('add'); add.addEventListener('click',eve,false); function eve(){ alert(

js事件绑定及深入

学习要点: 1.传统事件绑定的问题2.W3C事件处理函数3.IE事件处理函数4.事件对象的其他补充 事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型),一种是现代事件绑定(DOM2级模型).现代事件绑定在传统绑定上提供了更强大更方便的功能. 一 传统事件绑定的问题 传统事件绑定中的内联模型不做讨论,基本很少去用.先来看一下脚本模型,脚本模型将一个函数赋值给一个事件处理函数.传统绑定如: window.onload=function(){ var box=document.getEleme

JS事件绑定和JQ的事件绑定的几种方式

JS事件绑定的方式: 1.内嵌法: <input type="button" onclick="test()" value="click me"/> 或者是多事件绑定:<input type="button" onclick="javascript:test();test1();" value="click me"/> 2.动态绑定 直接为对象赋值 documen

JS中事件绑定的三种方式

以下是搜集的在JS中事件绑定的三种方式. 1. HTML onclick attribute <button type="button" id="upload" onclick="upload_file();"> 原文: http://www.w3school.com.cn/jsref/jsref_events.asp 2. jQuery .on() $(node).on("change", function(e)

js事件绑定

js 中事件绑定不同的浏览器使用不同的方法,如何做到兼容所有的浏览器呢? 火狐浏览器支持document.addEventListener ,但是不支持document.attachEvent. chrome支持document.addEventListener,不支持document.attachEvent IE支持document.addEventListener,不支持document.attachEvent 为了兼容多浏览器,我们进行了封装: var addEvent = (functi