addEventListener()、attachEvent()和removeEventListener()、detachEvent()的差别?
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()的差别?的更多相关文章
- addEventListener attachEvent和解决IE 6 7 8 this指向错误
[JS] addEventListener attachEvent和解决IE 6 7 8 this指向错误 电梯直达 1# php 发表于 2014/4/13 01:17 | 只看该作者 ...
- javascript中addEventListener(attachEvent)具体解释
addEventListener 有三个參数:第一个參数表示事件名称(不含 on,如 "click").第二个參数表示要接收事件处理的函数:第三个參数为 useCapture.样例 ...
- js addEventListener attachEvent
attachEvent方法,为某一事件附加其它的处理事件.(不支持Mozilla系列) addEventListener方法 用于 Mozilla系列 举例: document.getElementB ...
- 让javascript显原型!
相信以下的javascript让你读起来痛苦不已,告诉你一下简单的办法,就可以让它显出原型!将第一个单词,即eval换成document.write,然后再运行一下,它立即就原形毕露了! eval(f ...
- (转载)JS事件监听 JS:attachEvent和addEventListener使用方法
(转载)http://www.chhua.com/web-note146 attachEvent和addEventListener使用方法 Js代码 <html> <head> ...
- addEventListener和attachEvent以及element.onclick的区别
addEventListener和attachEvent以及element.onclick的区别 attachEvent是ie添加事件处理程序,接收两个参数,其中事件类型名称要加"on&qu ...
- 为什么要使用addEventListener而不是on监听事件
昨天回答了一个关于vue的问题 vue 除了input 其他可以用keyup事件嘛? 在vue中没有提供除表单之外其它的keyup绑定方法,可以使用原生的监控键盘的事件,于是给出了代码: mounte ...
- 【repost】JavaScript 事件模型 事件处理机制
什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...
- 关于JavaScript初级的知识点一(持续更新 )
自己刚开始接触JS这是自己一个多月以来的一些总结和回顾. 一.什么是js? js是一种弱类型的脚本语言,是HTML的3大组成部分之一.HTML标签 CSS样式 JS脚本. 二.js的5种基本数据类型 ...
随机推荐
- Java 8 (1) 行为参数化
行为参数化就是可以帮助你处理频繁变更需求的一种软件开发模式.它意味着拿出一个代码块,把它准备好却不去执行它.这个代码块以后可以被你程序的其他部分调用,这意味着你可以推迟这块代码的执行.例如:你可以将代 ...
- 【C++】智能指针简述(一):智能指针的引入
智能指针是C++中一种利用RAII机制(后面解释),通过对象来管理指针的一种方式. 在C++中,动态开辟的内存需要我们自己去维护,在出函数作用域或程序异常退出之前,我们必须手动释放掉它,否则的话就会引 ...
- JS高级——Blob处理二进制文件
https://www.cnblogs.com/hhhyaaon/p/5928152.html
- .ai域名注册已经极具投资价值进入火爆期
最近G.ai以六位数的天价被国内域名收藏家收入囊中,间接说明了.ai域名的价值不断攀升,自从2016年AlphaGo胜利以来,人工智能几乎成为人人谈资,而由于.com域名被挖掘待尽,一些聪明的人工智能 ...
- R中矩阵运算
# 数据产生 # rnorm(n, mean = 0, sd = 1) 正态分布的随机数(r 代表随机,可以替换成dnorm, pnorm, qnorm 作不同计算.r= random = 随机, d ...
- bzoj3940 censoring 题解(AC自动机)
题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they h ...
- 如何在mybatis中引用java中的常量和方法
转自:http://www.68idc.cn/help/jiabenmake/qita/20140821125261.html 在mybatis的映射xml文件调用java类的方法: 1. SELEC ...
- 梦想CAD控件图层COM接口知识点
梦想CAD控件图层COM接口知识点 一.新建图层 主要用到函数说明: _DMxDrawX::AddLayer 增加新的图层.详细说明如下: 参数 说明 BSTR pszName 图层名 c#中实现代码 ...
- 08Oracle Database 完整性约束
Oracle Database 完整性约束 非空约束 创建表时 Create table table_name( Column_name datatype NOT NULL,… ); 修改表时 Alt ...
- IOS上MediaPlayer framework实现视频播放
播放电影文件: iOS sdk中可以使用MPMoviePlayerController来播放电影文件.但是在iOS设备上播放电影文件有严格的格式要求,只能播放下面两个格式的电影文件. • H.264 ...