jQuery Sizzle.find [ 源码分析 ]

Sizzle.find = function( expr, context, isXML ) {
	var set, i, len, match, type, left;
	//expr是否为空
	if ( !expr ) {
		return [];
	}

	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
		type = Expr.order[i];
		//根据Expr.order,即Sizzle.selectors.order 的四种类型:ID,CLASS,NAME,TAG
		//与leftMatch确定 expr 的类型
		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
			//left 官方说是为了确定之后的表达式是否有被转义,
			//人个认为这里的left基本没有意义
			left = match[1];
			match.splice( 1, 1 );

			if ( left.substr( left.length - 1 ) !== "\\" ) {
				//对match[1] 中的进行再次转换,如 \: 转义为 : ,\. 转为 .
				match[1] = (match[1] || "").replace( rBackslash, "" );
				//针对不同的type调用不同的find方法,返回查询结果,对应的元素集合
				set = Expr.find[ type ]( match, context, isXML );
				//查询结果不为空,那么删除掉已经查询过的表达式
				if ( set != null ) {
					expr = expr.replace( Expr.match[ type ], "" );
					break;
				}
			}
		}
	}
	//如果结果为空,那么采用如下方式寻找
	if ( !set ) {
		set = typeof context.getElementsByTagName !== "undefined" ?
			context.getElementsByTagName( "*" ) :
			[];
	}
	//返回临时结果
	return { set: set, expr: expr };
};

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。