亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

jQuery選擇器源碼解讀(四):tokenize方法的Expr.preFilter

2019-11-20 12:49:24
字體:
來源:轉載
供稿:網友

Expr.preFilter是tokenize方法中對ATTR、CHILD、PSEUDO三種選擇器進行預處理的方法。具體如下:

Expr.preFilter : {	"ATTR" : function(match) {		/*		 * 完成如下任務:		 * 1、屬性名稱解碼		 * 2、屬性值解碼		 * 3、若判斷符為~=,則在屬性值兩邊加上空格		 * 4、返回最終的mtach對象		 * 		 * match[1]表示屬性名稱,		 * match[1].replace(runescape, funescape):將屬性名稱中的十六進制數解碼成		 *   單字節unicode字符或雙字節unicode字符(中文或其它需要兩個字節表達的文字)		 * 正則表達式的詳細說明,可以參看我的“詳解jQuery選擇器正則表達式”文章		 */		match[1] = match[1].replace(runescape, funescape);		/*		 * 將屬性值解碼		 * match[4]:表示放在單引號或雙引號內的屬性值		 * match[5]: 表示不用引號括起來的屬性值		 */		match[3] = (match[4] || match[5] || "").replace(runescape,				funescape);		/*		 * ~=的意思是單詞匹配,在W3C中對單詞的定義是以空白為不同單詞的分隔符		 * 故此處在match[3]兩邊加上空格后,可以利用indexOf,正確識別出該單詞是否存在		 */		if (match[2] === "~=") {			match[3] = " " + match[3] + " ";		}		/*		 * 返回有用的前四個元素結果		 */		return match.slice(0, 4);	},	"CHILD" : function(match) {		/*		 * 完成如下幾項任務:		 * 1、把命令中child和of-type之前的字符變成小寫字符		 * 2、對于nth開頭的選擇器檢查括號內的數據有效性		 * 3、match[4]和match[5]分別存放xn+b中的x和b,x和b允許是負數		 * 4、返回最終的match對象		 * 		 * match[1]:(only|first|last|nth|nth-last)中的一個		 */		match[1] = match[1].toLowerCase();		/*		 * 對于nth-child、nth-of-type、nth-last-child、nth-last-of-type四種類型括號內需設置有效數據		 * 而其它則括號內不允許有任何數據		 */		if (match[1].slice(0, 3) === "nth") {			/*			 * 若選擇器括號內沒有有效參數,則拋出異常			 * 舉例:若選擇器是nth或nth(abc)則屬于非法選擇器			 */			if (!match[3]) {				Sizzle.error(match[0]);			}			/*			 * 下面先以nth-child()為例介紹一下語法,以便更好的理解下面代碼的作用			 * nth-child允許的幾種使用方式如下:			 * 	 :nth-child(even)			 * 	 :nth-child(odd)			 * 	 :nth-child(3n)			 * 	 :nth-child(+2n+1)			 * 	 :nth-child(2n-1)			 * 下面代碼中賦值號左側的match[4]、match[5]用于分別記錄括號內n前及n后的數值,包括正負號			 * 對于:nth-child(even)和:nth-child(odd)來說,match[4]為空,			 *   所以返回 2 * (match[3] === "even" || match[3] === "odd")的計算結果			 *   因為在js中true=1,false=0,所以(match[3] === "even" || match[3] === "odd")等于1			 *   因此,2 * (match[3] === "even" || match[3] === "odd")的計算結果為2			 * 			 * 等號右側的“+”的作用是強制類型轉換,將之后的字符串轉換成數值類型 			 */			match[4] = +(match[4] ? match[5] + (match[6] || 1)					: 2 * (match[3] === "even" || match[3] === "odd"));			match[5] = +((match[7] + match[8]) || match[3] === "odd");		} else if (match[3]) {			/*			 * 若非nth起頭的其它CHILD類型選擇器帶有括號說明,則拋出異常			 * 這里jQuery并沒有嚴格按照W3C的規則來判定,因為其允許:first-child()的這種形式存在			 * 也就是對于jQuery來說:first-child()等同于:first-child,是合法選擇器			 */			Sizzle.error(match[0]);		}		return match;	},	"PSEUDO" : function(match) {		/*		 * 完成如下任務:		 * 1、獲取偽類中用引號括起來的值		 * 2、對于非引號括起來的值,若存在偽類嵌套,則進一步解析確定當前偽類實際結束位置,		 *  獲取當前偽類的完整字符串和值		 * 3、返回match中的前三項的副本。		 * 		 * unquoted表示括號內非引號括起來的值,		 * 以:eq(2)為例,unquoted=2		 */		var excess, unquoted = !match[5] && match[2];		/*		 * 因為pseudo與child的匹配正則表達式有交集,所以,需要把屬于child的部分忽略掉		 */		if (matchExpr["CHILD"].test(match[0])) {			return null;		}		/*		 * 若括號內的值使用引號(match[3])括起來的,		 * 則將除引號外的值(match[4])賦給match[2]。		 * match[3]表示引號。		 */		if (match[3] && match[4] !== undefined) {			match[2] = match[4];		} else if (unquoted				/*				 * rpseudo.test(unquoted):用來測試unquoted是否包含偽類,				 * 若包含偽類,則說明有可能存在偽類嵌套的可能性,需要進一步對unquoted進行解析				 * 例如: :not(:eq(3))				 */				&& rpseudo.test(unquoted)				&&				/*				 * 獲取unquoted中連續有效地選擇器最后一個字符所在位置				 */				(excess = tokenize(unquoted, true))				&&				/*				 * unquoted.indexOf(")", unquoted.length - excess)				 *   從之前獲得的連續有效地選擇器最后一個字符所在位置之后找到")"所在位置,				 *   通常就在當前位置之后。				 * 再減去unquoted.length,用來獲得match[0]中的有效完整的偽類字符串最后位置,				 *   注意,此時excess是一個負值				 * 				 */				(excess = unquoted.indexOf(")", unquoted.length						- excess)						- unquoted.length)) {			// 獲取有效的完整偽類match[0]和偽類括號內的數據match[2]			match[0] = match[0].slice(0, excess);			match[2] = unquoted.slice(0, excess);		}		// 返回match前三個元素的副本		return match.slice(0, 3);	}}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www国产精品视频| 社区色欧美激情 | 久久久久亚洲精品国产| 亚洲成人精品av| 久久久国产精品亚洲一区| 久久全国免费视频| 亚洲欧美日韩中文在线制服| 亚洲最新av网址| 97在线精品国自产拍中文| 欧美在线欧美在线| 亚洲福利在线视频| 亚洲欧美一区二区三区情侣bbw| 亚洲 日韩 国产第一| 91久久在线播放| 久久亚洲综合国产精品99麻豆精品福利| 亚洲精品一区av在线播放| 色婷婷综合久久久久中文字幕1| 国产精品久久久久福利| 欧美大片免费观看| 日韩精品免费在线视频| 亚洲欧美制服丝袜| 国产欧美日韩亚洲精品| 国产精品成人国产乱一区| 亚洲a级在线播放观看| 国内精品久久久久影院优| 91久热免费在线视频| 亚洲一区二区三区毛片| 亚洲成人动漫在线播放| 日本一本a高清免费不卡| 乱亲女秽乱长久久久| 日本19禁啪啪免费观看www| 欧美大片欧美激情性色a∨久久| 国产精品69精品一区二区三区| 性欧美视频videos6一9| 色综合久综合久久综合久鬼88| 色哟哟入口国产精品| 欧美伦理91i| 日韩最新在线视频| 欧美日韩国产成人| 亚洲成人激情在线观看| 自拍偷拍亚洲区| 亚洲级视频在线观看免费1级| 国产午夜精品一区二区三区| 在线亚洲男人天堂| 日韩中文在线不卡| 亚洲一区二区三区在线免费观看| 国产精品入口尤物| 国产精品欧美激情在线播放| 国产日韩精品入口| 国产精品久久二区| 成人免费福利视频| 日韩在线观看网站| 精品国产一区av| 中文字幕少妇一区二区三区| 亚洲free嫩bbb| 亚洲无线码在线一区观看| 亚洲色图欧美制服丝袜另类第一页| 超碰精品一区二区三区乱码| 久久久日本电影| 欧美中文在线观看国产| 亚洲精品视频网上网址在线观看| 亚洲最大成人在线| 亚洲精品网站在线播放gif| 在线视频免费一区二区| 97avcom| 欧美激情成人在线视频| 不卡av在线播放| 亚洲欧美一区二区三区情侣bbw| 91精品视频在线播放| 欧美黑人性生活视频| 日韩精品有码在线观看| 色青青草原桃花久久综合| 亚洲精品永久免费| 91在线高清免费观看| 亚洲美女精品成人在线视频| 日韩国产欧美精品在线| 国产精品成人观看视频国产奇米| 国产精品视频久久久| 久久久国产精品视频| 自拍亚洲一区欧美另类| 欧美成年人视频网站| 久久久影视精品| 国产精品国产三级国产专播精品人| 国产精品久久久久久久久久久久久久| 亚洲国产精品系列| 亚洲精品不卡在线| 亚洲精品国产综合区久久久久久久| 国产一区二区三区中文| 97在线免费视频| 超碰精品一区二区三区乱码| 91精品综合久久久久久五月天| 亚洲风情亚aⅴ在线发布| 97视频在线观看亚洲| 97免费中文视频在线观看| 欧美精品久久一区二区| 热久久美女精品天天吊色| 95av在线视频| 欧美成人四级hd版| 欧美野外wwwxxx| 97免费视频在线| 国内精品免费午夜毛片| 尤物99国产成人精品视频| 狠狠躁天天躁日日躁欧美| 日韩av网址在线| 亚洲一区美女视频在线观看免费| 热久久免费国产视频| 国语自产精品视频在免费| 日韩电影免费在线观看中文字幕| 国产精品久久久久久久久久免费| 欧美激情一区二区三区久久久| 中文字幕欧美日韩| 日韩av在线高清| 国产午夜精品免费一区二区三区| 久久久人成影片一区二区三区观看| 久久影视电视剧凤归四时歌| 亚洲2020天天堂在线观看| 最近2019中文字幕mv免费看| 在线成人激情黄色| 久久久亚洲天堂| 成人国产精品久久久久久亚洲| 精品香蕉在线观看视频一| 色偷偷偷综合中文字幕;dd| 国产精品成人观看视频国产奇米| yellow中文字幕久久| 成人xxxx视频| 日韩av在线网| 中文字幕亚洲欧美在线| 国产精品自产拍在线观看中文| 91欧美精品成人综合在线观看| 国产日韩在线看片| 欧美在线亚洲一区| 久久久黄色av| 欧美一区视频在线| 精品成人乱色一区二区| 成人av色在线观看| 国产美女精品视频免费观看| 曰本色欧美视频在线| 色与欲影视天天看综合网| 欧美成人激情视频免费观看| 日本国产精品视频| 亚洲国产日韩欧美在线图片| 久久久亚洲成人| 欧美激情视频在线免费观看 欧美视频免费一| 欧美一区二粉嫩精品国产一线天| 国产一区二区三区中文| 精品久久久久久久久国产字幕| 欧美高清性猛交| 久久久亚洲欧洲日产国码aⅴ| 国产在线98福利播放视频| 亚洲黄色成人网| 一本色道久久综合亚洲精品小说| 亚洲国产高潮在线观看| 日韩av中文在线| 亚洲国产黄色片| 97精品一区二区视频在线观看| 成人av电影天堂| 久久天天躁日日躁| 欧美性xxxxxx| 成人日韩在线电影| 欧洲精品在线视频| 日本乱人伦a精品| 欧美有码在线观看| 亚洲桃花岛网站| 精品国产一区二区三区久久狼5月|