jq里面有一个data的方法,给dom元素绑定相关的数据的。当给dom用jq的方法绑定了事件,会生成对应的时间列表 可以看下面的例子(请在firefox中查看 因为firefox中对象支持toSource())
data是给元素绑定数据的
数据源是 cache对象
当元素绑定数据的时候 会给元素添加一个属性 jQueryxxx xxx为执行jq的时间戳
这里要说明一下,有一个uuid 他是累加的
jQueryxxx的值就是这个uuid
cache 的 key就是这个 uuid
value就是要存的数据
data对于事件的绑定是很重要的................................
win.each = function( object,callback,args ) { var name,i = 0,length = object.length; if ( args ) { if ( length === undefined ) { for ( name in object ) if ( callback.apply( object[ name ],args ) === false ) break; } else for ( ; i < length; ) if ( callback.apply( object[ i++ ],args ) === false ) break; } else { if ( length === undefined ) { for ( name in object ) if ( callback.call( object[ name ],object[ name ] ) === false ) break; } else for ( var value = object[0]; i < length && callback.call( value,i,value ) !== false; value = object[++i] ){} } return object; }
接着实现添加事件
jq里面是在 jQuery.event里面的add方法 在add方法里面实现了一下一些功能 取元素的events,handle这2个data绑定的数据 events存放的是事件列表 格式如下 { click: [{handler:function(){},type:"click",guid:'xx'}.......], mouse:[......] } handle是执行的函数 (所有的执行函数都是一样的 他们遍历事件列表 执行对应的事件) 然后遍历types 因为可以绑定多个事件 回调函数也会给几个属性 假设回调函数是handler handler.guid = gevent.guid++ handler.type = name name应该算一个特殊的命名 方便删除用的 比如 $('#xx') .bind('click',function(){}) .bind('click.d',handler) name就是d了 删除的时候可以只删除d那个事件 不删除上面的那个 click事件
最后是给元素绑定事件 但是执行的函数都是
function(){
gevent.handle.apply(arguments.callee.elem,arguments);
});
gevent.hander是绑定事件真正执行的函数
在gevent.hander里面也有取.特殊命名的地方 但是不知道做什么用的
hander里面先对event进行包装
包装见gevent. fix 和 setEvent
主要是对做一个原生event的一个copy 然后把不兼容的方法 都合成兼容的写法
然后取元素的events (事件列表)
然后遍历这个事件列表 判断type是不是事件列表的key 是的话就执行事件
在执行列表函数的时候会判断返回值
如果返回false 还可以组织事件冒泡 和 默认行为
if ( !event.relatedTarget && event.fromElement )
event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
return event;
}
}
win.setEvent = function(src){
// Allow instantiation without the 'new' keyword
// Event object
if( src && src.type ){
this.originalEvent = src;
this.type = src.type;
// Event type
}else
this.type = src;
// timeStamp is buggy for some events on Firefox(#3843)
// So we won't rely on the native value
this.timeStamp = now();
// Mark it as fixed
this[expando] = true;
}
function returnFalse(){
return false;
}
function returnTrue(){
return true;
}
setEvent.prototype = {
preventDefault: function() {
var e = this.originalEvent;
if( !e )
return;
// if preventDefault exists run it on the original event
if (e.preventDefault)
e.preventDefault();
// otherwise set the returnValue property of the original event to false (IE)
e.returnValue = false;
},
stopPropagation: function() {
var e = this.originalEvent;
if( !e )
return;
// if stopPropagation exists run it on the original event
if (e.stopPropagation)
e.stopPropagation();
// otherwise set the cancelBubble property of the original event to true (IE)
e.cancelBubble = true;
},
stopImmediatePropagation:function(){
this.isImmediatePropagationStopped = returnTrue;
this.stopPropagation();
},
isImmediatePropagationStopped: returnFalse
};
一个完整的例子
以上内容只是自己的一些理解,水平有限,难免有错,望指正...