原文链接:http://www.cnblogs.com/xxcanghai/p/5205998.html

事件流:页面接收事件的顺序,IE提出了事件冒泡流,Netscape提出了事件捕获流。

事件冒泡:事件由最具体(dom中层次最深的节点)的接收对象向上进行传播到较为不具体的元素

事件捕获:事件由不具体的元素接收向下传播到具体的元素

DOM事件流:事件捕获阶段、处于目标阶段和事件冒泡阶段

一、事件处理程序

1、HTML事件处理程序

<input type="button" id="btn" onclick="alert(event.type)" value="点击我">

2、DOM0级事件处理

var btn=document.getElementById("btn");

btn.onclick = function(){
    alert("123");  alert(this);//btn元素,只在btn元素的作用域内进行
}移除btn.onclick = null;
  1. 传统绑定的优点

    • 非常简单和稳定,可以确保它在你使用的不同浏览器中运作一致
    • 处理事件时,this关键字引用的是当前元素,这很有帮组
  2. 传统绑定的缺点 
    • 传统方法只会在事件冒泡中运行,而非捕获和冒泡
    • 一个元素一次只能绑定一个事件处理函数。新绑定的事件处理函数会覆盖旧的事件处理函数
    • 事件对象参数(e)仅非IE浏览器及ie9以上(包括ie9)可用
 

3、Dom2级事件处理

var btn = document.getElementById("btn");
btn.addEventListener("click",function(){
  alert("123");
},false)//false代表冒泡阶段 ie8之前的版本都是只支持事件冒泡,为了更好的兼容性最好选择事件冒泡,设置false//除非需要进行事件捕获的时候设置成true

添加多个事件
btn.addEventListener("click",function(){
  alert("123");
},false)
btn.addEventListener("click",function(){
  alert("aaa");
},false)执行顺序是先弹出123,再弹出aaa
移除:移除时要用removeEventListener(),传入的参数和绑定时传入的参数一致,注意传入匿名函数是不行的btn.removeEventListener("click",function(){  alert("123");},false)//不管用

var fun = function(){  alert("123");}btn.addEventListener("click",fun,false);btn.removeEventListener("click",fun,false);//管用
  1. W3C绑定的优点W3C绑定的缺点

    • 该方法同时支持事件处理的捕获和冒泡阶段。事件阶段取决于addEventListener最后的参数设置:false (冒泡) 或 true (捕获)。
    • 在事件处理函数内部,this关键字引用当前元素。
    • 事件对象总是可以通过处理函数的第一个参数(e)捕获。
    • 可以为同一个元素绑定你所希望的多个事件,同时并不会覆盖先前绑定的事件
    • IE不支持,你必须使用IE的attachEvent函数替代。
 

4、IE事件处理程序

var btn = document.getElementById("btn");
btn.attachEvent("onclick",function(){//onclick,并不是DOM2级时的click
   alert("123");
   alert("this"); //window,在全局的作用域下进行
});

添加多个事件时
btn.attachEvent("onclick",function(){
   alert("123");
});
btn.attachEvent("onclick",function(){
   alert("aaa");
});

执行顺序正和DOM2级相反,先弹出aaa,再弹出123

移除事件
var btn = document.getElementById("btn");var fun = function(){alert("123");}
btn.attachEvent("onclick",fun});

btn.detachEvent("onclick",fun);与DOM2级相同,不能传入匿名函数

  1. IE方式的优点IE方式的缺点

    • 可以为同一个元素绑定你所希望的多个事件,同时并不会覆盖先前绑定的事件。
    • IE仅支持事件捕获的冒泡阶段
    • 事件监听函数内的this关键字指向了window对象,而不是当前元素(IE的一个巨大缺点)
    • 事件对象仅存在与window.event参数中
    • 事件必须以ontype的形式命名,比如,onclick而非click
    • 仅IE可用。你必须在非IE浏览器中使用W3C的addEventListene

二、事件对象

1、Dom中的事件对象

兼容Dom的浏览器会将event对象传入到事件处理程序中,无论使用的是Html、DOM0、DOM2级都会传入event对象

<input type="button" id="btn" onclick="alert(event.type)" value="点击我">//click

var btn = document.getElementById("btn");btn.onclick = function(){  alert(event.type);//click}btn.addEventListener("click",function(){  alert(event.type);//click});

event对象的属性和方法

  

bubbles               boolean         只读          是否为冒泡cancelable            boolean         只读          是否可以取消事件的默认行为currentTarget         element         只读          当前正在处理事件的那个元素defaultPrevented      Boolean         只读          为true时表示已经调用的preventDefault()eventPhase            integer         只读          表示事件阶段,1:捕获阶段 2:目标阶段 3:冒泡阶段preventDefault()      function        只读          取消事件的默认行为,如果cancelable为true时可以使用此方法stopPropagation()     function        只读          取消事件的进一步冒泡或捕获,当bubbles为true时可以使用此方法target                element         只读          事件的目标type                  String          只读          事件的类型

事件处理程序中的this、event.currentTarget、event.target的关系

在事件内部,this会一直等于event.currentTarget,然而event.target是事件的实际目标

var btn = docuemtn.getElementById("btn");
btn.onclick = function(){
     console.log(this);//btn        console.log(event.currentTarget);//btn console.log(event.target)//btn}
body.onclick = function(){
     console.log(this);//body        console.log(event.currentTarget);//body console.log(event.target)//btn}因为事件处理程序是注册到body上面的,所以this和event.currentTarget都是body,btn是click事件真正的目标,所以target为btn点击btn时,因为事件没有注册到btn上,所以事件冒泡到body上。
阻止事件默认行为

<a href="http://www.baidu.com" id="myLink">百度</a>var link = document.getElementById("myLink");link.onclick = function(event){  event.preventDefault();}//阻止了a的链接跳转行为

取消事件进一步的冒泡或者捕获btn.onclick = function(event){  alert("123");  event.stopPropagation();}body.onclick = function(event){  alert("aaa");}如果没有阻止事件冒泡的话,点击body会弹出2个提示框

event.eventPhase

body.addEventListener("click",function(event){
   alert(event.eventPhase);//1捕获阶段
},true)btn.onclick = function(event){  alert(event.eventPhase);//2 目标阶段}body.onclick = function(){  alert(event.eventPhase);//3 冒泡阶段}

2、IE中的事件对象

btn.onclick = function(event){
    alert(window.event.type);//click  在IE下如果使用dom0级事件,其中event对象是作为window的一个属性存在,window.event}btn.attachEvent("onclick",function(event){  alert(event.type);//click 但是如果使用attachEvent注册事件时,会将event对象传入到事件处理函数中 window.event也可以访问到});

IE下event的属性及方法

cancelBubble      Boolean    读/写        默认值为false,设为true可以取消事件冒泡,与DOM中的stopPropagation()相同returnValue       Boolean    读/写        默认为true ,设为false时可以取消事件的默认行为,与DOM中的preventDefaule()相同srcElement        element    读           事件的目标,与DOM中的target相同type              string     读           被触发的事件类型    

三、适应各种浏览器的事件

var event = {  addEvent : function(element,type,fun){    if(element.addEventListener){      element.addEventListener(type,fun);//dom2级    }else if(element.attachEvent){      element.attachEvent("on"+type,fun);//ie    }else{      element["on"+type] = fun;//dom0级    }  },  removeEvent : function(element,type,fun){    if(element.removeEventListener){      element.removeEventLister(type,fun);    }else if(element.detachEvent){      element.detachEvent("on"+type,fun);    }else{      element["on"+type] = null;    }  },  getEvent : function(event){    return event ? event : window.event;   },  getTarget : function(event){    return event.target || event.srcElement    },  preventDefalut : function(event){   event.preventDefalut ? event.preventDefalut() : event.returnValue = false;  },  stopPropagation : function(event){    event.stopPropagation ? event.stopPropagation() : event.cancelBubble = true;  }}

3、事件的代理/委托的原理以及优缺点,这是靠事件的冒泡机制来实现的

  (1)、可以大量节省内存占用,减少事件注册,比如在table上代理所有td的click事件就非常棒

  (2)、可以实现当新增子对象时无需再次对其绑定事件,对于动态内容部分尤为合适

那么极有可能要求让你【实现事件模型】,即写一个类或是一个模块,有两个函数,

一个bind一个trigger,分别实现绑定事件和触发事件,

核心需求就是可以对某一个事件名称绑定多个事件响应函数,

然后触发这个事件名称时,依次按绑定顺序触发相应的响应函数。

[js]事件综合 整理的更多相关文章

  1. js事件知识整理

    鼠标事件 鼠标移动到目标元素上的那一刻,首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemove 如果按下鼠标上的设备(左键,右键,滚轮……),则触发mousedown ...

  2. JS 事件冒泡整理 浏览器的事件流

    JavaScript与HTML的交互通过事件来实现.而浏览器的事件流是一个非常重要的概念.不去讨论那些古老的浏览器有事件捕获与事件冒泡的争议, 只需要知道在DOM2中规定的事件流包括了三个部分,事件捕 ...

  3. JS正则表达式大全(整理详细且实用)

    JS正则表达式大全(整理详细且实用).需要的朋友可以过来参考下,希望对大家有所帮助!! 正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释, ...

  4. vue.js面试题整理

    Vue.js面试题整理 一.什么是MVVM? MVVM是Model-View-ViewModel的缩写.MVVM是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务 ...

  5. javascript高级程序设计---js事件思维导图

    绘制思维软件与平时用的笔记,以及导出功能,这三个问题综合起来,于是我把思维导图分开画 1.js事件的基本概念 2.js事件的事件处理程序 3.js事件的事件对象

  6. js事件处理程序return false ,preventDefault,returnValue

    面试题目中,经常会被问到如何阻止默认行为. 以下是<javascript权威指南>书中的内容,详情可以去看书. 能够取消事件默认操作的方法有三种 1.属性注册的事件处理程序的返回值fals ...

  7. 【前端芝士树】Vue.js面试题整理 / 知识点梳理

    [前端芝士树] Vue.js 面试题整理 MVVM是什么? MVVM 是 Model-View-ViewModel 的缩写. Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑. ...

  8. js数组学习整理

    原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...

  9. dynamic-css 动态 CSS 库,使得你可以借助 MVVM 模式动态生成和更新 css,从 js 事件和 css 选择器的苦海中脱离出来

    dynamic-css 使得你可以借助 MVVM 模式动态生成和更新 css,从而将本插件到来之前,打散.嵌套在 js 中的修改样式的代码剥离出来.比如你要做元素跟随鼠标移动,或者根据滚动条位置的变化 ...

随机推荐

  1. SQL SERVER 数据库实用SQL语句

    --查看指定表的外键约束 select * from sysobjects where parent_obj in( select id from sysobjects where name='表名' ...

  2. tomcat部署到根路径

    在Tomcat中部署war包很简单: 首先,直接把相应的war包放到$TOMCAT_HOME/webapps下,不用建目录: 然后,修改$TOMCAT_HOME/conf/server.xml,在Ho ...

  3. ==与equal在java中应用的感悟

    今天又算是长见识了.了解了下平时不注意的equal和==的区别. 不管是==又或是equal都是用来比较相同与否.当问题就在这里了,比较什么相同呢? 我的在日常的比较无非也就是两种:1.基本数据类型之 ...

  4. htmlnav

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 转载-Python学习笔记之文件读写

    Python 文件读写 Python内置了读写文件的函数,用法和C是兼容的.本节介绍内容大致有:文件的打开/关闭.文件对象.文件的读写等. 本章节仅示例介绍 TXT 类型文档的读写,也就是最基础的文件 ...

  6. CentOS 6.5升级Python2.7

    1.下载并解压Python2.7的源码. . 2.编译与安装Python2.7. ./configure --prefix=/usr/local make && make altins ...

  7. tinyhttpd服务器源码学习

    下载地址:http://sourceforge.net/projects/tinyhttpd/ /* J. David's webserver */ /* This is a simple webse ...

  8. Android系统中 setprop,getprop,watchprops命令的使用

    如:在frameworks/opt/net/ims/src/java/com/android/ims/ImsManager.java if (SystemProperties.get("pe ...

  9. 微软DbHelper

    using System; using System.Configuration; using System.Data; using System.Data.Common; using System. ...

  10. linux学习建议

    给初学者的建议 注意事项: 1 严格区分大小写,包括命令和文件夹,windows和linux的系统不太一样 2 所有内容都是以文件保存,包括硬件,文件要永久生效,都要写入文件,所以文件命令很重要 3 ...