- 浏览: 1465433 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
由于浏览器事件机制的不兼容性,譬如最常见的注册事件差异 ,不常见的事件触发顺序差异 ,以及为了支撑 component infrastructure,基本上常见的类库 YUI3,jquery,extjs 都包含了 event 模块用来注册 dom 事件和实现自定义事件的绑定与触发,理想情况下都希望自定义事件的表现同 dom 事件完全兼容,毕竟javascript不能完全的代替原生代码,虽然 yui3 已经很好的统一了自定义事件与dom事件间的鸿沟,但这是在改变了原生dom事件机制的基础上,这次从一个角度来说一下这个问题。
自定义事件监听器的返回值问题
在组件内部实现中,常常要根据调用者对某些事件的反应来进行一些操作(即AOP的概念),比如:
var Component ={ run:function(){ if(this.fire("beforeRun")==false) { return; } //action } }; Component.on("beforeRun",function(){ if(checkedFalse) return false; });
其中如果调用者不同意某个操作,则在对应操作的触发前事件监听器返回false即可。但是如果存在多个触发前事件监听器,那么各个框架的表现以及与原生dom事件的监听器return false的区别就值得总结:
html结构:
<div id="outer"> <a id="inner" href="javascript:console.log('innner leaving');"> 点我 </a> </div>
Extjs:
dom 事件:
Extjs dom 事件机制直接调用原生注册函数,每个用户的回调函数 a 被包装成另外一个函数 b 用以 normalize 事件,b 函数被浏览器原生的事件注册机制使用,故和原生事件机制表现一致,return false 只用来阻止浏览器的默认行为。
Ext.get("inner").on("click",function(e){ console.log("inner click -1"); return false; }); Ext.get("inner").on("click",function(e){ console.log("inner click -2"); }); Ext.get("outer").on("click",function(e){ console.log("outer click"); });
输出:
inner click -1 inner click -2 outer click innner leaving
自定义事件:
Extjs 自定义事件机制,遵从 observer-listener 模式,fire 时如果一个自定义事件处理函数 return false,那么之后的事件处理函数不再运行,并且 fire 返回false
function test() { test.superclass.constructor.apply(this,arguments); } Ext.extend(test,Ext.util.Observable); var t=new test(); t.on("run",function(){ console.log("custom event run -1"); return false; }); t.on("run",function(){ console.log("custom event run -2"); }); console.log(t.fireEvent("run"));
输出:
custom event run -1 false
YUI3:
dom事件:
YUI3 将自定义事件与dom事件结合在一起,都augment自EventTarget,原理同extjs的自定义事件,故和Extjs的自定义事件表现一致。并且不会阻止冒泡以及停止默认。后面注册的监听器不再调用,但是模拟触发的返回值对于dom事件是没有意义的,simulate没有返回值
PS : return false 同 stopImmediatePropagation 不同之处在于 return false 不会阻止事件冒泡,但stopImmediatePropagation会
var inner=Y.one("#inner"); var outer=Y.one("#outer"); inner.on("click",function(e){ console.log("inner click -1"); return false; }); inner.on("click",function(e){ console.log("inner click -2"); }); outer.on("click",function(e){ console.log("outer click"); }); //Y.Event.simulate(inner._node,"click");
输出:
inner click -1 outer click innner leaving
自定义事件:
原理同dom事件,yui3不同于extjs之处在于对于自定义事件增加了模拟dom事件的冒泡(bubbleTarget),默认处理函数(defaultFn)以及自定义事件独有的广播(broadcast)。
function testCustom(){} Y.augment(testCustom,Y.EventTarget); var t=new testCustom(); t.on("run",function(){ console.log("custom event run -1"); return false; }); t.on("run",function(){ console.log("custom event run -2"); }); console.log(t.fire("run"));
输出:
custom event run -1 false
jquery:
jquery一切以节点为中心(或任何操作要以jquery节点作为开始),自定义事件也必须附加在节点上,触发自定义事件在节点层次中冒泡。KISSY借鉴,dom事件与自定义事件没有区别,触发的返回值为了链式操作返回自身而丧失了aop的依赖判断。
return false 会停止冒泡以及阻止默认行为,但不会阻止后续监听器运行
$("#inner").bind("click",function(){ console.log("inner click -1"); return false; }); $("#inner").bind("click",function(){ console.log("inner click -2"); }); $("#inner").bind("custom",function(){ console.log("inner custom -1"); return false; }); $("#inner").bind("custom",function(){ console.log("inner custom -2"); }); $("#outer").bind("click",function(){ console.log("outer click"); }); $("#outer").bind("custom",function(){ console.log("outer custom"); }); console.log($("#inner").trigger("click")); console.log($("#inner").trigger("custom"));
输出:
inner click -1 inner click -2 [a#inner javascri...aving');] inner custom -1 inner custom -2 [a#inner javascri...aving');]
总结:
return false 在原生dom事件机制中与框架自定义事件机制中存在不少的差异,原生 dom 事件为异步,触发顺序不定,而自定义事件为同步,javascript 自己实现,是否选择统一需要慎重考虑,我的建议则是采用yui3的事件机制来尽可能的统一自定义与dom事件,保持一致性,而return false 在dom事件中禁止使用,用event.preventDefault() 代替,减少使用者的疑惑。
发表评论
-
模块化高扩展性的前端框架 KISSY
2013-03-14 14:58 8633模块化高扩展性的前端框架 KISSY 注:本文为 2 ... -
构建前端 DSL
2012-10-11 22:10 5372目前在传统的软件开 ... -
KISSY kisses bootstrap navbar
2012-08-03 01:12 6058看了下 bootstrap 的导航菜单,立刻非常喜欢,注意是浅 ... -
promise api 与应用场景
2012-02-07 17:34 7402promise 是 commonjs 社区中提出的异步规范,其 ... -
unified event model
2011-10-14 23:02 1790为了处理原生事件在各 ... -
转载:瀑布流布局浅析
2011-09-29 19:02 2853简介 如果你经 ... -
cross domain request
2011-09-29 18:39 2851场景 跨域请求是随着 ... -
基于多继承的树设计
2011-09-18 03:42 2271分类 树是一种常见 ... -
caja 原理 : 前端
2011-09-01 16:48 7077作为前端开放的基础安全保证,caja 是目前比较合 ... -
ie 下 cloneNode 导致的属性克隆
2011-08-24 16:10 2483这个还是很值得记下,一直存在的很大隐患终于解决,由于在 ie& ... -
just another event model
2011-06-08 20:47 2172事件模型也算是客户端兼容性的一个长期问题,早期 jquery ... -
框架 build 系统介绍
2010-07-11 01:29 1664一个复杂的类库通常都包括很多子模块( jquery@git ... -
querySelectorAll 探讨
2010-07-01 22:35 5244随着css selector engine在越来越多的java ... -
再谈 attribute
2010-06-22 11:37 2683@slideshare 原生: ... -
利用Attribute重构:业务与UI分离
2010-06-08 16:54 1592很简单的一个应用 通过按钮来限制输入范围 ,这样的话再 ... -
yui3 loader的串行加载特性
2010-06-04 12:30 1817yui3 的沙箱机制可以在 ... -
yui3下的load事件触发
2010-06-01 13:31 3250以前的一些总结:页面l ... -
理解YUI3 extension:Base.create
2010-05-31 03:01 2008YUI3中为了避免不必要的类继承层次,以及摆脱利用原型链模拟的 ... -
google WebFont Loader 源码阅读
2010-05-22 01:04 2788资料: 关于新发 ... -
jquery yui 对比
2010-04-29 09:58 0http://carlos.bueno.org/jq-yui. ...
相关推荐
在Java编程语言中,事件处理机制是构建图形用户界面(GUI)交互功能的核心技术。理解这一机制对于编程人员而言至关重要,因为它涉及到程序如何响应用户的操作。为了让初学者更好理解Java事件处理机制及其编程技术,黄...
Java 事件处理机制探讨 Java 事件处理机制是 Java 语言 GUI 编程中的一个重要内容,涉及到多个抽象的概念和复杂的对象之间的关系,对初次接触的学生来说,难以清晰地理解其原理。本文探讨了如何在教学中科学地讲授...
下面我们将深入探讨这些组件以及相关的事件监听器适配器。 首先,事件源是产生事件的对象,通常是UI组件,如按钮、文本框等。当用户与这些组件交互时,事件源会生成相应的事件。例如,当用户点击一个按钮时,按钮...
我们今天将深入探讨Android的触摸事件(TouchEvent)以及其在事件传递过程中的详细运作方式。 触摸事件(MotionEvent)是Android系统中表示用户与屏幕交互的基本类,它包含了事件的类型(ACTION_DOWN、ACTION_UP、...
本示例"java事件处理机制Demo"将深入探讨Java的观察者模式(Observer Pattern)及其在实际项目中的应用。 首先,我们来理解什么是观察者模式。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当...
本教学方法探讨旨在深入理解并有效地教授Java事件处理,帮助学习者掌握这一关键技能。 Java事件处理基于观察者模式(Observer Pattern),其中事件源(如按钮或菜单)是被观察的对象,而事件监听器是观察者,负责...
在Android开发中,事件分发机制是理解和优化用户交互体验的关键环节。事件,通常指的是用户的触摸操作,如点击、滑动等,这些操作如何被准确地传递到相应的View上进行处理,就是事件分发机制的核心内容。下面我们将...
本文将深入探讨"view的事件分发机制demo2",并基于链接提供的详细讲解进行总结。 Android事件分发机制主要包括三个步骤: DispatchTouchEvent(事件传递)、onInterceptTouchEvent(拦截事件)和onTouchEvent(处理...
本文将深入探讨Android事件分发机制,特别是触摸事件(Touch事件)的处理流程。 首先,我们要理解Android事件的产生过程。当用户与设备交互,如点击屏幕或按下物理按键时,硬件会生成相应的事件,这些事件由Android...
本文将深入探讨Android事件分发机制,帮助开发者理解这一关键概念。 首先,我们从事件的产生说起。在Android中,所有的触摸事件都由InputManager服务来管理。当用户在屏幕上触碰时,硬件层会生成一个MotionEvent,...
本文将基于“Android事件分发机制全解析Demo”进行深入探讨,并通过实际的代码示例来帮助你更好地理解和掌握这一机制。 首先,我们需要了解事件分发链的基本流程。在Android中,事件(如点击事件)的分发遵循“自顶...
在探讨QT的事件处理机制之前,我们需要先理解事件在软件开发中的重要性。事件是程序与用户的交互桥梁,它们能够捕获用户的动作并触发相应的处理逻辑。在图形用户界面(GUI)应用程序中,事件处理尤其关键,因为用户...
本篇文章将深入探讨View事件机制,包括事件分发、事件处理以及触摸事件的流程。 首先,我们从事件的产生开始。在Android系统中,所有的触屏事件都由系统级别的`MotionEvent`对象表示。当用户在屏幕上进行触摸操作时...
本文将深入探讨“Android事件分发机制总结Demo”,结合代码实例MyTouchEventDemo,帮助开发者清晰理解这一核心概念。 事件分发机制主要涉及三个关键组件:View、ViewGroup(布局)和MotionEvent。当用户触摸屏幕时...
本文将深入探讨React Native的触摸事件机制,并展示如何利用这一机制实现类似微信通讯录的功能。 首先,我们要了解React Native中的触摸事件系统。与Web开发中的点击事件不同,React Native使用了一套基于 ...
在本文中,我们将深入探讨PHP事件机制的第二部分,重点关注如何简化事件处理。 在上一个版本的事件机制中,可能涉及了复杂的事件监听器和触发器的实现,而在这个版本中,主要目标是简化这一过程。我们来看一下具体...
Flex事件机制是Adobe Flex应用程序开发中的核心组成部分,它允许组件之间进行有效的通信和交互。对于初级Flex程序员或爱好者来说,理解这一机制至关重要。在本文中,我们将深入探讨Flex事件的各个方面,包括事件流、...
本文将深入探讨这两种机制及其在实际开发中的应用。 一、基于监听器的事件处理 1. 视图层次结构:Android的UI组件(View)构建了一个树状结构,事件会沿着这个层次结构从根节点向叶子节点传递。这种现象被称为...
### JavaScript事件机制详解 #### 一、引言 在学习编程语言的过程中,"事件"这一概念往往是初学者遇到的一个难点,然而它又是编程中极为重要的一个组成部分。在JavaScript中,事件处理更是不可或缺的一部分,它是...