最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2015年03月31日 10:44:18   作者:mole  
這篇文章主要介紹了jQuery選擇器源碼解讀(四):tokenize方法的Expr.preFilter,本文用詳細(xì)的注釋解讀了tokenize方法的Expr.preFilter的實(shí)現(xiàn)源碼,需要的朋友可以參考下

Expr.preFilter是tokenize方法中對(duì)ATTR、CHILD、PSEUDO三種選擇器進(jìn)行預(yù)處理的方法。具體如下:

Expr.preFilter : {
	"ATTR" : function(match) {
		/*
		 * 完成如下任務(wù):
		 * 1、屬性名稱解碼
		 * 2、屬性值解碼
		 * 3、若判斷符為~=,則在屬性值兩邊加上空格
		 * 4、返回最終的mtach對(duì)象
		 * 
		 * match[1]表示屬性名稱,
		 * match[1].replace(runescape, funescape):將屬性名稱中的十六進(jìn)制數(shù)解碼成
		 *   單字節(jié)unicode字符或雙字節(jié)unicode字符(中文或其它需要兩個(gè)字節(jié)表達(dá)的文字)
		 * 正則表達(dá)式的詳細(xì)說明,可以參看我的“詳解jQuery選擇器正則表達(dá)式”文章
		 */
		match[1] = match[1].replace(runescape, funescape);

		/*
		 * 將屬性值解碼
		 * match[4]:表示放在單引號(hào)或雙引號(hào)內(nèi)的屬性值
		 * match[5]: 表示不用引號(hào)括起來的屬性值
		 */
		match[3] = (match[4] || match[5] || "").replace(runescape,
				funescape);

		/*
		 * ~=的意思是單詞匹配,在W3C中對(duì)單詞的定義是以空白為不同單詞的分隔符
		 * 故此處在match[3]兩邊加上空格后,可以利用indexOf,正確識(shí)別出該單詞是否存在
		 */
		if (match[2] === "~=") {
			match[3] = " " + match[3] + " ";
		}

		/*
		 * 返回有用的前四個(gè)元素結(jié)果
		 */
		return match.slice(0, 4);
	},

	"CHILD" : function(match) {
		/*
		 * 完成如下幾項(xiàng)任務(wù):
		 * 1、把命令中child和of-type之前的字符變成小寫字符
		 * 2、對(duì)于nth開頭的選擇器檢查括號(hào)內(nèi)的數(shù)據(jù)有效性
		 * 3、match[4]和match[5]分別存放xn+b中的x和b,x和b允許是負(fù)數(shù)
		 * 4、返回最終的match對(duì)象
		 * 
		 * match[1]:(only|first|last|nth|nth-last)中的一個(gè)
		 */
		match[1] = match[1].toLowerCase();

		/*
		 * 對(duì)于nth-child、nth-of-type、nth-last-child、nth-last-of-type四種類型括號(hào)內(nèi)需設(shè)置有效數(shù)據(jù)
		 * 而其它則括號(hào)內(nèi)不允許有任何數(shù)據(jù)
		 */
		if (match[1].slice(0, 3) === "nth") {
			/*
			 * 若選擇器括號(hào)內(nèi)沒有有效參數(shù),則拋出異常
			 * 舉例:若選擇器是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)
			 * 下面代碼中賦值號(hào)左側(cè)的match[4]、match[5]用于分別記錄括號(hào)內(nèi)n前及n后的數(shù)值,包括正負(fù)號(hào)
			 * 對(duì)于:nth-child(even)和:nth-child(odd)來說,match[4]為空,
			 *   所以返回 2 * (match[3] === "even" || match[3] === "odd")的計(jì)算結(jié)果
			 *   因?yàn)樵趈s中true=1,false=0,所以(match[3] === "even" || match[3] === "odd")等于1
			 *   因此,2 * (match[3] === "even" || match[3] === "odd")的計(jì)算結(jié)果為2
			 * 
			 * 等號(hào)右側(cè)的“+”的作用是強(qiáng)制類型轉(zhuǎn)換,將之后的字符串轉(zhuǎn)換成數(shù)值類型 
			 */
			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類型選擇器帶有括號(hào)說明,則拋出異常
			 * 這里jQuery并沒有嚴(yán)格按照W3C的規(guī)則來判定,因?yàn)槠湓试S:first-child()的這種形式存在
			 * 也就是對(duì)于jQuery來說:first-child()等同于:first-child,是合法選擇器
			 */
			Sizzle.error(match[0]);
		}

		return match;
	},

	"PSEUDO" : function(match) {
		/*
		 * 完成如下任務(wù):
		 * 1、獲取偽類中用引號(hào)括起來的值
		 * 2、對(duì)于非引號(hào)括起來的值,若存在偽類嵌套,則進(jìn)一步解析確定當(dāng)前偽類實(shí)際結(jié)束位置,
		 *  獲取當(dāng)前偽類的完整字符串和值
		 * 3、返回match中的前三項(xiàng)的副本。
		 * 
		 * unquoted表示括號(hào)內(nèi)非引號(hào)括起來的值,
		 * 以:eq(2)為例,unquoted=2
		 */
		var excess, unquoted = !match[5] && match[2];

		/*
		 * 因?yàn)閜seudo與child的匹配正則表達(dá)式有交集,所以,需要把屬于child的部分忽略掉
		 */
		if (matchExpr["CHILD"].test(match[0])) {
			return null;
		}
		/*
		 * 若括號(hào)內(nèi)的值使用引號(hào)(match[3])括起來的,
		 * 則將除引號(hào)外的值(match[4])賦給match[2]。
		 * match[3]表示引號(hào)。
		 */
		if (match[3] && match[4] !== undefined) {
			match[2] = match[4];
		} else if (unquoted
				/*
				 * rpseudo.test(unquoted):用來測(cè)試unquoted是否包含偽類,
				 * 若包含偽類,則說明有可能存在偽類嵌套的可能性,需要進(jìn)一步對(duì)unquoted進(jìn)行解析
				 * 例如: :not(:eq(3))
				 */
				&& rpseudo.test(unquoted)
				&&
				/*
				 * 獲取unquoted中連續(xù)有效地選擇器最后一個(gè)字符所在位置
				 */
				(excess = tokenize(unquoted, true))
				&&
				/*
				 * unquoted.indexOf(")", unquoted.length - excess)
				 *   從之前獲得的連續(xù)有效地選擇器最后一個(gè)字符所在位置之后找到")"所在位置,
				 *   通常就在當(dāng)前位置之后。
				 * 再減去unquoted.length,用來獲得match[0]中的有效完整的偽類字符串最后位置,
				 *   注意,此時(shí)excess是一個(gè)負(fù)值
				 * 
				 */
				(excess = unquoted.indexOf(")", unquoted.length
						- excess)
						- unquoted.length)) {

			// 獲取有效的完整偽類match[0]和偽類括號(hào)內(nèi)的數(shù)據(jù)match[2]
			match[0] = match[0].slice(0, excess);
			match[2] = unquoted.slice(0, excess);
		}

		// 返回match前三個(gè)元素的副本
		return match.slice(0, 3);
	}
}

相關(guān)文章

  • jQuery 實(shí)現(xiàn)ajax傳入?yún)?shù)含有特殊字符的方法總結(jié)

    jQuery 實(shí)現(xiàn)ajax傳入?yún)?shù)含有特殊字符的方法總結(jié)

    在做ajax登錄時(shí)候遇到的一個(gè)問題,當(dāng)傳入?yún)?shù)含有特殊字符,比如:“$'#@”等。參數(shù)傳遞會(huì)有問題,無法正確獲取。本文章向碼農(nóng)介紹jQuery ajax特殊字符參數(shù)解決方法,需要的朋友可以參考一下。
    2016-10-10
  • Jquery 全選反選實(shí)例代碼

    Jquery 全選反選實(shí)例代碼

    本文給大家介紹基于jquery代碼實(shí)現(xiàn)的全選全不選反選實(shí)例代碼,代碼簡(jiǎn)單易懂,非常實(shí)用,感興趣的一起學(xué)習(xí)吧
    2015-11-11
  • jquery實(shí)現(xiàn)彈出層完美居中效果

    jquery實(shí)現(xiàn)彈出層完美居中效果

    本篇文章主要是對(duì)jquery彈出層居中效果的簡(jiǎn)單實(shí)例進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助
    2014-03-03
  • 封裝了jQuery的Ajax請(qǐng)求全局配置

    封裝了jQuery的Ajax請(qǐng)求全局配置

    這篇文章主要介紹了封裝了jQuery的Ajax請(qǐng)求全局配置的相關(guān)資料,需要的朋友可以參考下
    2015-02-02
  • jQuery中ajax的post()方法用法實(shí)例

    jQuery中ajax的post()方法用法實(shí)例

    這篇文章主要介紹了jQuery中ajax的post()方法用法,以實(shí)例形式較為詳細(xì)的分析了post()方法的功能、參數(shù)及使用技巧,需要的朋友可以參考下
    2014-12-12
  • jQuery表單元素選擇器代碼實(shí)例

    jQuery表單元素選擇器代碼實(shí)例

    這篇文章主要為大家詳細(xì)介紹了jQuery表單元素選擇器代碼實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • jQuery實(shí)現(xiàn)表格奇偶行顯示不同背景色 就這么簡(jiǎn)單

    jQuery實(shí)現(xiàn)表格奇偶行顯示不同背景色 就這么簡(jiǎn)單

    這篇文章主要為大家詳細(xì)介紹了jQuery實(shí)現(xiàn)表格奇偶行顯示不同背景色的方法,使表格更加美觀,便捷的查找同行數(shù)據(jù)更,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • jQuery包裹節(jié)點(diǎn)用法完整示例

    jQuery包裹節(jié)點(diǎn)用法完整示例

    這篇文章主要介紹了jQuery包裹節(jié)點(diǎn)用法,結(jié)合完整實(shí)例形式分析了jQuery中wrap方法包裹節(jié)點(diǎn)的使用技巧,注釋中還包含了wrapAll與wrapInner方法的使用,需要的朋友可以參考下
    2016-09-09
  • jQuery 表格隔行變色代碼[修正注釋版]

    jQuery 表格隔行變色代碼[修正注釋版]

    代碼比較精簡(jiǎn),大家可以了解下jquery的對(duì)象控制方法
    2008-11-11
  • jquery 跨域訪問問題解決方法(筆記)

    jquery 跨域訪問問題解決方法(筆記)

    對(duì)于js跨域訪問,在先前也曾碰到過,但可能并沒有認(rèn)真去對(duì)待,可能查看過相關(guān)資料,但當(dāng)著兩天再次碰到這個(gè)問題時(shí),走了不少?gòu)澛凡耪业絾栴}原因。記下這次解決過程,為自己不再?gòu)?qiáng)大的記憶力默哀一下。
    2011-06-06

最新評(píng)論

金山区| 长岭县| 义马市| 秦皇岛市| 信丰县| 镶黄旗| 宜君县| 义马市| 兴安县| 漳平市| 固始县| 壤塘县| 泰宁县| 赤城县| 中超| 兰坪| 章丘市| 成安县| 乌恰县| 新巴尔虎右旗| 海晏县| 辛集市| 会泽县| 台山市| 孟州市| 乐清市| 资源县| 裕民县| 客服| 刚察县| 郓城县| 铁力市| 安陆市| 麟游县| 阿拉尔市| 庐江县| 兴国县| 城固县| 南康市| 峡江县| 平阴县|