首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

4.3.2  W3C事件模型

W3C建议的更加灵活的事件模型要复杂一些,可以在一个DOM元素上附加任意数目的监听者。更进一步,如果行为发生在几个元素产生了重叠的文档区域,则每一个元素的事件处理函数都有机会调用并否决事件栈中更深的调用,这称为“吞没了”事件。规约建议事件栈总共遍历两次,第一次从最外面向最里面进行(从文档元素向下),第二次从最里面向最外面进行。实际上,不同的浏览器实现的是这种行为的不同子集。

在基于Mozilla的浏览器和Safari中,使用addEventListener()来附加事件回调,使用相应的removeEventListener()来删除。IE提供了类似的函数:attachEvent()detach- Event()Mike FosterxEvent对象(x库的一部分——参见本章“资源”一节)大胆地尝试在这些实现之上使用Façade模式(参见第3章)来提供丰富的跨浏览器事件模型。

这里有一个更深层的跨浏览器问题,用户定义的回调处理函数的调用方式有轻微的差异。在基于Mozilla的浏览器中,函数被调用,收到事件的DOM元素作为上下文对象,就像传统的事件模型一样。在IE中,函数上下文总是Window对象,因此不可能知道当前是哪个DOM元素调用了事件处理函数!甚至当有一个类似于xEvent层的时候,开发者在编写回调处理函数时还需要解决这些差异。

这里提到的最后问题是,没有任何一个实现提供了令人满意的方法来返回所有当前附加的监听器的列表。

因此,我建议不要使用新的事件模型。传统模型的主要缺点——缺少多个监听器的支持——可以通过使用设计模式来解决,我们在下面将要看到。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论