事件绑定,常见的是odiv.onclick=function(){..........};  这种方式绑定事件太单一,如果绑定多个,那么最后一个事件会覆盖掉之前的,也就是说只执行最后一次绑定的事件,这里要说的是addEventListener方法,和IE下的attachEvent方法:

html代码如下:

<html>
<head>
</head>
<style>
#box{
height:400px;
width:400px;
background: red;
}
#son1{
height:300px;
width:300px;
background: green;
}
#son2{
height:200px;
width:200px;
background: purple;
}
</style>
<script> </script>
<body>
<div id='box'>box
<div id='son1'>son1
<div id='son2'>son2 </div>
</div>
</div> </body>
</html>

界面如下图:

下面是<script>中的代码(非IE浏览器下addEventListener):

 window.onload=function(){
var obox=document.getElementById('box');
var oson1=document.getElementById('son1');
var oson2=document.getElementById('son2'); oson2.addEventListener('click',function(){alert('son2 dinaji');})
oson1.addEventListener('click',function(){alert('son1 dinaji');})
obox.addEventListener('click',function(){alert('box dinaji');})
}

上述代码的addEventListener()只有两个参数,其实还有第三个参数:true/false  。默认的是false,代表在冒泡阶段调用事件处理程序,true代表在事件捕获阶段处理程序,

生活中还是以冒泡阶段处理为多。下面是IE下:

 window.onload=function(){
var obox=document.getElementById('box');
var oson1=document.getElementById('son1');
var oson2=document.getElementById('son2'); oson2.attachEvent('onclick',function(){alert('son2 dinaji');})
oson1.attachEvent('onclick',function(){alert('son1 dinaji');})
obox.attachEvent('onclick',function(){alert('box dinaji');}) }

IE下attachEvent()只有两个参数,没有第三个参数的true或false。因为IE默认的就只能是冒泡阶段捕获,这是当年浏览器大战的原因,个人猜测,可能是因为IE用户量多吧,导致现在默认的都是在冒泡阶段处理。

事件绑定最大的好处是可以绑定多个事件,对同一个元素对象上绑定的多个事件来说,非IE下这些事件的处理顺序是符合代码绑定的先后顺序的,但在IE下对于多个事件绑定的处理顺序正好相反。如:

非IE:

oson2.addEventListener('click',function(){alert('first');},true);  //先弹出 first
oson2.addEventListener('click',function(){alert('second');},true); //后弹出 second

IE:

oson2.attachEvent('onclick',function(){alert('first');});      //后弹出first
oson2.attachEvent('onclick',function(){alert('second');}); //先弹出second

既然能绑定事件,肯定能取消绑定事件,非IE下为removeEventListener(),IE 下为detachEvent()  ,这里需要注意的是括号内的参数必须和事件绑定时的参数一样,但对于匿名函数来说,哪怕函数一样也取消不了绑定,因为两者被认为是不同的,如下代码就取消不了绑定:

oson2.addEventListener('click',function(){alert('first');});
oson2.removeEventListener('click',function(){alert('first');}) //取消绑定不成功

本人又用了函数声明式尝试一下发现也不行:

oson2.addEventListener('click',function test(){alert('first');});
oson2.removeEventListener('click',function test(){alert('first');});

如上面两段代码所述把匿名函数function (){alert('first');} 改为function test(){alert('first');}一样不行。

结论:不管是匿名函数,还是函数声明都视为不同参数,不能成功取消绑定。



解决方法就是先声明一个函数,两者传入共同的函数名即可:

先声明函数:

var test=function(){alert('first');};

再把函数名当参数传入:

oson2.addEventListener('click',test);
oson2.removeEventListener('click',test); //成功取消绑定

以上代码是能成功的,但还要注意第三个参数也要一致,上述代码没有第三个参数则默认都是false,如果一个为true,那也不能取消成功:

oson2.addEventListener('click',t,true); //第三个参数为true表示 捕获时执行事件程序
oson2.removeEventListener('click',t); //默认为false ,不同的参数,不能取消绑定
两者都为true即可:
oson2.addEventListener('click',t,true);
oson2.removeEventListener('click',t,true);

下面是为解决浏览器兼容封装事件绑定:

function addEvent(element,event,fun){
if(element.addEventListener)
{
element.addEventListener(event,fun);
}
else if(element.attachEvent)
{
element.attachEvent('on'+event,fun);//注意要加on
}
}

下面是取消事件绑定的封装:

function removeEvent(element,event,fun){
if(element.removeEventListener)
{
element.removeEventListener(event,fun);
}
else if(element.detachEvent)
{
element.detachEvent('on'+event,fun);//注意要加on
} }

封装后再使用事件绑定和取消绑定就方便很多:

var t=function(){alert(' box ');};
var t1=function(){alert(' son1 ');};
var t2=function(){alert(' son2 ');};

绑定:

addEvent(obox,'click',t);
addEvent(oson1,'click',t1);
addEvent(oson2,'click',t2);

取消绑定:

removeEvent(obox,'click',t);
removeEvent(oson1,'click',t1);
removeEvent(oson2,'click',t2);

以上就是事件绑定的内容,也是自己的一次回顾。

js事件绑定的更多相关文章

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

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

  2. js事件绑定细节说明

    javascript绑定事件: 经常用jQuery去写,时间长了对原生态的js事件绑定的知识会慢慢淡化或者遗忘了,必须翻出来再次总结,今天再次把js原生态事件的处理做个总结. 从最初开始,谁刚接触ja ...

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

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

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

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

  5. js事件绑定及深入

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

  6. js 事件绑定

    事件绑定的方式 1.  DOM  元素行内绑定 <div onclick="alert(1)"></div>   2. js on+eventType do ...

  7. js事件绑定函数

    js中事件绑定方法大致有三种: 1.在DOM元素中绑定 <input onclick="alert('在DOM中绑定')" type="button" v ...

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

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

  9. js事件绑定/监听

    事件绑定/监听的方法 1.直接绑定 顾名思义,直接在DOM元素上绑定onclick.onmouseover.onmouseout.onmousedown.onmouseup.ondblclick.on ...

  10. 原生js事件绑定

    一.JS事件 (一)JS事件分类 1.鼠标事件: click/dbclick/mouseover/mouseout 2.HTML事件: onload/onunload/onsubmit/onresiz ...

随机推荐

  1. 向上下左右不间断无缝滚动图片的效果(兼容火狐和IE)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 转:php park、unpark、ord 函数使用方法(二进制流接口应用实例)

    在工作中,我也逐渐了解到park,unpark,ord对于二进制字节处理的强大. 下面我逐一介绍它们.     park,unpark,ord这3个函数,在我们工作中,用到它们的估计不多. 我在最近一 ...

  3. 安装cvxpy遇到的问题与解决方案(ubuntu14.10,python 2.7.8)

    应该说,cvxpy的安装说明是很棒的,一步一步非常清楚,www.cvxpy.org/en/latest/install/index.html 可是,我照着做完之后,还是不能import cvxpy,不 ...

  4. ctex moderncv版本更新--用latex写一个漂亮的简历

    我的电脑是win7系统32位,ctex版本是v2.9.2.164 full(http://www.ctex.org/CTeXDownload) 一直不太清楚moderncv里面类似\cventry这种 ...

  5. Linq专题之var关键字

    在c#1.0,c#2.0中声明一个变量时,总是要指定变量的类型,如果不指定变量类型编译器就会报错,产生编译错误.在c#3.0中我们可以不指定变量的具体类型,而使用一个新的关键字"var&qu ...

  6. maven eclipse jetty debug

    可以通过查看最近版本: http://mvnrepository.com/artifact/org.eclipse.jetty/jetty-server http://search.maven.org ...

  7. SLAM拾萃(3):siftGPU

    前言 本周博客我们给大家介绍一下SiftGPU.由于特征匹配是SLAM中非常耗时间的一步,许多人都想把它的时间降至最短,因此目前ORB成了非常受欢迎的特征.而老牌SIFT,则一直给人一种“很严谨很精确 ...

  8. char str[]和char *str的区别

    1.http://blog.csdn.net/szchtx/article/details/10396149 char ss[]="C++";  ss[0]='c';        ...

  9. slf4j日志系统

    slf4j:由外观模式实现,不是日志的解决方案,只是服务于各种各样的日志系统.可以让在应用部署的时候,选择合适的日志系统 slf4j + log4j : 配置日志文件:log4j.properties ...

  10. 华为手机连不上adb解决方法

    1.关闭qq,豌豆荚等一连接usb自动侦测手机的程序... 2.安装hisuite软件,这个应该跟相应的版本有关,新版本最好要安装这个软件,否则也可能导致怎么都连接不上 3.打开usb调试功能 4.a ...