`
guoyiqi
  • 浏览: 1009695 次
社区版块
存档分类
最新评论

JavaScript学习笔记——事件(转自:http://www.blogjava.net/amigoxie/archive/2007/08/27/139711.html)

 
阅读更多

说明:本文为《JavaScript高级程序设计》第9章学习笔记。

一.今天的事件

事件DOM的一部分,在DOM Level1中未定义任何事件,在Level中定义了一小部分子集,完整的事件是在Level3中规定的,该标准在2004年最终定案。

Mozilla的事件模式与DOM标准最为接近,IE成为唯一一个对DOM事件模式缺乏良好支持的浏览器。

二.事件流

事件流意味着在页面上可有不仅一个,甚至多个元素响应同一个事件。

1.冒泡型事件

IE上的解决方案的绰号为冒泡的技术。冒泡型事件的基本思想是,时间按照最特定的目标到最不特定的事件目标的顺序触发。

IE6.0中,<html/>元素也可接收冒泡的时间。

2.捕获型事件

Netscape Navigator4.0使用了捕获型事件的解决方案。事件从最不确定的对象(document对象)开始触发,然后到最精确。

3DOM事件流

DOM同时支持两种事件模型:捕获型事件和冒泡型事件,但是,捕获型事件先发生。两种事件流会触发DOM中的所有对象,从document对象开始,也在document对象结束。

DOM事件模型的最独特的性质是,文本节点也触发事件(在IE中不会)。

三.时间处理函数/监听函数

事件是用户或浏览器自身进行的特定行为。这些事件都有自己的名字,如clickload等。用于响应某个事件而调用的函数称为事件处理函数

如果是JavaScript中分配的事件处理函数,则需要首先获得要处理对象的引用,然后将函数赋值给事件处理函数属性,eg1.

varoDiv=document.getElementById(“div1”);
oDiv.onclick
=function(){
alert(“Iwasclicked.”);
}

用这个分配方法,事件处理函数必须小写,才能正确响应事件。

Eg2. <div onclick=”alert(‘I was clicked.’)”></div>

在例二中,事件处理函数的大小写可以任意

1.IE

IE中,每个元素和window对象都有两个方法:attachEvent()detachEvent()attachEvent()用来给一个事件附加事件处理函数。而detachEvent()用来将事件处理函数分离出来。Eg.

varfnClick=function(){
alert(“Clicked
!”);
}

varoDiv=document.getElementById(“div1”);
oDiv.attachEvent(“onclick”,fnClick);
oDiv.detachEvent(“onclick”,fnClick);

2.DOM

DOM方法addEventListener()removeEventListener()用来分配和移除事件处理函数。与IE不同,这些方法需要三个参数:事件名称、要分配的函数和处理函数用于冒泡阶段(为false时)还是捕获阶段(为true时)。Eg.

oDiv. addEventListener (“onclick”, fnClick, false);

oDiv.removeEventListener (“onclick”, fnClick, false);

如果使用传统方法直接给事件处理函数属性赋值,事件处理函数将被添加到事件的冒泡阶段,eg.

oDiv.onclick = fnClick;

oDiv.removeEventListener (“onclick”, fnClick, false);

四.事件对象

事件对象只在发生事件时才被创建,且只有事件处理函数才能访问。所有事件处理函数执行完毕后,事件对象就被销毁。

1.定位

IE中,事件对象是window对象的一个属性event,也就是说,事件处理函数必须这样访问事件对象:

oDiv.onclick = function() {

var oEvent = window.event;

}

Event对象只能在事件发生时访问。所有的事件处理函数执行完毕后,事件对象就被销毁。

2.属性/方法

见页面233-235页,在此不详述。

3.相似性

1)获取事件类型

下面代码可在任何浏览器中获取事件的类型:

var sType = oEvent.type;

它返回“click”或“mouseover”之类的值。Eg.

functionhandleEvent(oEvent){
if(oEvent.type==“click”){
alert(“Clicked
!”);
}
elseif(oEvent.type==“mouseover”){
alert(“mouseover
!”);
}

}

oDiv.onclick
=handleEvent;
oDiv.onmouseover
=handleEvent;

2)获取按键代码

Eg. var iKeyCode = oEvent.keyCode;

例如,Enter键的keyCode13,空格键的keyCode32,回退键为8.

3)检测ShiftAltCtrl

Eg.var bShift = oEvent.shiftKey;

var bAlt = oEvent.altKey;

var bCtrl = oEvent.ctrlKey;

4)获取客户端坐标

Eg. var iClientX = oEvent.clientX;

var iClientY = oEvent.clientY;

5)获取屏幕坐标

可用screenXscreenY属性来获取鼠标指针在计算机屏幕中的位置

var iScreenX = oEvent.screenX;

var iScreenY = oEvent.screenY;

4.区别

1)获取目标

IE中:var oTarget = oEvent.srcElement;

DOM兼容的浏览器中:var oTarger = oEvent.target;

2)获取字符代码

IE中:var iCharCode = oEvent.keyCode;

DOM兼容的浏览器中:var iCharCode = oEvent.charCode;

3)阻止某个事件的默认行为

IE中:oEvent.returnValue = false;

DOM兼容的浏览器中:oEvent.preventDefault();

4)阻止事件复制(冒泡)

IE中:oEvent.cancelBubble = true;

mozilla中:oEvent.stopPropagation ();

五.事件的类型

DOM标准定义了以下几种事件:

鼠标事件
键盘事件

HTML事件:窗口发生变动或者发生特定的客户端-服务端交互时触发;

突变事件:底层的DOM结构发生改变时触发。

1.鼠标事件

Eg. clickdbclickmousedownmouseoutmouseovermouseupmouseover

1)属性

Eg.坐标属性(egclientXclientY等)、type属性、targetsrcElement属性、shiftKeyctrlKeyaltKeymetaKeyDOM)属性、button属性(只在mousedownmouseovermouseoutmouseovermouseup事件中)。

2)顺序

在同一个目标上要按顺序发生以下事件: mousedown->mouseup->click->mousedown->mouseup->click->dbclick

2.键盘事件

键盘事件有:keydownkeypresskeyup

1)事件的属性

对某个键盘事件,会填入如下的事件属性: keyCodecharCode(仅DOM)、target(DOM)或者srcElementIE)、shiftKeyctrlKeyaltKeymetaKeyDOM)属性。

2)顺序

按下一个字符键,发生事件顺序为: keydown->keypress->keyup;

按下一个非字符键,发生事件顺序为:keydown->keyup

3.HTML事件

HTML事件有: loadunloadaborterrorselectchangesubmitresetresizescrollfocusblur事件。

1)loadunload事件

eg. window.onload = function() {

alert(“loaded!”);

}

2)resize事件

resize事件用来判断何时动态的改变某些元素。Eg.

<body onresize=”alert(‘Resizing’)”>

最大化或最小化窗口时,也会触发resize事件。

3)Scroll事件

Eg. <body onscroll=”alert(‘Scroll)”>

4.变化事件

变化事件包括如下内容:

DOMSubtreeModified——当文档或者元素的子树因为添加或删除节点而改变时触发;

DOMNodeInserted——当一个节点作为另一个节点的子节点插入时触发;

DOMNodeRemoved——当一个节点作为另一个节点的子节点删除时触发;

DOMNodeRemovedFromDocument——当一个节点从文档中删除时触发;

DOMNodeInsertedIntoDocument——当一个节点插入到文档中时触发。

这些事件的目的是,提供一个独立于语言的事件范围,使其可使用在所有基于XML的语言中。

六.跨平台的事件

1.EventUtil对象

var EventUtil = new Object;

2.添加/删除事件处理函数

EventUtil.addEventHandler=function(){
if(oTarget.addEventListener){//对DOM兼容的浏览器
oTarget.addEventListener(sEventType,fnHandler,false);
}
elseif(oTarget.attachEvent){//对IE
oTarget.attachEvent("on"+sEventType,fnHandler);
}
else{
oTarget[
"on"+sEventType]=fnHandler;
}

}


EventUtil.removeHandler
=function(oTarget,sEventType,fnHandler){
if(oTarget.removeEventListener){//对DOM兼容的浏览器
oTarget.removeEventListener(sEventType,fnHandler,false);
}
elseif(oTarget.detachEvent){//对IE
oTarget.detachEvent("on"+sEventType,fnHandler);
}
else{
oTarget[
"on"+sEventType]=null;
}

}

3.格式化event对象

一种对付IEDOM中的event对象之间区别的最佳手段是,调整它们使之尽可能地表现相似,因为更多的浏览器使用的是DOM的事件类型,所以将IE的事件模型调整为接近于DOM事件模型就可以了。

根据DOM属性/方法与IE属性/方法的不同,最后可得出如下的格式化event对象函数,如下所示:

EventUtil.formatEvent=function(oEvent){
if(isIE&&isWin){
oEvent.charCode
=(oEvent.type=="keypress")?oEvent.keyCode:0;
oEvent.eventPhase
=2;
oEvent.isChar
=(oEvent.charCode>0);
oEvent.pageX
=oEvent.clientX+document.body.scrollLeft;
oEvent.pageY
=oEvent.clientY+document.body.scrollTop;
oEvent.preventDefault
=function(){
this.returnValue=false;
}
;

if(oEvent.type=="mouseout"){
oEvent.relatedTarget
=oEvent.toElement;
}
elseif(oEvent.type=="mouseover"){
oEvent.relatedTarget
=oEvent.fromElement;
}

oEvent.stopPropagation
=function(){
this.cancelBubble=true;
}
;
oEvent.target
=oEvent.srcElement;
oEvent.time
=(newDate()).getTime();
}

returnoEvent;
}

4. 获取事件对象

IEDOM使用不同的方法来获取event对象。在IE中,event对象是与window对象相关的,而在DOM中,它独立于任何其他对象,并且是作为参数传递的。下面我们编写一个通用的获取event对象的函数,代码如下:

EventUtil.getEvent=function(){
if(window.event){
returnthis.formatEvent(window.event);
}
else{
returnEventUtil.getEvent.caller.arguments[0];
}

}

调用举例如下:

oDiv.onclick=function(){
varoEvent=EventUtil.getEvent();
}

七. 小结

本章详细介绍了JavaScript中事件、事件流的概念,详细研究了event对象,最后一节还创建了一个跨浏览器事件库,可使用同一套方法来访问事件对象,添加/删除事件处理函数,而无需考虑浏览器检测的问题。

分享到:
评论

相关推荐

    http://www.blogjava.net/youlq/archive/2005/12/06/22678.html

    总的来说,学习Acegi可以帮助开发者更好地理解如何在Spring应用中构建安全机制,包括认证、授权、以及与Spring的无缝集成。通过阅读提供的资源,你将能够掌握如何使用Acegi来保护你的Web应用程序,防止未经授权的...

    集XMPP推送与聊天于一体的Openfire开发Android

    与标题一致的描叙,你值得拥有,确实很值。来赚分啦。 参考下面大侠而来 http://blog.csdn.net/xutaozero21/article/details/4873439 ...http://www.blogjava.net/lizongbo/archive/2006/12/04/85433.html

    hadoop学习资料地址

    4. **Killme2008的博客**:`http://www.blogjava.net/killme2008/archive/2008/06/05/206043.html` - 深入解析了Hadoop的架构设计和关键点。 5. **CSDN博客** - `...

    flash动态图片的自动播放效果

    0x000000&bcastr_flie=1.jpg|2.jpg|3.jpg|4.jpg|5.jpg&bcastr_link=http://www.baidu.com|http://www.google.com|http://www.sina.com.cn|http://bbs.crsky.com|http://www.blogjava.net/supercrsky&bcastr_title=...

    java常用网址,可能已经过期了

    - [http://www.blogjava.net/wangxinsh55/archive/2006/04/27/43535.html](http://www.blogjava.net/wangxinsh55/archive/2006/04/27/43535.html) - **知识点**:Git是一款非常流行的分布式版本控制系统,广泛应用...

    android学习资料(网站,论坛)

    3. **TiGERTiAN博客(http://www.blogjava.net/TiGERTiAN/archive/2010/02/03/311827.html)**:专注于Java和Android技术的深度解析。 4. **CSDN博客...

    compass包及相关学习资料

    Compass是一个强大的,事务的,高性能的对象/搜索引擎映射(OSEM:object/search engine mapping)与一个Java持久层框架.内容包括compass的jar包及从网上搜集的相关学习资料. 附两个不错的资料地址: ...

    文件上传的解决方案总结暨CSV文件解析

    第二种是用Apache组织的commons项目中的FileUpload组件,参考资料http://www.blogjava.net/lushengdi/archive/2009/01/09/227063.html。 今天介绍第二种方案中的文件上传,文件下载功能则可细想而知。 第二种方案中...

    百度mp3Searcher

    Swing 程序 软件声明 ========== 本软件为免费开源软件!仅供学习研究使用,未供许可请不要作用于任何商业目的!欢迎学习交流!...Blog: http://www.blogjava.net/huliqing/ home: http://www.tbuy.biz/

    Eclipse 设置、调优、使用(解决 卡顿 编译 占内存等问题)

    1. JVM 启动参数大全:http://www.blogjava.net/midstr/archive/2008/09/21/230265.html 2. JVM 结构的一些知识:http://hllvm.group.iteye.com/group/wiki/2905-JVM 3. JVM 堆知识:...

    webservices示例工程

    1.webservieces 示例工程源码 里面有两个...http://www.blogjava.net/RongHao/archive/2007/06/12/123638.html(axis1) http://wenku.baidu.com/view/1d9b3d2ecfc789eb172dc8a5.html(axis2) 5.欢迎大家踊跃下载分享传播

    jadclipse反编译工具包

    包括jadclipse的jar包以及jad.exe.使用步骤详见以下网址: eclipse: http://www.blogjava.net/landon/archive/2010/07/16/326294.html myEclipse: http://hunter090730.iteye.com/blog/1578425

    python使用PIL库读取图片的像素值

    Python 使用 PIL 库读取图片的像素值 本文主要介绍了如何使用 Python 的 PIL 库读取图片的像素值,以便在游戏开发中删除不需要的...* PIL 库教程:&lt;http://www.blogjava.net/Skynet/archive/2009/11/28/303986.html&gt;

    JavaDOCHelper1.5.1_Viewer

    JavaDOCHelper Viewer 提供了在一个界面里查看、搜索众多组件的HTML格式JAVA DOC api文档,类似于chm格式。 软件界面:http://www.blogjava.net/Unmi/archive/2007/10/08/150946.html

    Struts2_Validation

    //wiki.javascud.org/display/ww2cndoc/Valida&lt;br&gt;tion 网站上收集的一些关于有关Struts2验证框架的资料,并将其做成电子书以方便查看,另外向朋友们推荐一个很好的学习Struts2的博客http://www.blogjava.net/max,...

    flex 学习网址

    - **链接**:http://www.blogjava.net/feilongone/articles/72596.html - **简介**:本文作者分享了自己在实际项目中运用Flex的一些经验和技巧,如性能优化策略、调试方法等。 - **特点**:更侧重于实践经验总结...

    libxml2-2.7.4库(附编译安装使用教程).zip

    如果希望处理xml的话,需要使用一个开源的库:libxml2 最开始应该根据本机的环境生成...对了,依附的代码摘自:http://www.blogjava.net/wxb_nudt/archive/2007/11/18/161340.html 很不错的一篇文章,在此表示感谢了!

    MyEclipse 6 Java 开发中文教程2011

    亲爱的读者, 当您掌握了本书的内容后, 应立即掌握以Google来阅读文章提高自己能力的自学之路, 并加入到企业投入到真正企业项目的锻炼中去, ...链接:http://www.blogjava.net/beansoft/archive/2010/09/09/331571.html

    MFC简易文章编辑器(Brute Froce算法)(源码+DOC+PPT)

    http://iunbug.appspot.com/ 网络阅读可访问:http://www.blogjava.net/tidelgl 网络阅读效果不是很好.推荐下载.

Global site tag (gtag.js) - Google Analytics