addEventListener()和attachEvent()的差别?

addEventListener:在HTML元素上绑定事件,FF、chrome、opera、safari及IE9浏览器以上的支持
attachEvent:在HTML元素上绑定事件。仅仅有IE浏览器支持 attachEvent语法:

element.attachEvent(event, function)
event:事件名。注意要使用“on”前缀,如 onclick
function:指定事件触发时运行的函数
var outerDiv = document.getElementById("outerDiv");
outerDiv.attachEvent("onclick", outerFn);

addEventListener语法:

element.addEventListener(event, function, useCapture)
event:事件名,注意不使用“on”前缀。如 click
function:指定事件触发时运行的函数
useCapture:指定事件是否在捕获或冒泡阶段运行。 
true:在捕获阶段运行
false:在冒泡阶段进行。默认值为false;


var outerDiv = document.getElementById("outerDiv");
outerDiv.addEventListener("click", outerFn, true);
我们来理解一下addEventListener的第三个參数useCapture,这个參数是可选的。

首先我们先定义一个HTML
  .container {
width:100px;
height:100px;
color:#fff;
text-align:center;
font:bold 20px/100px "微软雅黑";
background-color: #c60;
cursor:pointer;
}

<div id="outerDiv" class="container">
<div id="innerDiv" class="container" >请点我</div>
</div>

我们先将addEventListener的第三个參数设置默认的false:
  var console = console || {log: function( p ){ alert(p)}};
function outerFn(event) {
console.log("outerDiv Event");
} function innerFn(event) {
console.log("innerDiv Event");
} var outerDiv = document.getElementById("outerDiv");
if ( document.addEventListener ) {
outerDiv.addEventListener("click", outerFn, false);
} else {
outerDiv.attachEvent("onclick", outerFn);
} var innerDiv = document.getElementById("innerDiv");
if ( document.addEventListener ) {
innerDiv.addEventListener("click", innerFn, true);
} else {
innerDiv.attachEvent("onclick", innerFn);
}
运行结果:
useCapture为false的意思是运行的是冒泡阶段,所以打印的效果是



我们先将addEventListener的第三个參数设置默认的true:
  var console = console || {log: function( p ){ alert(p)}};
function outerFn(event) {
console.log("outerDiv Event");
} function innerFn(event) {
console.log("innerDiv Event");
} var outerDiv = document.getElementById("outerDiv");
if ( document.addEventListener ) {
outerDiv.addEventListener("click", outerFn, true);
} else {
outerDiv.attachEvent("onclick", outerFn);
} var innerDiv = document.getElementById("innerDiv");
if ( document.addEventListener ) {
innerDiv.addEventListener("click", innerFn, true);
} else {
innerDiv.attachEvent("onclick", innerFn);
}

运行结果:
useCapture为true的意思是运行的是捕获阶段,所以打印的效果是


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />


addEventListener事件有捕获阶段或冒泡阶段,那attachEvent事件? attachEvent仅仅有冒泡阶段、通过IE浏览器打印结果看
先弹出一个innerDiv对话框


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />
再弹出还有一个outerDiv对话框


普通情况下我们不希望出现冒泡或捕获,当点击div.innerDiv元素时不须要触发div.outerDiv事件,怎么办呢?接下来我们能够看以下这二个属性:
event.stopPropagation(); 支持FF=> 停止传播
event.cancelBubble = true; 支持IE => 取消冒泡

var console = console || {log: function( p ){ alert(p)}};
function outerFn(event) {
console.log("outerDiv Event");
} function innerFn(event) {
console.log("innerDiv Event");
if ( event.stopPropagation) {
event.stopPropagation();
} else {
event.cancelBubble = false;
}
} var outerDiv = document.getElementById("outerDiv");
if ( document.addEventListener ) {
outerDiv.addEventListener("click", outerFn, false);
} else {
outerDiv.attachEvent("onclick", outerFn);
} var innerDiv = document.getElementById("innerDiv");
if ( document.addEventListener ) {
innerDiv.addEventListener("click", innerFn, true);
} else {
innerDiv.attachEvent("onclick", innerFn);
}


removeEventListener()和detachEvent()的差别?

removeEventListener:在HTML元素上移出绑定事件,FF、chrome、opera、safari及IE9浏览器以上的支持
detachEvent:在HTML元素上移出绑定事件,仅仅有IE浏览器支持

detachEvent定、语法:

element.detachEvent(event, function)
event:事件名,注意要使用“on”前缀。如 onclick
function:指定事件触发时运行的函数 removeEventListener语法: element.removeEventListene(event, function, useCapture)
event:事件名,注意不使用“on”前缀,如 click
function:指定事件触发时运行的函数
useCapture:指定事件是否在捕获或冒泡阶段运行。 true:在捕获阶段运行
false:在冒泡阶段进行。默认值为false;

假设加入时用的捕获阶段。那么在移除时也要用捕获阶段。否则无法移除它们。

假设是同一个元素同一个调用函数同一个useCapture值绑定多次,在移除时仅仅须要运行一次移除。
注意: 假设加入两次事件句柄,一次在捕获阶段。一次在冒泡阶段。你必须单独移除该事件。

假如在div.outerDiv上绑定二次,一次是冒泡、一次是捕获试,在移除绑定时也要移除二次,一次是冒泡。一次是捕获

 var console = console || {log: function( p ){ alert(p)}};
function outerFn(event) {
console.log("outerDiv Event");
} function innerFn(event) {
console.log("innerDiv Event"); if ( event.stopPropagation ) {
event.stopPropagation();
} else {
event.cancelBubble = true;
} } var outerDiv = document.getElementById("outerDiv"); //绑定一次 冒泡方式
if ( document.addEventListener ) {
outerDiv.addEventListener("click", outerFn, false);
} else {
outerDiv.attachEvent("onclick", outerFn);
}
// 绑定二次 捕获方式
if ( document.addEventListener ) {
outerDiv.addEventListener("click", outerFn, true);
} else {
outerDiv.attachEvent("onclick", outerFn);
} //移除绑定一次 冒泡方式
if ( document.addEventListener ) {
outerDiv.removeEventListener("click", outerFn, false);
} else {
outerDiv.detachEvent("onclick", outerFn);
} // 移除绑定二次 捕获方式
if ( document.addEventListener ) {
outerDiv.removeEventListener("click", outerFn, true);
} else {
outerDiv.detachEvent("onclick", outerFn);
}









addEventListener()、attachEvent()和removeEventListener()、detachEvent()的差别?的更多相关文章

  1. addEventListener attachEvent和解决IE 6 7 8 this指向错误

    [JS] addEventListener attachEvent和解决IE 6 7 8 this指向错误   电梯直达 1#    php 发表于 2014/4/13 01:17 | 只看该作者  ...

  2. javascript中addEventListener(attachEvent)具体解释

    addEventListener 有三个參数:第一个參数表示事件名称(不含 on,如 "click").第二个參数表示要接收事件处理的函数:第三个參数为 useCapture.样例 ...

  3. js addEventListener attachEvent

    attachEvent方法,为某一事件附加其它的处理事件.(不支持Mozilla系列) addEventListener方法 用于 Mozilla系列 举例: document.getElementB ...

  4. 让javascript显原型!

    相信以下的javascript让你读起来痛苦不已,告诉你一下简单的办法,就可以让它显出原型!将第一个单词,即eval换成document.write,然后再运行一下,它立即就原形毕露了! eval(f ...

  5. (转载)JS事件监听 JS:attachEvent和addEventListener使用方法

    (转载)http://www.chhua.com/web-note146 attachEvent和addEventListener使用方法 Js代码 <html> <head> ...

  6. addEventListener和attachEvent以及element.onclick的区别

    addEventListener和attachEvent以及element.onclick的区别 attachEvent是ie添加事件处理程序,接收两个参数,其中事件类型名称要加"on&qu ...

  7. 为什么要使用addEventListener而不是on监听事件

    昨天回答了一个关于vue的问题 vue 除了input 其他可以用keyup事件嘛? 在vue中没有提供除表单之外其它的keyup绑定方法,可以使用原生的监控键盘的事件,于是给出了代码: mounte ...

  8. 【repost】JavaScript 事件模型 事件处理机制

    什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...

  9. 关于JavaScript初级的知识点一(持续更新 )

    自己刚开始接触JS这是自己一个多月以来的一些总结和回顾. 一.什么是js? js是一种弱类型的脚本语言,是HTML的3大组成部分之一.HTML标签 CSS样式 JS脚本. 二.js的5种基本数据类型 ...

随机推荐

  1. Java 8 (1) 行为参数化

    行为参数化就是可以帮助你处理频繁变更需求的一种软件开发模式.它意味着拿出一个代码块,把它准备好却不去执行它.这个代码块以后可以被你程序的其他部分调用,这意味着你可以推迟这块代码的执行.例如:你可以将代 ...

  2. 【C++】智能指针简述(一):智能指针的引入

    智能指针是C++中一种利用RAII机制(后面解释),通过对象来管理指针的一种方式. 在C++中,动态开辟的内存需要我们自己去维护,在出函数作用域或程序异常退出之前,我们必须手动释放掉它,否则的话就会引 ...

  3. JS高级——Blob处理二进制文件

    https://www.cnblogs.com/hhhyaaon/p/5928152.html

  4. .ai域名注册已经极具投资价值进入火爆期

    最近G.ai以六位数的天价被国内域名收藏家收入囊中,间接说明了.ai域名的价值不断攀升,自从2016年AlphaGo胜利以来,人工智能几乎成为人人谈资,而由于.com域名被挖掘待尽,一些聪明的人工智能 ...

  5. R中矩阵运算

    # 数据产生 # rnorm(n, mean = 0, sd = 1) 正态分布的随机数(r 代表随机,可以替换成dnorm, pnorm, qnorm 作不同计算.r= random = 随机, d ...

  6. bzoj3940 censoring 题解(AC自动机)

    题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they h ...

  7. 如何在mybatis中引用java中的常量和方法

    转自:http://www.68idc.cn/help/jiabenmake/qita/20140821125261.html 在mybatis的映射xml文件调用java类的方法: 1. SELEC ...

  8. 梦想CAD控件图层COM接口知识点

    梦想CAD控件图层COM接口知识点 一.新建图层 主要用到函数说明: _DMxDrawX::AddLayer 增加新的图层.详细说明如下: 参数 说明 BSTR pszName 图层名 c#中实现代码 ...

  9. 08Oracle Database 完整性约束

    Oracle Database 完整性约束 非空约束 创建表时 Create table table_name( Column_name datatype NOT NULL,… ); 修改表时 Alt ...

  10. IOS上MediaPlayer framework实现视频播放

    播放电影文件: iOS sdk中可以使用MPMoviePlayerController来播放电影文件.但是在iOS设备上播放电影文件有严格的格式要求,只能播放下面两个格式的电影文件. • H.264 ...