javascript事件处理解析
一、什么是事件!(w3c解释)
事件是可以被 JavaScript 侦测到的行为。
JavaScript 使我们有能力创建动态页面。事件是可以被 JavaScript 侦测到的行为。
网页中的每个元素都可以产生某些可以触发 JavaScript 函数的事件。比方说,我们可以在用户点击某按钮时产生一个 onClick 事件来触发某个函数。事件在 HTML 页面中定义。
二、事件的级别
在工作中我们书写js代码的时候的会有两种书写js的习惯;如下所示:

//第一种书写方式
var btn3 = document.getElementById("btn3");
btn3.onclick = function(){
/*这里执行相应的代码*/
};
//这种书写方式是dom0级事件书写的方式
//第二种书写方式
var btn3 = document.getElementById("btn3");
btn3.addEventListener('click',function(){
/*这里执行相应的代码*/
},false);
//这种是dom2级事件处理方式

在dom2级事件处理函数中定义了两个用来添加和删除事件的处理函数:
addEventListener('事件',函数,是否冒泡标志);
removeEventListener('事件',函数,是否冒泡标志);
参数说明:'事件'如单击事件'click',"函数"指的是事件发生后需要处理的动作,可以直接调用函数名,也可以直接在这里写代码,'是否冒泡标志',设置false冒泡,设置true为捕获。
添加事件和删除事件的参数值是完全相同的。
注明:使用addEventListener添加的函数只能通过removeEventListener删除,设置null不起作用,而且删除事件的参数要和添加事件的参数要完全相同才可以删除!

//第一种
var btn3 = document.getElementById("btn3");
btn3.addEventListener('click',function(){
alert('按钮');
},false);
btn3.removeEventListener('click',function(){ alert('按钮'); },false);
//第二种
btn3.addEventListener('click',showMess,false);
btn3.removeEventListener('click',showMess,false);
function showMess(){
alert('按钮');
}

dom2级事件处理函数在IE下是不支持的,IE有自己的dom2级事件处理函数:
如下:
attachEvent('onclick',showMess);//IE下面添加事件
detachEvent('onclick',showMess);//IE下删除事件
IE下面的这两个事件处理函数的参数也是完全一致的!
IE下没有事件的冒泡的标志,因为IE默认就是以冒泡的形式来处理事件的!
三、事件的冒泡和捕获
1、事件流的定义
DOM事件标准定义了两种事件流,这两种事件流有着显著的不同并且可能对你的应用有着相当大的影响。这两种事件流分别是捕获和冒泡。和许多Web技术一 样,在它们成为标准之前,Netscape和微软各自不同地实现了它们。Netscape选择实现了捕获事件流,微软则实现了冒泡事件流。幸运的 是,W3C决定组合使用这两种方法,并且大多数新浏览器都遵循这两种事件流方式。
2、什么是事件冒泡流
当事件在某一DOM元素被触发时,例如用户在客户名字节点上点击鼠标,事件将跟随着该节点继承自的各个父节点冒泡穿过整个的DOM节点层次,直到它遇到依 附有该事件类型处理器的节点,此时,该事件是onclick事件。在冒泡过程中的任何时候都可以终止事件的冒泡,在遵从W3C标准的浏览器里可以通过调用 事件对象上的stopPropagation()方法,在Internet Explorer里可以通过设置事件对象的cancelBubble属性为true。如果不停止事件的传播,事件将一直通过DOM冒泡直至到达文档根。
3、什么是事件捕获流
事件的处理将从DOM层次的根开始,而不是从触发事件的目标元素开始,事件被从目标元素的所有祖先元素依次往下传递。在这个过程中,事件会被从文档根到事 件目标元素之间各个继承派生的元素所捕获,如果事件监听器在被注册时设置了useCapture属性为true,那么它们可以被分派给这期间的任何元素以 对事件做出处理;否则,事件会被接着传递给派生元素路径上的下一元素,直至目标元素。事件到达目标元素后,它会接着通过DOM节点再进行冒泡。
4、不同浏览器处理下的冒泡和捕获在非IE浏览器下,阻止事件的冒泡是通过函数stopPropagation();来阻止的。而在IE下是通过设置变量cancelBubble = true;来阻止事件的冒泡,这是IE特有的变量。
使用如下:

function stopPropagation(event){
if(event.stopPropagation)
{
event.stopPropagation();//非IE
}
else
{
event.cancelBubble = true;//IE
}
}

一般情况下处理事件的都是按照冒泡来处理的,所以针对事件捕获的处理只有在特殊情况下才用得到!
四、事件的默认行为
事件的默认的行为就是标签在设计之时给予的行为,比如a标签的默认行为就是跳转页面,提交按钮的默认行为就是提交表单!有时候我们不希望标签在特定的环境下执行他们的默认的行为,这个就要用程序来阻止事件的默认的行为!当然阻止事件默认的行为的通用方法就是设置return false;但是这种方法比较危险,可能导致后续所有的程序不能执行,所以在一般情况下,我们采用浏览器默认的方法来阻止事件的默认行为。
在非IE下阻止事件的默认行为是通过函数preventDefault();来阻止的。
在IE下是通过设置变量returnValue = false;来阻止的。
使用如下:

function preventDefault(event)
{
if(event.preventDefault)
{
event.preventDefault();//非IE
}
else
{
event.returnValue = false;//IE
}
}

五、事件封装

var eventMy={
// 添加事件
addE:function(element,type,handler){
if(element.addEventListener){
element.addEventListener(type,handler,false);
}else if(element.attachEvent){
element.attachEvent('on'+type,handler);
}else{
//在js中中括号等价于"."
element['on'+type]=handler;
}
},
// 删除事件
removeE: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;
}
},
getE:function(event){//获取事件对象
/*
事件enent在非IE和IE8以后的浏览器可以直接获取,
而在IE8之前的浏览器要通过window.event来获取
*/
return event?event:window.event;
},
getEType:function(event){
return event.type;//获取事件的类型如'click'
},
getETarget:function(event){
//获取事件的目标在非IE下用e.target,在ie下用e.srcElement
return event.target || event.srcElement;
},
preventDefault:function(event){
if(event.preventDefault){
event.preventDefault();//阻止事件的默认行为(非IE)
}else{
event.returnValue=false;//阻止事件的默认行为(IE)
}
},
stopPropagation:function(event){
if(event.stopPropagation){
//阻止事件的冒泡(非IE)
event.stopPropagation();
}else{
//阻止事件的冒泡(IE)
event.cancelBubble=true;
}
}
}

使用方法如下:

window.onload=function(){
var go=document.getElementById('go'),
box=document.getElementById('box'); eventMy.addE(box,'click',function(){
alert('11');
}); eventMy.addE(go,'click',function(e){
e=e || window.event;//这里为了方便就不直接调用封装的代码来获取
alert(eventMy.getETarget(e).nodeName);//e.target.nodeName获取事件的事件载体的节点名称
eventMy.preventDefault(e);
eventMy.stopPropagation(e);
});
}
javascript事件处理解析的更多相关文章
- javascript如何解析json对javascript如何解析json对象并动态赋值到select列表象并动态赋值到select列表
原文 javascript如何解析json对象并动态赋值到select列表 JSON(JavaScriptObject Notation)一种简单的数据格式,比xml更轻巧.JSON是JavaScri ...
- Javascript URI 解析介绍
URI 在维基百科中对于URI的解释是这样子的: 在计算机术语中,统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串. 该种标识 ...
- 42套JavaScript深度解析教学视频!合集
本文首发于:风云社区SCOEE(社区旨在普惠软件.图片.音乐.视频.素材.文档等互联网资源.为大众提供多样化的服务,以及主要涵盖学术科学.电脑技术.文化人文.体育健身等领域的知识和信息,获得用户的支持 ...
- javascript的解析顺序
一.javascript的解析顺序 我们大家所理解的代码的执行顺序都是从上到下的,但是实际上确不是这样的.我们看一下下面的代码. 1 alert(a);2 var a = 1;如果执行顺序是从上到下的 ...
- JavaScript预解析
定义:JavaScript"预解析",可以理解为把变量或函数预先解析到它们被使用的环境中. 通俗点讲,即认为浏览器在正式运行JavaScript代码前, 第一步,会预先根据关键字v ...
- javascript的解析过程
引言: javascript是一种解释型的脚本语言,它不同于java或者c#这种编译语言,不需要编译成游览器可识别的语言,而是由游览器动态解析和执行的.(本身就是游览器可以直接识别,javascrip ...
- JavaScript中解析JSON --- json.js 、 json2.js 以及 json3.js的使用区别
JSON官方(http://www.json.org/)提供了一个json.js,json.js是JSON官方提供的在JavaScript中解析JSON的js包,json.js.json2.js.js ...
- 简述javascript的解析与执行
我们知道浏览器中javascript程序的执行是基于变量与函数的.那么浏览器是如何保存数据,又是如何执行的呢?今天我们一起来探究一下! 0.写在前 最新的 ECMAScript 标准定义了 8 种数据 ...
- JavaScript 预解析机制
首先我们来看一段代码: <script> console.log(a); var a = 10; </script> 此时运行结果为 为什么会显示undefined呢?这就 ...
随机推荐
- Java Thread线程控制
一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...
- System.Windows.Forms.Timer与System.Timers.Timer的区别(zz)
.NET Framework里面提供了三种Timer: System.Windows.Forms.Timer System.Timers.Timer System.Threading.Timer VS ...
- CPU informition
tar jxvf util-linux-ng-2.18.bz2cd util-linux-ng-2.18/./configure --enable-arch --enable-partx --enab ...
- 【Origin】晨起忆梦
昨夜有梦又还乡, 忆起少年儿郎样: 田畔有花不忍折, 岁岁年年观花放. -作于二零一五年八月四日
- HDU 4063 Aircraft(计算几何)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4063 Description You are playing a flying game. In th ...
- sql存储过程传入ID集合,和临时表的使用
方式1: Declare @SQL NVarChar(max) set @SQL='select *from Loanee as a ApplicationID in ('+@Application ...
- 夺命雷公狗---DEDECMS----7dedecms目录结构
我们dedecms的目录结构其实只需要一张图即可明了了,如下图所示:
- dumpbin使用
声明一点:Win7系统,安装的是VS2010 dumpbin.exe位于C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin目录下. 初 ...
- java总结第四次//常用类
六.常用类 主要内容:Object类.String类.Date类.封装类 (一)Object类 1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则 ...
- linux设备驱动归纳总结(五):3.操作硬件——IO静态映射【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-83299.html linux设备驱动归纳总结(五):3.操作硬件——IO静态映射 xxxxxxxxx ...