事件机制探讨
? 由于浏览器事件机制的不兼容性,譬如最常见的注册事件差异,不常见的事件触发顺序差异,以及为了支撑 component infrastructure,基本上常见的类库 YUI3,jquery,extjs 都包含了 event 模块用来注册 dom 事件和实现自定义事件的绑定与触发,理想情况下都希望自定义事件的表现同 dom 事件完全兼容,毕竟javascript不能完全的代替原生代码,虽然 yui3 已经很好的统一了自定义事件与dom事件间的鸿沟,但这是在改变了原生dom事件机制的基础上,这次从一个角度来说一下这个问题。
自定义事件监听器的返回值问题
在组件内部实现中,常常要根据调用者对某些事件的反应来进行一些操作(即AOP的概念),比如:
?
??
Extjs:
dom 事件:
Extjs dom 事件机制直接调用原生注册函数,每个用户的回调函数 a 被包装成另外一个函数 b 用以 normalize 事件,b 函数被浏览器原生的事件注册机制使用,故和原生事件机制表现一致,return false 只用来阻止浏览器的默认行为。
?
inner click -1inner click -2[a#inner javascri...aving');]inner custom -1inner custom -2[a#inner javascri...aving');]?示例查看(watch console)
?
?
?
总结:
return false 在原生dom事件机制中与框架自定义事件机制中存在不少的差异,原生 dom 事件为异步,触发顺序不定,而自定义事件为同步,javascript 自己实现,是否选择统一需要慎重考虑,我的建议则是采用yui3的事件机制来尽可能的统一自定义与dom事件,保持一致性,而return false 在dom事件中禁止使用,用event.preventDefault() 代替,减少使用者的疑惑。
?