章节
问答
课签
笔记
评论
占位
占位

Special Event机制

在事件处理中,很多地方都用到了这个 jQuery.event.special 方法,special 是一个在处理特殊的事件相当灵活,可以指定绑定和解开钩子以及定制事件的默认行为,用这个 API 的时候可以创建自定义的事件但不仅仅是执行绑定事件处理程序时,引发这些“特殊”事件可以修改事件对象传递给事件处理程序,引发其他完全不同的事件,或者执行复杂的 setup 和 teardown 代码当事件处理程序绑定到或未绑定元素。

某些事件类型的有特殊行为和属性,换句话说就是某些事件不是大众化的事件不能一概处理。

比如 load 事件拥有特殊的 noBubble 属性,可以防止该事件的冒泡而引发一些错误,所以需要单独针的处理,但是如果都写成判断的形式,显然代码结构就不合理了,而且不方便提供给用户自定义扩展。有些浏览器并不兼容某类型的事件,如 IE6~8 不支持 hashchange 事件,你无法通过 jQuery(window).bind('hashchange', callback) 来绑定这个事件,这个时候你就可以通过 jQuery 自定义事件接口来模拟这个事件,做到跨浏览器兼容。这个就是 special 的作用了,又有点类似之前说的钩子机制了。

原理

jQuery(elem).bind(type, callbakc) 实际上是映射到 jQuery.event.add(elem, types, handler, data) 这个方法,每一个类型的事件会初始化一次事件处理器,而传入的回调函数会以数组的方式缓存起来,当事件触发的时候,处理器将依次执行这个数组。

jQuery.event.add 方法在第一次初始化处理器的时候,会检查是否为自定义事件,如果存在则将会把控制权限交给自定义事件的事件初始化函数,同样事件卸载的 jQuery.event.remove 方法在删除处理器前也会检查此处。

初始化处事件处理器

if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {
   if (elem.addEventListener) {
      elem.addEventListener(type, eventHandle, false);
   }
}

卸载自定义事件

if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {
    jQuery.removeEvent(elem, type, elemData.handle);
}

jQuery.event.special 对象中,保存着为适配特定事件所需的变量和方法。

beforeunload: Object
blur: Object
click: Object
focus: Object
focusin: Object
focusout: Object
load: Object
mouseenter: Object
mouseleave: Object
pointerenter: Object
pointerleave: Object

事实上 jQuery 自定义事件那些接收的参数有点鸡肋,需要 hack 与能 hack 的事件就那么一点点,且限制颇多,一般情况下很少使用到。

得出总结:

在 jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :

方法中没有传递回调对象是因为回调的句柄被关联到了 elemData,也就是内部数据缓存中了,不难得出 jQuery 的事件绑定机制:jQuery 对每一个 elem 中的每一种事件,只会绑定一次事件处理函数(绑定这个elemData.handle),而这个 elemData.handle 实际只做一件事,就是把 event 丢到 jQuery 内部的事件分发程序。

jQuery.event.dispatch.apply( eventHandle.elem, arguments );

而不同的事件绑定,具体是由 jQuery 内部维护的事件列队来区分(就是那个 elemData.events),在 elemData 中获取到 events 和 handle 之后,接下来就需要知道这次绑定的是什么事件了。

任务

?不会了怎么办
||

提问题

写笔记

公开笔记
提交
||

请验证,完成请求

由于请求次数过多,请先验证,完成再次请求

加群二维码

打开微信扫码自动绑定

您还未绑定服务号

绑定后可得到

  • · 粉丝专属优惠福利
  • · 大咖直播交流干货
  • · 课程更新,问题答复提醒
  • · 账号支付安全提醒

收藏课程后,能更快找到我哦~

使用 Ctrl+D 可将课程添加到书签

邀请您关注公众号
关注后,及时获悉本课程动态

举报

0/150
提交
取消
全部 精华 我要发布
全部 我要发布
最热 最新
只看我的

手记推荐

更多

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?