JS--事件模块
一、JS event 的浏览器兼容
说到JS事件,不能不先讲一下事件流
1 事件流的定义:事件流是指从页面中接收事件的顺序
如下图所示,假设有四个圆层叠在一起,如果我们单击图中最里面的那个圆,那么我们我们单击到的目标是谁呢?黑色的圆,淡紫色的圆,卡其色的圆,还是最外面的粉色的圆,这就提出了冒泡流和捕获流
aaarticlea/png;base64,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" alt="" />
2 冒泡流与捕获流
假设还是上面那个例子,我们用ABCD来标示各个圆,如果单击了最上面的圆D,那么会出现下面的情况,先是最不具体的元素(本例中,最不具体的元素是指A)接收到事件,然后一级一级向最具 体的元素(本例中,最具体的元素是D)传播,这个传播阶段就称为事件的捕获阶段,最具体的元素接收到事件的阶段属于目标阶段,当目标元素接收到事件后,开始逐级向最不具体的元素传播, 这一阶段属于冒泡阶段。
aaarticlea/png;base64,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" alt="" />
通过上面的讲解,我们给出捕获流和冒泡流的概念
捕获流:不太具体的节点更早接收到事件,而最具体的元素最后接收到事件,在事件到达预订目标之前捕获它
冒泡流:事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的元素
3 事件侦听器
事件就是用户或者浏览器自身执行的某种动作,例如click、load等,而响应某个事件 函数就是事件侦听器或者是事件处理程序
为事件指定处理程序的方式有下面几种
3.1 html事件处理程序:利用与相应的事件处理程序同名的html特性来指定事件处理程序
3.2 DOM0级事件处理程序:将一个函数赋值给一个事件处理程序属性
3.3 DOM2级事件处理程序:对其绑定事件处理程序
<input type="button" value="click me" onclick="showMessage()" />
<!--第一种为事件指定处理程序的方式----html事件处理程序-->
function showMessage(){ alert("click"); }
//第二种为事件指定处理程序的方式---DOM0级
var btn=document.getElementById("btn");
btn.onclick=function(){
alert("click");
}
//第三种为事件指定处理程序的方式---DOM2级
var btn=document.getElementById("btn");
btn.addEventListener("click",function(event){...},false);
btn.addEventListener("click",function(event){...},false); //第三种为事件指定处理程序的方式可以添加多个事件处理程序
第一种方式的缺点:一、时差问题,例如showMessage()函数定义在页面的最底部,而用户在页面解析showMessage方法之前单击了上面的按钮,就会引发错误,二、紧耦合html与js代码紧密耦合,如果要更换事件处理程序,即要修改js代码又要修改html的绑定处的代码
第二种方式的优点:简单,跨浏览器,使用这种方式添加的事件处理程序会在事件流的冒泡阶段被处理,缺点:不能添加多个事件处理程序
注意,虽然addEventListener方式可以控制在冒泡阶段还是捕获节点触发事件处理程序,但是大多数情况下,都是将事件处理程序添加到事件流的冒泡阶段,这是由于这样做可以最大限度地兼容各种浏览器,因此不建议在事件捕获阶段注册事件处理程序
4 跨浏览器的事件处理程序
开发能够隔离浏览器差异的JS库,保证处理事件的代码能在大多数浏览器下一致地运行,只要做到适当地使用能力检测,并关注冒泡阶段即可
4.1 下面我们罗列一下DOM的事件对象与IE的事件对象之间的差异
具有差异的相关方面 |
DOM |
IE |
添加事件处理程序的方式 以及参数的不同 |
addEventListener(type,handler,true/false) 参数:type是指事件的类型,直接使用 handler是指要添加的事件处理程序 true是指在捕获阶段调用handler,false 是指在冒泡阶段调用handler |
attachEvent(type,handler) 参数:type同样是指事件的类型,但是需要"on"+type 另外IE添加事件处理程序的方法没有第三个参数,是因为IE只在事件的冒泡阶段调用事件处理程序 |
事件对象 (在触发DOM上的某个事件时,会产生一个事件对象event,该对象包含了所有与该事件相关的信息,例如导致事件发生的元素,事件的类型等) |
兼容DOM的浏览器将一个event对象传入到事件处理程序中,该对象只存在与事件处理程序执行期间,一旦事件处理程序执行完毕,event对象就会被销毁 |
IE的event对象是作为window对象的一个属性存在的 |
取消事件的默认行为 |
event.preventDefault() |
event.returnValue=false |
阻止冒泡 |
event.stopPropagation() |
event.cancelBubble=true |
获取事件的目标元素 |
event.target |
event.srcElement |
获取事件的相关元素 |
event.relatedTarget |
在mouseover事件出发时event.fromElement保存的是相关元素,而在mouseout事件触发时,event.toElement保存的是相关元素 |
同一元素的同一事件上绑定的多个事件处理程序触发的顺序 | 按照绑定的先后顺序依次触发 | 触发顺序与绑定的顺序相反 |
4.2 下面是一个几乎包含了事件方面兼容性的js代码
var Event={
//绑定事件处理程序的不同
addHandler:function(element,type,handler){
if(element.addEventListener){
//DOM
element.addEventListener(type,handler,false); }else if(element.attachEvent){
//IE
element.attachEvent("on"+type,handler);
}else{
element["on"+type]=handler;
}
},
//获取事件对象event
getEvent:function(event){
return event?event:window.event;
},
//获取目标元素
getTarget:function(event){
return event.target||event.srcElement;
},
//获取相关元素
getRelatedTarget:function(event){
if(event.relatedTarget){
return event.relatedTarget;
}else if(event.toElement){
return event.toElement;
}else if(event.fromElement){
return event.fromElement;
}else{
return null;
}
},
//阻止默认事件
preventDefault:function(e){
if(e.preventDefault){
e.preventDefault();
}else{
e.returnValue=false;
}
},
//阻止冒泡
stopPropagation:function(e){
if(e.stopPropagation){
e.stopPropagation();
}else{
e.cancelBubble=true;
}
},
//移除事件处理程序
removeHandler:function(element,type,handler){
if(element.removeEventListener){
element.removeEventListener(type,handler,false);
}else if(element.detachEvent){
element.detachEvent("on"+type,handler);
}else{
element["on"+type]=null;
}
}
};
5 同一事件的同一元素上绑定的多个事件处理程序触发的顺序
首先针对DOM,如果元素为最具体的元素,不管事件是绑定在冒泡阶段还是捕获阶段,事件触发的顺序仅仅与事件绑定的顺序相关
var d=document.getElementById("my");
d.addEventListener("click",function(){
alert(1);
},false);//冒泡阶段
d.addEventListener("click",function(){
alert(2);
},true);//捕获阶段
d.addEventListener("click",function(){
alert(3);
},false);//冒泡阶段
//触发顺序为1 2 3,可见只要事件绑定在最具体的元素上,
//事件触发的顺序与绑定在冒泡和捕获阶段无关,只与绑定的顺序相关
//因为是最具体的元素,所以事件触发是在目标阶段,与在绑定事件处理程序时说明冒泡阶段或者捕获阶段都无关
针对DOM,如果元素不是最具体的元素,那么事件触发的顺序与事件绑定在冒泡阶段还是捕获阶段就息息相关了
var outer_div=document.getElementById("outer_div");//不具体的元素
var inner_div=document.getElementById("inner_div");//具体的元素
outer_div.addEventListener("click",function(){
alert("我是第一个追加在外层div上的事件,我触发的阶段是冒泡阶段");
},false);//冒泡阶段
outer_div.addEventListener("click",function(){
alert("我是第二个追加在外层div上的事件,我触发的阶段是捕获阶段");
},true);//捕获阶段
outer_div.addEventListener("click",function(){
alert("我是第三个追加在外层div上的事件,我触发的阶段是冒泡阶段");
},false);//冒泡阶段
inner_div.addEventListener("click",function(){
alert("我是第一个追加在内层div上的事件,我触发的阶段是冒泡阶段");
},false);//冒泡阶段
inner_div.addEventListener("click",function(){
alert("我是第二个追加在内层div上的事件,我触发的阶段是捕获阶段");
},true);//捕获阶段
inner_div.addEventListener("click",function(){
alert("我是第三个追加在内层div上的事件,我触发的阶段是冒泡阶段");
},false);//冒泡阶段
//我是第二个追加在外层div上的事件,我触发的阶段是捕获阶段
//我是第一个追加在内层div上的事件,我触发的阶段是冒泡阶段
//我是第二个追加在内层div上的事件,我触发的阶段是捕获阶段
//我是第三个追加在内层div上的事件,我触发的阶段是冒泡阶段
//我是第一个追加在外层div上的事件,我触发的阶段是冒泡阶段
//我是第三个追加在外层div上的事件,我触发的阶段是冒泡阶段
aaarticlea/png;base64,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" alt="" width="543" height="324" />aaarticlea/png;base64,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" alt="" width="689" height="336" />
由上图可知,首先触发的是绑定在outer_div捕获阶段的事件,其次是绑定在inner_div上面的事件,由于inner_div是最具体的元素,位于目标阶段,因此绑定在它上面的事件触发的顺序与绑定事件的顺序相关,最后是绑定在outer_div冒泡阶段的事件
6 事件委托当添加到页面的事件处理程序过多时,就会引起性能的降低,原因如下:一、每个函数都是对象,都会占用内存,内存中的对象越多,性能就越差;二、指定事件处理程序导致对DOM的访问次数增多,会延迟整个页面的交互就绪事件,因此我们给出了事件委托的概念
6.1 事件委托的定义:利用事件的冒泡,只指定一个事件处理程序,就可以管理页面中某一类型的所有事件,即向DOM树尽可能高的层次添加事件处理程序
6.2 示例
//结合上面的跨浏览器的事件处理程序,将事件绑定在DOM树的最高层document上
Event.addHandler(document,"click",function(event){
event=Event.getEvent(event);
var target=Event.getTarget(event);
switch(target.id){
case "ddTest":
alert("my name is 'dTest',this is my first event");
alert("my name is 'dTest',this is my second event");
break;
case "aaTest":
alert("my name is 'aTest',this is my first event");
break;
}
});
7 模拟事件
7.1 事件可以通过客户操作或者浏览器的功能触发,也可以使用JS在任意时刻来触发特定的事件,在测试web应用程序时,模拟事件就显得尤为重要,DOM2规范规定了模拟特定事件的方式,Opera、火狐、Chrome和Safari都支持该规范,IE有自己模拟事件的方式,下面我们先讲解DOM的模拟事件
7.2 DOM的事件模拟(共分为三个步骤):1 创建事件对象,2 初始化步骤一中创建的事件对象,3 触发事件
7.2.1 创建事件对象-----document.createEvent()方法,该方法接受一个参数,即表示要创建的事件类型的字符串,注意DOM2级事件没有规定键盘事件,DOM3中规定了DOM事件,但是当前并没有浏览器支持,但是通过现有方法可以模拟键盘事件
参数: UIEvents:一般化的UI事件,鼠标事件和键盘事件都继承自UI事件
参数: MouseEvents:一般化的鼠标事件
参数:MutationEvents:一般化的DOM变动事件
参数:HTMLEvents:一般化的HTML事件
7.2.2 使用与事件有关的信息对创建的事件对象进行初始化,而这个初始化方法与所创建的事件类型相关,下面我们详细讲解初始化鼠标事件的方法和模拟键盘事件的方法等
7.2.2.1 模拟鼠标事件
1,document.createEvent("MouseEvent");
2,初始化鼠标对象的方法---initMouseEvent方法
3,触发事件--dispatchEvent(event)方法
var btn=document.getElementById("myBtn");
btn.addEventListener("click",function(){
alert(123);
},false);
var event=document.createEvent("MouseEvents");
event.initMouseEvent("click",true,true,document.defaultView,0,0,0,0,0,false,false,false,false,0,null);
/*initMouseEvent的参数
type:触发事件的类型,例如"click" bubble:事件是否应该冒泡 cancelable:表示事件是否可以取消 view:与事件相关的视图,一般设置为document.defaultView
//前面的这四个参数是至关重要的 detail:数字,一般只有事件处理程序使用,通常设置为0 sreenX/sreenY:事件相对于屏幕的X/Y坐标 clientX/clientY:事件相对于视口的X/Y坐标 ctrlKey/altKey/shiftKey/metaKey:表示是否按下了ctrl/alt/shift/meta键,true/false,一般为false button:表示按下了哪一个鼠标键,一般为0 relatedTarget:表示与事件相关的元素,该参数只在mouseover或者mouseout时使用
*/
btn.dispatchEvent(event);
//触发btn的模拟click事件,因此即使不单击btn按钮,也会弹出123的
注意:safari3不完全支持鼠标事件,因此在创建事件对象时,会返回一个不包含initMouseEvent方法的event对象,
解决方案:在创建事件对象时,使用一般化的UI事件(鼠标事件和键盘事件都继承了UI事件),在创建UI事件时会返回一个包含initEvent方法的event对象,initEvent方法包含了三个参数,分别是事件类 型,是否冒泡以及事件是否可以取消,我 们可以继续向其创建的event对象添加鼠标事件的其他属性
//针对safari浏览器
var event=document.createEvent("UIEvents");
/*initMouseEvent的参数
type:触发事件的类型,例如"click" bubble:事件是否应该冒泡 cancelable:表示事件是否可以取消
*/
event.initEvent("click",true,true);
event.view=document.defaultView;
event.detail=0;
event.screenX=0;
event.screenY=0;
event.clientX=0;
event.clientY=0;
event.ctrlKey=false;
event.altKey=false;
event.shiftKey=false;
event.metaKey=false;
event.button=0;
event.relatedTarget=null;
btn.dispatchEvent(event);
7.2.2.2 模拟键盘事件
DOM并没有对键盘事件作出规定,因此并不是所有的浏览器都可以精确模拟键盘事件
针对火狐浏览器(了解一下):
1 创建事件---createEevnt,参数KeyEvents,
2 初始化initKeyEvent方法
3 触发 dispatchEvent(event)
var myTextBox=document.getElementById("myTextBox");
var event=document.createEvent("KeyEvents");
/*initKeyEvent的参数
type:'keypress',//事件类型
bubbles://表明事件是否应该冒泡
cancelable:true/false//表明事件是否可以取消
view://document.defaultView,
ctrlKey:true/false,
altKey:true/false,
shiftKey:true/false,
metaKey:true/false,
keyCode:整数//被按下或者释放的键的键码
charCode:整数//通过按键生成的字符的ASC码,该参数对keypress事件有用,模拟为0
*/ event.initKeyEvent("keypress",true,true,document.defaultView,false,false,false,false,65,65);
myTextBox.dispatchEvent(event);//虽然会触发键盘事件,但是确不会向文本框中写入文本,这是由于无法精确模拟键盘事件所造成的
7.3 IE的事件模拟:1 创建事件对象-----createEventObject 2 给步骤一的事件对象追加必要的信息 3 触发事件--fireEvent
var btn=document.getElementById("myBtn");
var event=document.createEventObject();//此处没有参数
event.screenX=100;
event.screenY=100;
event.clientX=100;
event.screenY=100;
event.ctrlKey=false;
event.shiftKey=false;
event.button=0;
btn.fireEvent("onclick",event);//注意此处的参数一是type,即事件类型,参数二是事件对象
8 事件类型:
1 、UI事件:用户界面事件,即用户与页面上的元素交互时触发的(主要与焦点有关,但是支持UI事件的浏览器很少,因此不推荐使用,这里就不再介绍了)
2、 鼠标事件:用户在页面上操作鼠标触发的
3 、键盘事件
4 、HTML事件:当浏览器窗口发生变化或者发生特定的客户/服务器交互时触发
5 、 变动(mutation)事件:当底层的DOM结构发生变化时触发
8.1 鼠标事件:包括mousedown mouseup click dbclick
1 鼠标事件可以获取到的坐标信息:clientX/clientY和screenX/screenY表示鼠标事件相对于视口和屏幕的坐标信息
2 修改键:按下鼠标的同时,按下键盘上的某些键可以影响操作,这里的修改键有shift/ctrl/alt/meta键,它们经常用来修改鼠标事件的行为,为此DOM定义了四个属性值与这四个键相对应,分别为 event.shiftEvent/event.ctrlKey/event.altKey/event.metaKey,注意IE不支持meta键
3 相关元素:针对mouseover事件来说,事件的目标是获得光标的元素,相关元素是失去光标的元素;而针对mouseout事件而言,相关元素则是获取焦点的元素,目标元素是失去焦点的那个元素
4 鼠标按钮:mousedown和mouseup事件的event对象有一个button属性,该属性表示按下/释放按钮,DOM的button属性有值0:主鼠标按钮(鼠标左键);1:鼠标滚轮按钮;2:次鼠标按钮(鼠标右键)
而IE的button属性与DOM的button属性差别很大
0 | 没有按下按钮 |
1 | 按下左键 |
2 | 按下右键 |
3 | 同时按下左键和右键 |
4 | 按下中间的鼠标按钮 |
5 | 主中 |
6 | 次中 |
7 | 主次中 |
JS--事件模块的更多相关文章
- nodejs -- event 模块, 事件模块.
1. 注册事件 on 或者 addListener,触发事件 emit 1-1简单的使用: var EventEmitter = require('events').EventEmitter; var ...
- Node.js事件的正确使用方法
前言 事件驱动的编程变得流行之前,在程序内部进行通信的标准方法非常简单:如果一个组件想要向另外一个发送消息,只是显式地调用了那个组件上的方法.但是在 react 中用的却是事件驱动而不是调用. 事件的 ...
- 关于js封装框架类库之事件模块
在触发DOM上的某个事件时,会产生一个事件对象event.这个对象中包含着所有与事件有关的信息.包括导致事件的元素,事件的类型以及其他与特定事件相关的信息. 例如: 鼠标操作点击事件时,事件对象中会获 ...
- 原生JS事件绑定方法以及jQuery绑定事件方法bind、live、on、delegate的区别
一.原生JS事件绑定方法: 1.通过HTML属性进行事件处理函数的绑定如: <a href="#" onclick="f()"> 2.通过JavaS ...
- jQuery源代码学习之九—jQuery事件模块
jQuery事件系统并没有将事件坚挺函数直接绑定在DOM元素上,而是基于事件缓存模块来管理监听函数的. 二.jQuery事件模块的代码结构 //定义了一些正则 // // //jQuery事件对象 j ...
- Zepto.js touch模块深入分析
目的:记录 Zepto.js touch模块 源码阅读 源码: // Zepto.js // (c) 2010-2015 Thomas Fuchs // Zepto.js may be freely ...
- Node.js 事件
Node.js 事件 Node.js 所有的异步I/O 操作在完成时都会发送一个事件到事件队列. Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, ...
- 第二十二课:js事件原理以及addEvent.js的详解
再看这篇博客之前,希望你已经对js高级程序编程一书中的事件模块进行了详读,不然我只能呵呵了. document.createEventObject,在IE下创建事件对象event. elem.fire ...
- Node.js 事件循环(Event Loop)介绍
Node.js 事件循环(Event Loop)介绍 JavaScript是一种单线程运行但又绝不会阻塞的语言,其实现非阻塞的关键是“事件循环”和“回调机制”.Node.js在JavaScript的基 ...
- Node.js事件循环
Node JS是单线程应用程序,但它通过事件和回调概念,支持并发. 由于Node JS每一个API是异步的,作为一个单独的线程,它使用异步函数调用,以保持并发性.Node JS使用观察者模式.Node ...
随机推荐
- flash的动态加载技术
这里所说的动态加载技术, 主要是指代码模块(可以是swc也可以是swf)的动态加载.即主swf在运行的时候, 可以根据需要动态加载所需的代码模块. 为了讨论方便, 下面所说的代码模块都用swc表示,用 ...
- EditText设置文字改变时的监听
textWatcher = new TextChangeWatcher(); etQuerryInfo.addTextChangedListener(textWatcher); /** * 文字改变类 ...
- 将java源文件制成jar包
很多人都在苦恼,如何将写好的程序代码能在日后随时调用和配置在项目中运行 今天,就让梦逸来给大家分享这个过程 首先,创建好一个文件夹,文件夹名称随意 这个文件夹中是用来存放java源文件( 未编译的 x ...
- windows docker安装方式的比较小结
稍微小结一下使用InstallDocker 和dockertoolbox的两种方式安装的docker(名称说明可能不妥,仅代表安装方式) InstallDocker 使用的是Microsoft Hy ...
- mallo函数
malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存.原型为extern void *malloc ...
- FIS--关于下载php后的配置(启动fis的调试服务器(注意添加 --no-rewrite 参数),如果报错 没有php-cgi环境,请 安装 它,并把php-cgi命令加到系统的环境变量)
“启动fis的调试服务器(注意添加 --no-rewrite 参数),如果报错 没有php-cgi环境,请 安装 它,并把php-cgi命令加到系统的环境变量” 对官网这句话的解释: 下载php-5. ...
- css3制作惊艳hover切换效果
css3制作经验hover切换效果 <!DOCTYPE html><html> <head> <meta charset="UTF-8" ...
- div仿textarea
CSS代码: .test_box { width: 400px; min-height: 120px; max-height: 300px; _height: 120px; margin-left: ...
- 使用Dottrace跟踪代码执行时间
当自己程序遇到性能问题,比如IIs请求反应缓慢,客户端程序执行缓慢,怎么分析是哪里出了问题呢?dottrace可以帮助.net程序跟踪出代码里每个方法的执行时间,这样让我们更清晰的看出是哪里执行时间过 ...
- sqlserver存储过程批量插入数据
在系统中经常会遇到向数据库中批量插入数据情况,存储过程中没有数组,只有通过字符串分割循环插入,下面是一个本人研究的一个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 c ...