所谓的轩然大波机制,就是用来落实和事件有关的效应的函数,一般我们操作事件要3个作用:
绑定
撤销绑定
执行

比如
elem.on(‘click’, fn);

备js框架都提供事件函数,因为:
浏览器自带的轩然大波不般配。

此时此刻常用之风波实现有:
[Ext] elem.on elem.un elem.fireEvent (addEventListener 等简写)
[jQuery] elem.bind elem.unbind elem.trigger
[mootools] elem.addEvent elem.removeEvent elem.fireEvent

自下的是:
elem.on  elem.un  elem.trigger – 因为太短缺

(PS,使用 triggerListener 是一无是处的, 应该 dispatchListener)

jQuery中,将事件称为当函数方便使用。

事件中如何兑现?
也就是说当我们实施 on(‘click’, fn); 做啊事?

极致简易吗是不可采用的方是mootools的做法:
针对两样之浏览器, IE 使用 attchEvent , 其它使用 addEventListenr

如此感觉是天经地义,但产生2个问题:
当事件有几百只后,效率特别没有。(不常见)
当 on(‘click’, fA) , on(‘click’, fB)
这如click, IE先运行 fB 然后 fA  其它则正常地运作 fA和fB
。(容易导致问题)

倘说好之风波机制,当是jQuery的落实。(但效率稍小)
率先,jQuery内部生世界缓存数组。这个数组可用 $().data(‘event’)
返回。这个数据结构为:
event = {
 click: [fA, fB]
 dblclick: [fC]
};

当浏览器触发 click 后,遍历 event[‘click’] 全部函数和履。

自己最终动用以下办法贯彻。

着力与jQuery的等同, 但event数据结构为:

event = {
  click: fn_click,  // 系统click 后执行 fn_click , fn_click
执行中的持有函数。
 …
}

fn_click = {
   handlers: [fA, fB]
   target: elem
}

接下来是 事件目标的包。
所谓的风波目标,就是绑定函数的参数 e 。
(熟悉 .net 的同班愿意能还爱给她 EventArgs  )

因不同浏览器是目标不同,所以封装是一定之。
现阶段任何框架都使用从定义事件目标的计,把原本事件的各值拷到打定义之对象。
只是这么有缺点,就是杀多值也许用非交,无故计算浪费效率,(事件是常执行的,这效率不可忽略)

Ext则用函数方式,减多少没因此底正片。如得屏幕坐标,使用
e.getX()  这出接触未优美。但拿就了。

自己透过多次的考虑,决定不自定义事件目标。直接用自带的,
这般发生个短: 火狐下无法设置系统 getter 属性。
呢尽管是说:
e.target = e.target.nodeType == 3 ? e.target.parentNode : e.target;  //
标准浏览器肯能 target 是文本节点。 IE的 target则是 元素。
当火狐是错的。 因为 target是一味念之。

连接下去是效仿事件触发,

以 jQuery 中,很烦的所以代码模拟了支撑冒泡的波。 虽然当IE有一揽子的
fireEvent ,标准浏览器为来 dispatchListener 函数。

但只要协调套,可以避浏览器不同,实现统一。

相关文章

网站地图xml地图