//indexOf方法在某些浏览器需要自行实现
//是则放入选择器中
ret.push( cur );
break;
} else {
// 否则把当前节点变为其父节点
cur = cur.parentNode;
//如果没有父节点(说明其还没有插入DOM树),或不是元素节点,或是文档碎片(说明其刚被移出DOM树)
if ( !cur || !cur.ownerDocument || cur.nodeType === 11 ) {
break;
}
}
}
}
//如果大于1,进行唯一化操作
ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
//将节点集合重新包装成一个新jQuery对象返回
return $(ret);//本人觉得pushStack真是个邪恶的方法,让菜鸟不籽有链下去的欲望,殊不知这是维护的大敌
},
注意,jquery1.6中closest方法不再是返回包含一个或零个节点的jQuery对象了,再是对应多个了(因此jQuery官网文档是错误的,没有即时同步这变化.)
<!doctype html>
<html>
<head>
<title>closest在jquery1.6的改变 by 司徒正美</title>
<script src="jquery.js"></script>
<script>
$(function(){
$("p").delegate("strong","click",function(){
alert(this.innerHTML)
});
alert($("strong").closest("p").length)
});
</script>
</head>
<body>
<p>
<strong>使用事件代理1</strong>
</p>
<p>
<strong>使用事件代理2</strong>
</p>
<p>
<strong>使用事件代理3</strong>
</p>
</body>
</html>
下面是我的实现:
closest: function( exPR ) {
// 如果字符串包含位置伪类或者是个元素节点,则封装为一个dom对象,否则为0(即false的简写,用于快速跳过分支)
var node = expr.nodeType ? expr : 0, nodes = dom.slice(this);//将它转换为纯数组
//遍历原dom对象的节点
for (var i = 0, ret = [], cur; cur = this[i++];) {//由于肯定里面都是节点,因此可以使用这种循环
while (cur && cur.nodeType === 1 ) {
//如果是dom对象,则判定其是否包含当前节点,否则使用matchesSelector方法判定这个节点是否匹配给定的表达式expr
if ( node ? nodes.indexOf(node) > -1 : matchElement( cur, expr ) ){
//indexOf方法在某些浏览器需要自行实现
//是则放入选择器中
ret.push( cur );
3/4 首页 上一页 1 2 3 4 下一页 尾页 |