上次说到我们在无菌环境中设计了一个事件代理函数,但性能是个问题,解决它我们需要缓存节点集合,发现节点集合不足以应对新情况时,再替换这个节点集合,重新开始匹配。下面是新的方案:
var delegate = function(selector,type,callback){
var els = $(selector);
addEvent(document,type,function(e){
var flag = true;
var node = e.srcElement || e.target;
for(var i=0,el;el = els[i++];){
if(node === el){
flag = false;
return callback.call(node,e);
}
}
if(flag){
els = $(selector);
for(var i=0,el;el = els[i++];){
if(node === el){
return callback.call(node,e);
}
}
}
},true);
}
<!doctype html>
<html lang="zh-ch" id="html">
<head>
<meta charset="utf-8" />
<meta content="IE=8" http-equiv="X-UA-Compatible"/>
<title>事件代理 by 司徒正美</title>
<script type="text/javascript">
window.onload = function(){
var addEvent = function(el,type,callback,data){
if ( el.addEventListener ) {//如自定义对象就绑定回调函数了
el.addEventListener( type, callback, !!data );
} else if ( el.attachEvent ) {
el.attachEvent( "on" + type, function(){
return callback.call(el,window.event)
});
}
}
var delegate = function(selector,type,callback){
var els = $(selector);
addEvent(document,type,function(e){
var flag = true;
var node = e.srcElement || e.target;
for(var i=0,el;el = els[i++];){
if(node === el){
flag = false;
return callback.call(node,e);
}
}
if(flag){
els = $(select