

免费预览已结束,剩余11页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
个人收集整理-ZQjavascript的三种事件模型事件使得客户端的 有机会被激活,并得以运行。在一个 页面装载之后,运行脚本的唯一方式,就是响应系统或者用户的动作。虽然从第一个支持脚本编程的浏览器面世以来,简单的事件被实现为 的一部分;但是大多数最近出现的浏览器都实现了强壮的事件模型,使脚本可以更加智能地处理事件。现在的问题在于:为了支持各种浏览器,您必须和多个先进的事件模型做斗争,准确地说,是三个。这三个事件模型分别和下面的文档对象模型( ,即 )三巨头结盟: (), 和 系统的 及其更新版本(),以及在 中得到实现的 。尽管这些模型之间有些地方存在一些本质的差别,但是在一些简易的 的帮助下,它们都可以同时适用于同一个文档。本文主要着眼于相互冲突的事件模型中的两个关键方面: * 把一个事件和 元素绑定起来的方法。 * 在事件被触发后如何对之进行处理。事件绑定的方法事件绑定是指构造一个响应系统或者用户动作的 元素的过程。在不同的浏览器版本中,有不少于五种事件绑定技术。下面我们快速地介绍一下这些技术。b5E2R。b5E2R。事件绑定方法:绑定元素属性最简单和向后兼容性最好的事件绑定方法是把事件绑定到元素标识的属性。事件属性名称由事件类型外加一个“”前缀构成。尽管属性并不是大小写敏感的,人们还是定义了一个规则,规定事件类型的每一个“词”的首字母大写,比如 和 。这些属性也被称为事件处理器,因为它们指示了元素如何“处理”特定的事件类型。p1Ean。p1Ean。正确的事件处理器属性的值在形式上是被引号包含的 语句。最常见的值是一条调用某个脚本函数的语句,而被调用的函数在位于文档前部的 标识中定义该标识通常位于 部分。举例来说,下面的函数:DXDiT。DXDiT。 () 可以被定义为一个按键控件的事件处理器,按键的定义如下:把事件绑定到元素属性上有一个优点,即可以支持开发者把参数传递给事件处理器函数。接收事件的元素的引用则由一个特殊的参数值 关键字来传递。下面的代码演示一个函数如何借助传入参数,把任意数目的文本框的内容转化为大写:RTCrp。RTCrp。 () ();. () ().事件绑定方法:绑定对象属性对于 和 这两类浏览器,脚本编程人员可以以脚本语句的方式把事件绑定到对象上,而不是绑定到元素标识的属性上。每一个负责事件响应的元素对象都为自己能够识别的事件设置了相应的属性。对象属性名称是元素标识属性的小写形式,比如 。 还接受 (即首字小写,之后的每一个词的首字大写)版本的属性名,但是考虑到跨浏览器的兼容性,所有字母都是小写的名称会更安全一些。5PCzV。5PCzV。当您把一个函数的引用赋值给一个事件属性的时候,就发生了绑定。函数的引用是指函数的名称,但是不带函数定义中的括号。因此,如果要为一个名为 的按键的点击事件()进行绑定,使之激活一个定义为 () 的函数,则其赋值语句如下所示:jLBHr。jLBHr。 ;您应该注意一点:在事件触发的时候,没有办法向事件函数传递参数。本文在稍候对事件处理过程的讨论中还会回顾这个问题。xHAQX。xHAQX。事件绑定方法: 绑定 标识在 中, 对 标识实现了自己的扩展,可以将它包含的脚本语句和某个元素的一个事件类型进行绑定。支持这个绑定的标识属性(还没有被 批准为 的一部分)是 和 。LDAYt。LDAYt。 属性的值必须是您为元素的 属性分配的唯一标识符。然后,您必须把事件的名称(,等等)分配给 属性。在上面的按键实例的基础上,我们必须对按键标识进行修改,使之包含一个 属性:Zzz6Z。Zzz6Z。脚本语句并不在函数中,而是在 标识中,如下所示: 当然,标识中的语句可以调用页面上其它地方定义的任何函数(或者从文件中导入的函数)。然而,这种绑定方式意味着您必须为每一个元素和每一个事件创建一个 标识。dvzfv。dvzfv。您还必须小心,只能把这种绑定方法部署在仅供 浏览器浏览的页面。其它任何支持脚本编程而又没有实现这个特殊的 标识的浏览器(包括 ),都将把它作为常规的 标识来处理,并试图在页面装载的时候执行这些脚本语句这不可避免地引起脚本错误。rqyn1。rqyn1。事件绑定方法:使用 的 () 方法早在 工作组磨砺出标准的事件模型之前,() 方法已经被实现了,并且可被用于 版的 或更新版本的浏览器上的每一个 元素。Emxvx。Emxvx。() 方法的用法如下所示:(, ); 参数的值是表示事件名称的字符串,比如 。 参数是一个不带括号的函数引用,和早些时候描述的事件属性方法中一样。因此对于上面例子的按键对象,可以通过如下的脚本语句把函数绑定到按键的 事件:SixE2。SixE2。()(, );由于 () 方法必须严格工作在 的环境中,所以您既可以使用 的元素引用方式(如上文所示),也可以使用 的引用方式:6ewMy。6ewMy。(, );这个方法有一个值得注意的地方:您不能在元素被载入浏览器之前执行这个语句。该对象的引用在相应的 按键元素被浏览器创建之前,都是无效的。因此,要让这样的绑定语句或者在页面的底部运行,或者在 元素的 事件处理器调用的函数中运行。kavU4。kavU4。事件绑定方法:使用 的 () 方法 使用的是 级别定义的事件绑定机制,这个机制和 的 () 方法很类似,但是有自己的语法。 规范为 层次中的每一个结点都定义了一个 () 方法。 元素是 结点中的一类,在一对元素标识内部的文本结点也是一个结点,也能够接收事件。这一点在 事件处理过程中经常得到体现,在本文的后面部分您将会看到。y6v3A。y6v3A。() 方法的语法如下所示:(, , );用 规范中的行话来说,() 方法为指定的结点注册了一个事件,表示该结点希望处理相应的事件。这个方法的第一个参数是一个声明事件类型的字符串(不带前缀),比如 ,和 。() 方法的第二个参数可以和早些时候描述过的函数引用同样对待。第三个参数则是一个 值,指明该结点是否以中所谓的捕捉模式来侦听事件。事件的捕捉和派发综合起来称为事件的传播最后由另一篇文章来描述。对于一个典型的事件侦听器来说,第三个参数应该为 (假)。M2ub6。M2ub6。那种绑定方法最好?如果您足够幸运,只需要为某一个操作系统上特定版本的浏览器创建应用程序,则可以为选定的浏览器选择最现代的绑定方式。但是对于跨浏览器的网站作者来说,选择绑定方法则需要面对实质性的挑战。0YujC。0YujC。如果您只计划支持 ,则可以不考虑 () 和 () 方法,因为 对这两种方法都不支持。这种情况下,比较实际的选择有两种,要么绑定标识属性,要么绑定对象属性。这时就需要费心思了。eUts8。eUts8。一方面, 承认基于标识属性的方法,并将它推荐为 () 方法的可接受代替方法。为了和数以百万计的脚本相兼容,所有支持脚本编程的浏览器都支持基于标识属性的事件绑定方法。一些自动化的页面制作工具,比如 ,也把事件处理器的属性嵌入到 标识中。sQsAE。sQsAE。但是另一方面,在元素标识文件中嵌入面向脚本的信息,又不能将内容从风格及行为中分离开来,这和当前的流行趋势相违背。把事件绑定到对象属性上的方法听起来方向是对的,但是在 关于 ,或者 的标准中,并没有对事件属性提供“官方”的支持。尽管如此,在实际生活中,除了第一代支持脚本编程的浏览器之外,其它浏览器都支持这种方法。GMsIa。GMsIa。一个纯标准论者会认为上述的两种方法都有缺点,但是对于讲究实际的开发者来说,即使考虑到未来主流浏览器的兼容性,这两种方法都是“安全”的。TIrRG。TIrRG。事件的信息矿:事件对象所有这三种事件模型的核心都是一个事件对象它是一个抽象的实体,其属性中包含很多对事件处理函数具有潜在价值的信息。从本文早些时候对事件绑定技术的讨论中,您可能可以推断出事件对象对脚本之所以至关重要,原因之一是除了基于标识属性的绑定方法以外,其它绑定方法都不支持将参数传递到事件处理函数中。7EqZc。7EqZc。事件对象通过提供足够的“挂钩”,使事件处理函数可以读取事件的特征,从而填补了这个缝隙。因此,事件处理函数可以得到接收事件的元素的引用,以及其它一些有用的信息,比如鼠标动作的坐标,鼠标使用的按键,键盘上被按压的键,以及在事件发生的过程中是否有修饰键被按下(比如检测 事件)。lzq7I。lzq7I。访问事件对象虽然事件对象的精确构成因为本文讨论的三种 (,以及 )的不同而有所变化,但是,一个事件处理函数只能通过以下两种方式之一来访问事件对象: 方式和 方式。 事件对象公布给脚本的接口方式和 的事件对象一样;而 则有自己的方法。zvpge。zvpge。 的事件对象更加易于描述,因此我们首先对它进行讨论。简单地说,事件对象是 对象的一个属性。这意味着在所有的实例中只有一个事件对象。举例来说,在键盘上简单地按压和松开一个按键,会产生三个事件:,和 (事件的发生顺序和这里的列举顺序相同)。如果事件激活的函数花费很长的时间进行处理,则浏览器就会把其它两个事件保持在队列中,直到 事件处理完成为止。NrpoJ。NrpoJ。而对于 和 来说,事件对象看起来就更加抽象一些。除了基于标识属性风格的绑定方法之外,其它绑定方法都是把事件对象自动传递给与事件相绑定的函数。传递给函数的是一个单一的参数。开发者需要在函数中定义一个参数变量,来“接收”该参数的值。为了避免和中的 对象互相冲突,请不要把参数命名为 。举例来说,把它命名为 就相当好,相应的事件函数的定义大致如下:1nowf。1nowf。 () 然而,如果您使用的是基于标识属性的事件绑定技术,就必须显式地把事件作为一个参数传递到您调用的函数。为了完成事件的传递,需要把 这个关键字作为参数进行传递:fjnFL。fjnFL。 ()外部传入的参数是您的事件处理函数和 的事件对象之间的唯一联系纽带。如果在主事件处理函数内部调用的其它函数需要该对象或者该对象的属性值,则您可以把该对象或其属性值作为参数中继给这些函数。tfnNh。tfnNh。如果您想知道 是否把事件的引用保存在 属性中,那答案是“是”。使用这个语法交集是相当安全的,因为在 和 这两个浏览器,被传递到事件处理函数的事件对象都有您所期望的当前事件的属性值。HbmVN。HbmVN。兼容两种事件对象引用设想在处理事件时,我们需要在一个事件函数中考察一个或者多个事件属性。这是一个简单的技术,可以使事件处理函数和作为参数传入的事件对象协同工作,或者从 属性中读取信息。而且,这个技术不必处理不同的浏览器版本之间的细微差别。V7l4j。V7l4j。在开始的时候,需要在您的事件处理函数中定义一个参数变量,准备接收可能传入的事件对象。然后,通过简单的条件表达式把浏览器的事件对象赋值给上述的参数变量:83lcP。83lcP。 () () ? : () ? : ) 如果事件对象真的以参数的形式传进来了,则在函数内部,事件对象就被保留在 这个局部变量中。如果这个参数是 ,而且浏览器的 对象包含有一个 属性,则 对象就会把自己赋值给 变量。mZkkl。mZkkl。然而,为了完成这个工作,还应该再包含一层或者多层条件控制,以便优雅地适应那些在事件模型中没有定义事件对象的的早期浏览器:AVktR。AVktR。 () () ? : () ? : ) () 为了把同样的方式应用到所有事件处理函数的构建中,您可以定义一个函数来兼容两种事件,即由绑定的标识属性显式传入的事件对象,以及由绑定的事件属性隐式传入的事件对象。这样即使您在开发过程中改变了事件绑定的风格,这个函数也不必改变。ORjBn。ORjBn。瑞典自助餐式地选择事件对象然而,建立一个指向事件对象的引用只是战斗的一部分。来自不同事件模型的每一个事件对象都拥有自己的一套属性,以容纳事件的细节。下面的表格列出了最常用的属性,以及这些属性在上述三种事件对象类型中的名称。2MiJT。2MiJT。表格 . 流行的事件对象属性描述 * * 标注*的属性值可以通过对 或者 进行求值来得到。 版本的在通常情况下都遵循 的事件对象模型,但是有一个例外,即 的事件对象既定义了 属性,也定义了 属性,这两个属性都指向接收事件的元素。gIiSp。gIiSp。需要抽象的最重要的事件对象属性可能得算指向接收事件的 元素的引用。 和 的事件对象采用相同的属性名(),而 的事件对象则使用 属性。这时候,对象检测技术(而不是费力劳神而又具有危险倾向的浏览器版本识别方法)再次拯救了我们。对于那些非文本容器的元素,一个简单的条件表达式就可以轻松处理脚本语法上的差别:uEh0U。uEh0U。 () ? : 从现在开始,您的脚本就可以读写任何浏览器对象模型公布出来的元素对象属性了。 结点的事件目标 的结点架构使得文档中的每一个结点都可以接收事件。在支持这一架构的浏览器中,发生在嵌套文本顶上的事件并不调用分配给文本容器的事件处理器,相应的文本结点才是该事件的目标结点。考虑如下场景:IAg9q。IAg9q。在事件实例,当鼠标的指针在一个 元素包含的文本顶上滚动时,该文本就会被高亮显示。事件绑定的过程通过对象属性在 () 函数中进行。从表面上看,当用户在 元素顶上滚动鼠标时, 事件动作函数就为该元素指派一个与风格表单规则相关联的类名(),该风格规则把文本的显示风格定义为粗体,黄色背景;而在 函数中,则把风格恢复为原始的版本(类 )。请注意一个 () 函数是如何在事件对象的 属性的帮助下,执行两个动作的(该属性在所有事件模型对象中的名称是相同的)。请试一下这个事件实例。WwghW。WwghW。但是如果您把例子装载到 ,则鼠标事件的真正目标就是 元素中的文本结点了。本文并不讨论事件的传播机制,但是请相信, 事件模型的缺省行为会使事件沿着结点的包含层次向上传播(和 中事件通过元素容器向上传播的机制很类似)。因此,在这个事件实例中。鼠标事件会从其真正的目标向上传递到文本结点的容器(也就是 元素)。这些事件触发了 元素中相应的事件处理器。asfps。asfps。虽然事件处理器属于 元素,事件对象还是保留文本对象的引用,并将它作为事件的原始目标。然而,只有对文本结点的容器进行动作,才能修改它的风格。为了实现 () 函数的等价操作,使之可以修改容器的 属性,该函数需要派生出一个指向文本结点容器的引用。ooeyY。ooeyY。一个策略是使用 事件对象的 属性,该属性返回一个处理事件的结点的引用。脚本中的决策树需要考虑这个属性,增加代码之后的 () 函数如下所示:BkeGu。BkeGu。 () () ? : () ? : ) () () ( ( ) ( ) ? : 另一个可选的方法是考察由 属性返回的对象的 属性。一个能够把事件定向给文本结点的浏览器,也可以把一个文本结点的 属性值报告为,而不是报告为元素结点的类型(其值为)。如果事件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 超声专业知识试题及答案
- 乳胶漆施工合同范本
- 山林承包经营合同
- 经济师专业试题及答案
- 郴州网络安全知识题库及答案解析
- 银行从业资格考试合格分及答案解析
- 山东省建筑安全网络题库及答案解析
- 学前卫生学自考试题及答案
- 国际经济法概论自考试题及答案
- 药典知识竞赛题及答案
- 汾酒代理合同
- 高中物理《相互作用》大单元集体备课
- 隧道施工行业分析
- 大学生职业生涯规划说课课件
- 新能源汽车整车控制系统检修高职全套教学课件
- 桥式起重机的安全维护范本
- 读书分享读书交流会《活着》课件2
- 三人合伙开公司协议书:免修版模板范本
- (完整版)经典无领导小组讨论题目(附答案)
- 健康心理快乐成长小学课件
- 北师大版四年级上册数学早读资料PPT
评论
0/150
提交评论