那么jQuery事件处理机制能帮咱们处理那些问题?html
为了更深刻的理解幕后的实现,因此先整理总体的结构思路,从1.7后就去除了live绑定,因此如今的整个事件的API数组
如图:浏览器
jQuery的事件绑定有多个方法能够调用,以click事件来举例:缓存
$('#foo').click(function(){ }) $('#foo').bind('click',function(){ }) $("foo").delegate("td", "click", function() { }); $("foo").on("click", "td", function() { });
以上四种绑定都能达到同同样的效果,可是各自又有什么区别,内部又是如何实现?函数
源码分析源码分析
click方式测试
jQuery.each( ("blur focus focusin focusout load resize scroll unloadclick
dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { // Handle event binding jQuery.fn[ name ] = function( data, fn ) { return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); }; });
源码很简单,合并15种事件统一增长到jQuery.fn上优化
内部调用this.on / this.triggerui
bind方式this
bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); },
一样调用的this.on/this.off
delegate方式
delegate: function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); }, undelegate: function( selector, types, fn ) { // ( namespace ) or ( selector, types [, fn] ) return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn ); }
一样调用的this.on/this.off
one方式
one: function( types, selector, data, fn ) { return this.on( types, selector, data, fn, 1 ); },
仍是this.on
可见以上的接口只是修改了不一样的传递参数,最后都交给on实现的
实现最简单的事件委托
给父元素绑定事件,子元素也能响应
其实委托的原理都是同样的,经过事件对象过滤出关联目标的hack,作相对应的处理,那么JQuery是如何实现的呢?
jQuery事件的流程图
在绑定阶段与执行阶段
那么JQuery为了更好的对事件的支持内部又作了哪些额外的优化操做?
兼容性问题处理:
浏览器的事件兼容性是一个使人头疼的问题。IE的event在是在全局的window下, 而mozilla的event是事件源参数传入到回调函数中。还有不少的事件处理方式也同样
JQuery提供了一个 event的兼容类方案
jQuery.event.fix 对游览器的差别性进行包装处理
例如:
事件的存储优化:
jQuery并无将事件处理函数直接绑定到DOM元素上,而是经过$.data存储在缓存$.cahce上,这里就是以前分析的贯穿整个体系的缓存系统了
声明绑定的时候:
执行绑定的时候:
事件处理器:
jQuery.event.handlers
针对事件委托和原生事件(例如"click")绑定 区分对待
事件委托从队列头部推入,而普通事件绑定从尾部推入,经过记录delegateCount来划分,委托(delegate)绑定和普通绑定。
其他一些兼容事件的Hooks
fixHooks,keyHooks,mouseHooks
总的来讲对于JQuery的事件绑定
在绑定的时候作了包装处理
在执行的时候有过滤器处理
下章就开始深刻on内部实现的分析了