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. 【日常总结】scrollTop、scrollHeight与clientHeight的重要关系

    前言 在做一个需求的时候涉及懒加载,百度了一下,发现scrollTop.scrollHeight与clientHeight这三个元素起到了重要作用,以前做过类似demo但是时间过太久忘记了,现在已经完 ...

  2. python之路 之一pyspark

    pip包下载安装pyspark pip install pyspark  这里可能会遇到安装超时的情况   加参数  --timeout=100 pip   -default   -timeout=1 ...

  3. Python批量生成用户名

    写在最前 平时在工作中尤其是在做压测的时候难免需要一些用户名和密码,写个简单的Python小脚本批量生成一些 代码示例 import random,string #生成大小字母和数字一起的大字符串 a ...

  4. 表格 —— 一个单元格插入多个tags

    <st #st [columns]="columns" [data]="data" [bordered]='true'> <ng-templa ...

  5. CAD动态绘制样条线(网页版)

    在CAD设计时,需要绘制样条线,用户可以设置样条线线重及颜色等属性. 主要用到函数说明: _DMxDrawX::SendStringToExecuteFun 把命令当着函数执行,可以传参数.详细说明如 ...

  6. SpringMVC-Mybatis整合和注解开发

    SpringMVC-Mybatis整合和注解开发SpringMVC-Mybatis整合整合的思路在mybatis和spring整合的基础上 添加springmvc.spring要管理springmvc ...

  7. [Luogu] P1407 [国家集训队]稳定婚姻

    题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的姗姗和男友谈恋爱半年就结婚,结婚不到 ...

  8. jmeter录制火狐浏览器

    昨天看youtube,居然发现有这功能,啊哈哈 听不懂英语 也能有收获. 一.Jmeter 文件中选择Templates->Recording 二.创建之后,自动出现一个模板: 1. Threa ...

  9. RANS VS LES

    Turbulence models

  10. [bzoj4300][绝世好题] (动规)

    Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数 ...