jquery绑定原理 简单解析与实现代码分享

2020-05-23 06:12:52易采站长站整理

handlers[handler.guid] = handler;
});
elem = null;
}
}

gevent.hander是绑定事件真正执行的函数
在gevent.hander里面也有取.特殊命名的地方 但是不知道做什么用的
hander里面先对event进行包装
包装见gevent. fix 和 setEvent
主要是对做一个原生event的一个copy 然后把不兼容的方法 都合成兼容的写法
然后取元素的events (事件列表)
然后遍历这个事件列表 判断type是不是事件列表的key 是的话就执行事件
在执行列表函数的时候会判断返回值
如果返回false 还可以组织事件冒泡 和 默认行为

win.gevent = {
handle : function(event){
var all, handlers;
//包装event
event = arguments[0] = gevent.fix( event || window.event );
event.currentTarget = this;
//这里的……..
var namespaces = event.type.split(“.”);
event.type = namespaces.shift();
all = !namespaces.length;
var namespace = RegExp(“(^|.)” + namespaces.slice().sort().join(“.*.”) + “(.|$)”);
//取这个元素的该行为 的 事件列表
handlers = (data(this, “events”) || {} )[event.type];
//遍历这个事件列表 执行该执行的东西
for ( var j in handlers ) {
var handler = handlers[j];
if ( all || namespace.test(handler.type) ) {
// Pass in a reference to the handler function itself
// So that we can later remove it
// jq上的注释是是这么写的 把event的handler 引用这个事件 方便之后移除
// 但是在remove里面 并没有用到event的handler 不知道这里到底有什么用 且有多个事件的时候这个事件被取代
event.handler = handler;
//执行事件 并且是用元素调用的事件 可以吧事件里面的this执行元素 ret为函数的返回值
var ret = handler.apply(this, arguments);
//如果有返回值 且返回值是false 执行阻止事件冒泡 阻止执行事件默认行为
if( ret !== undefined ){
event.result = ret;
if ( ret === false ) {
event.preventDefault();
event.stopPropagation();
}
}
}
}
},
props: “altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which”.split(” “),
fix : function(event){
//new setEvent会给event给以个expando属性 如果有中个属性 说明已经生成了event了 不需要在次对event进行包装
if ( event[expando] )
return event;
//保留一个原始的event
// new一个新的event 这个与原始的event是不同的
var originalEvent = event;
event = new setEvent( originalEvent );
//获得原始event的属性值 有哪些属性值 见 this.props
for ( var i = this.props.length, prop; i; ){