jquery.event 研究学习之bind篇(续 二 )

继续代码分析,其实上面已经说了。前面是处理参数的琐碎问题说白了是脏活。下面是真的处理事情的时候了。

View Code
  1 var rformElems = /^(?:textarea|input|select)$/i,
2 rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
3 rhoverHack = /\bhover(\.\S+)?\b/,
4 rkeyEvent = /^key/,
5 rmouseEvent = /^(?:mouse|contextmenu)|click/,
6 rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
7 rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
8 quickParse = function( selector ) {
9 var quick = rquickIs.exec( selector );
10 if ( quick ) {
11 // 0 1 2 3
12 // [ _, tag, id, class ]
13 quick[1] = ( quick[1] || "" ).toLowerCase();
14 quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
15 }
16 return quick;
17 },
18 quickIs = function( elem, m ) {
19 //
20 var attrs = elem.attributes || {};
21 return (
22 (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
23 (!m[2] || (attrs.id || {}).value === m[2]) &&
24 (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
25 );
26 },
27 hoverHack = function( events ) {
28 // hover事件的 主要做hover事件。
29 return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
30 };
31
32 /*
33 * Helper functions for managing events -- not part of the public interface.
34 * Props to Dean Edwards' addEvent library for many of the ideas.
35 */
36 jQuery.event = {
37 //jQuery.event.add( this, types, fn, data, selector );
38 /* | | | | |
39 * |-对象 |-事件 |-函数 |-参数|-元素(live)
40 */// | | | | |
41 add: function( elem, types, handler, data, selector ) {
42
43 var elemData, eventHandle, events,
44 t, tns, type, namespaces, handleObj,
45 handleObjIn, quick, handlers, special;
46
47 // Don't attach events to noData or text/comment nodes (allow plain objects tho)
48 //不给文本元素添加事件。
49 if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
50 return;
51 }
52
53 // Caller can pass in an object of custom data in lieu of the handler
54 //我理解的是本来以为的函数不是个函数而是个对象。这个对象有这些方法。
55 //那么应该是JQUERY已经做过的函数,把它重新进行封装。
56 if ( handler.handler ) {
57 handleObjIn = handler;//临时存储
58 handler = handleObjIn.handler;
59 }
60
61 // Make sure that the handler has a unique ID, used to find/remove it later
62 //还没ID 为它加个ID 。貌似我很久以前是这样做的。不过没这么强大。只是做了ID。
63 if ( !handler.guid ) {
64 handler.guid = jQuery.guid++;//增加当前ID
65 }
66
67 // Init the element's event structure and main handler, if this is the first
68 // 这里是读取所有函数表,如果是第一次读取没有值则定义个空的出来。
69 events = elemData.events;
70 if ( !events ) {
71 elemData.events = events = {};
72 }
73 eventHandle = elemData.handle;
74 if ( !eventHandle ) {//第一次绑定的时候。
75 /*IMPORT*/ // 这里后面用的到是做的函数序列 。做了个执行顺序的整理等等。。。
76 elemData.handle = eventHandle = function( e ) {
77 // Discard the second event of a jQuery.event.trigger() and
78 // when an event is called after a page has unloaded
79 //解决多次触发问题和未加载结束时候触发问题
80 return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
81 jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
82 undefined;
83 };
84 // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
85 //把对象做为事件触发的一个属性(Fnx-a.trigger = a)
86 eventHandle.elem = elem;
87 }
88
89 // Handle multiple events separated by a space
90 // jQuery(...).bind("mouseover mouseout", fn);
91 //如果是绑了多个函数的时候 做成数组
92 types = jQuery.trim( hoverHack(types) ).split( " " );
93 for ( t = 0; t < types.length; t++ ) {
94
95 tns = rtypenamespace.exec( types[t] ) || [];
96 type = tns[1];
97 namespaces = ( tns[2] || "" ).split( "." ).sort();
98 //对名字和函数进行分离 如果用户自己设置了方法名字而不是系统的。触发special
99 // If event changes its type, use the special event handlers for the changed type
100 special = jQuery.event.special[ type ] || {};
101 //如果是动态绑定的
102 // If selector defined, determine special event api type, otherwise given type
103 type = ( selector ? special.delegateType : special.bindType ) || type;
104
105 // Update special based on newly reset type
106 special = jQuery.event.special[ type ] || {};
107
108
109 //这里是个结构,对函数,对象,函数ID,函数触发的类型等进行了对应关系。
110 //我突然想到的竟然是 closure的模块管理,
111 //我的模块管理是根据那个来的。所以对这非常有印象。
112 // handleObj is passed to all event handlers
113 handleObj = jQuery.extend({
114 type: type, //type 事件类型 每个都独立处理了?
115 origType: tns[1],//
116 data: data,// 默认的数据
117 handler: handler,//函数
118 guid: handler.guid,//ID
119 selector: selector,//元素
120 quick: quickParse( selector ),//找到元素?
121 namespace: namespaces.join(".")//名字空间 []
122 }, handleObjIn );
123
124 // Init the event handler queue if we're the first
125 handlers = events[ type ];
126 //这是另外的一个表 估计看过模块管理的就知道。每个都是双对应关系表。
127 if ( !handlers ) {
128 handlers = events[ type ] = [];
129 handlers.delegateCount = 0;
130 //不是特殊的就一般对待。
131 // Only use addEventListener/attachEvent if the special events handler returns false
132 if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
133 // Bind the global event handler to the element
134 if ( elem.addEventListener ) {
135 //IMPORT 部分的解释。自己对应
136 elem.addEventListener( type, eventHandle, false );
137
138 } else if ( elem.attachEvent ) {
139 elem.attachEvent( "on" + type, eventHandle );
140 }
141 }
142 }
143 //特殊对待了。呵呵 这个我和我师傅都写过。
144 //开始思路清晰了吧。。。主要的是再那些正则表达式
145 if ( special.add ) {
146 special.add.call( elem, handleObj );
147
148 if ( !handleObj.handler.guid ) {
149 handleObj.handler.guid = handler.guid;//添加标示
150 }
151 }
152
153 // Add to the element's handler list, delegates in front
154 if ( selector ) {
155 //如果有LIVE
156 handlers.splice( handlers.delegateCount++, 0, handleObj );
157 } else {
158 handlers.push( handleObj );
159 }
160
161 // Keep track of which events have ever been used, for event optimization
162 //这里也是个记录表。记录哪些方法有绑定。
163 jQuery.event.global[ type ] = true;
164 }
165 //最后晴空万里。。
166 // Nullify elem to prevent memory leaks in IE
167 elem = null;
168 },
169
170 global: {},


这里主要还是说到了对应表管理。里面的几个参数我还是不太明白。不过大概思路应该和我的解释类似吧。。我觉得应该是那样的。大大们有不同见解。欢迎来找我讨论下。这个函数部分其实真的很费解的。不过现在看来,应该也不是很难了。

主要 内容:

1. 数据结构。

2. 特殊处理。

3. 参数处理

                                                      ------无代码 ,生活不完美

posted @ 2012-01-18 23:44  AlfredLee  阅读(1562)  评论(1编辑  收藏  举报