0 Comments

Sizzle选择器(2)

发布于:2013-06-01  |   作者:广州网站建设  |   已聚集:人围观
Sizzle选择器(2)

Sizzle.find函数将对表达式字符串进行解析,最后返回一个jQuery对象。下面是Sizzle.find()函数的详细代码,在这个函数中将选择匹配的元素。

广州网站建设,网站建设,广州网页设计,广州网站设计
  1. Sizzle.find = function(expr, context, isXML){  
  2.     var set, match;  
  3.     //如果没有表达式,则返回空数组  
  4.     if ( !expr ) {  
  5.         return [];  
  6.     }  
  7.     //遍历Expr.order数组,匹配基本选择器类型  
  8.     // var Expr = Sizzle.selectors = {  
  9.     // order: [ "ID", "NAME", "TAG" ] }  
  10.     //这里将把复合选择器的字符串从左到右取最小单元的选择符进行分析操作  
  11.     //最小单元如#id、~F(+F,>F)、.class、[id='xx']、F、:last()等  
  12.     //分析操作完之后将分析过的字符串部分给删除,  
  13.     //然后循环分析接下来的剩余的部分,直到字符串为空  
  14.     for ( var i = 0l = Expr.order.length; i < l; i++ ) {  
  15.         //获取基本选择器类型  
  16.         var type = Expr.order[i], match;  
  17.         //调用对应的正则表达式,匹配选择符表达式字符串  
  18.         //var Expr = Sizzle.selectors = {  
  19.         //    match: {  
  20.         //        ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,  
  21.         //        CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,  
  22.         //        NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,  
  23.         //        ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\ s*(?:(\S?=)\s*(['"]*) (.*?)\3|)\s*\]/,  
  24.         //        TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,  
  25.         //        CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,  
  26.         //        POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,  
  27.         //        PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\ ((['"]*)((?:\([^\])+\) |[^\2\(\)]*)+)\2\))?/  
  28.         //    }  
  29.         //如果匹配到字符串,则进行处理  
  30.         if ( (match = Expr.match[ type ].exec( expr )) ) {  
  31.             //获取匹配位置左侧的字符串  
  32.             var left = RegExp.leftContext;  
  33.             //如果当前匹配字符前面不是反斜杠,则进行处理  
  34.             if ( left.substr( left.length - 1 ) !== "\\" ) {  
  35.                 //清除双反斜杠  
  36.                 match[1] = (match[1] || "").replace(/\\/g, "");  
  37.                 //调用Expr.find[ type ]()函数,选择匹配元素  
  38.                 set = Expr.find[ type ]( match, context, isXML );  
  39.                 //如果匹配成功,则删除选择符表达式中的当前选择符  
  40.                 if ( set != null ) {  
  41.                     exprexpr = expr.replace( Expr.match[ type ], "" );  
  42.                     break;  
  43.                 }  
  44.             }  
  45.         }  
  46.     }  
  47.     //如果不存在结果集,则获取所有元素  
  48.     if ( !set ) {  
  49.         set = context.getElementsByTagName("*");  
  50.     }  
  51.     //返回结果集和表达式  
  52.     return {set: set, expr: expr};  
  53. }; 
标签:
飞机