jQuery-1.9.1源码分析:事件包装与上下文环境

0 下载量 160 浏览量 更新于2024-08-30 收藏 137KB PDF 举报
"jQuery-1.9.1源码分析系列——事件系统之事件包装" 在深入探讨jQuery-1.9.1事件系统的事件包装时,我们首先要理解浏览器的原生事件模型及其局限性。原生事件对象是只读的,这使得jQuery无法直接修改它们以实现特定功能,例如在事件委托或上下文管理中。因此,jQuery选择创建自定义的事件对象,以扩展和增强原生事件的功能。 事件委托是一个常见的JavaScript编程技巧,它允许我们为父元素绑定一个事件处理器,以便处理子元素的事件。在这个场景中,假设我们有元素a和b,a是b的父元素,我们希望在点击a时触发fn函数。当点击事件冒泡到b时,我们需要确保fn在a的上下文中执行,而不是b的。为了实现这一点,jQuery在源码中使用了`apply`方法来改变函数的执行上下文。 这段代码展示了jQuery如何处理事件处理程序的执行: ```javascript ret = ( (jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem,args); ``` 这里,`apply`方法被用来改变函数执行的`this`值(即上下文),使其指向匹配的元素`matched.elem`(在这里是元素a)。同时,`args[0]`代表事件对象event,这样可以确保事件处理函数接收正确的事件对象。 为了确保事件对象的`currentTarget`属性反映实际的事件源(在这种情况下是元素a),jQuery在调用`apply`之前会修改`event.currentTarget`: ```javascript event.currentTarget = matched.elem; ``` jQuery事件系统区分了不同类型事件,如鼠标事件和键盘事件。对于这些事件,jQuery维护了三个关键属性集合: 1. 鼠标和键盘事件共享的属性,存储在`jQuery.event.props`中,包括`altKey`, `bubbles`, `cancelable`, `ctrlKey`, `currentTarget`, `eventPhase`, `metaKey`, `relatedTarget`, `shiftKey`, `target`, `timeStamp`, `view`, 和 `which`等。 2. 键盘事件独有的属性,定义在`jQuery.event.keyHooks.props`里,包括`char`, `charCode`, `key`, 和 `keyCode`。 3. 鼠标事件特有的属性,存于`jQuery.event.mouseHooks.props`,包含`button`, `buttons`, `clientX`, `clientY`, `offsetX`, `offsetY`, `pageX`, `pageY`, `screenX`, `screenY`, 和 `which`等。 这些属性集合允许jQuery在处理事件时,根据事件类型适当地填充和扩展事件对象,提供与原生事件兼容但更强大的功能。通过这样的事件包装,jQuery能够提供更灵活、一致且跨浏览器的事件处理机制,使得开发者在处理DOM交互时更加便捷。