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. 块级标签与预格式化文本标签----------大多数XHTML可以表示为两种类型的标签:块标签(block tag)和内联标签(inline tag)

    <html> <head> <meta charset="utf-8"> <title>块级标签</title> < ...

  2. Hbase源码分析:RPC概况

    RPC是hbase中Master,RegionServer和Client三者之间通信交流的纽带.了解hbase的rpc机制能够为通过源码学习hbase奠定良好的基础.因为了解了hbase的rpc机制能 ...

  3. 高性能队列disruptor为什么这么快?

    背景 Disruptor是LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级).基于Disruptor开发的系统单线程能支撑每秒600万 ...

  4. JavaScript 兼容新旧版chrome和firefox的桌面通知

    1.新/旧版本的chrome和firefox都可支持,IE下不支持因此设置为了在最小化窗口处闪烁显示提示文字. 2.设置为提示窗口显示5秒即关闭. 3.可设置图标和点击提示窗口要跳转到的页面(见输入参 ...

  5. Android 滚动RecyclerView加载图片时的流畅度优化

    实现:使用onScrollStateChanged回调检测滚动状态,并在RecyclerViewAdapter内部设置类似isScrolling的状态值来控制网络图片的加载. 下面是代码举例: // ...

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

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

  7. Tcl之Math

    expr is for Tcl to do math operations. It takes all of its arguments ("2 + 2" for example) ...

  8. HiveServer2后台运行

    nohup hive --service hiveserver2 & 或者直接: nohup hiveserver2 &

  9. iOS布局进化史

    一.绝对布局.layoutsubviews. 二.父视图相对布局 注意:Autoresizing只能设置父子视图之间的关系,也就是说,Autoresizing只能控制子视图和父视图之间的位置/大小关系 ...

  10. MySql (二)入门语句和基本操作

    mysql的入门语句:查看服务器下的库 show databases; 创建库(数据库被创建后它的名字是不可以更改的) create database 数据库名; 2.1.插看当前所在的库 selec ...