久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jquery--选择器sizzle源码分析

發(fā)布時(shí)間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jquery--选择器sizzle源码分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 (function( window, undefined ) { 2 3 var i, 4 cachedruns,//正在匹配第幾個(gè)元素 5 Expr, //Sizzle.selectors的快捷方式 6 getText,//獲取文本函數(shù) 7 isXML, //是否為xml 8 compile,//編譯函數(shù) 9 outermostContext, 10 recompare, 11 sortInput, 12 13 // Local document vars 14 setDocument, 15 document,//這里只是document是個(gè)普通的變量,需要setDocument函數(shù)賦值處理過的真正的document 16 docElem, 17 documentIsHTML, 18 rbuggyQSA,//支持的querySelectorAll選擇器正則(rbuggyQSA = new RegExp( rbuggyQSA.join("|") );) 19 rbuggyMatches,//支持matchesSelector正則(rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );) 20 matches,//matchesSelector函數(shù) 21 contains, 22 23 // Instance-specific data 24 expando = "sizzle" + -(new Date()), 25 preferredDoc = window.document,//全局的document 26 support = {}, 27 dirruns = 0, 28 done = 0,//第幾個(gè)關(guān)系選擇器匹配函數(shù) 29 classCache = createCache(), 30 tokenCache = createCache(), 31 compilerCache = createCache(), 32 hasDuplicate = false, 33 sortOrder = function() { return 0; }, 34 35 // General-purpose constants 36 strundefined = typeof undefined, 37 MAX_NEGATIVE = 1 << 31, 38 39 // Array methods 40 arr = [], 41 pop = arr.pop, 42 push_native = arr.push, 43 push = arr.push, 44 slice = arr.slice, 45 // Use a stripped-down indexOf if we can't use a native one 46 //如果數(shù)組原生不支持indexOf,我們自己定義。獲取元素在數(shù)組中的位置 47 indexOf = arr.indexOf || function( elem ) { 48 var i = 0, 49 len = this.length; 50 for ( ; i < len; i++ ) { 51 if ( this[i] === elem ) { 52 return i; 53 } 54 } 55 return -1; 56 }, 57 58 59 //正則表達(dá)式 60 61 //空白字符正則字符串 62 whitespace = "[\\x20\\t\\r\\n\\f]", 63 //字符編碼正則字符串 64 characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", 65 66 identifier = characterEncoding.replace( "w", "w#" ), 67 68 //可用的屬性操作符 69 operators = "([*^$|!~]?=)", 70 //屬性選擇器正則 71 ///^\[whitespace*(characterEncoding)whitespace*(?:([*^$|!~]?=)whitespace*(?:(['"])((?:\\.|[^\\])*?)\3|((?:\\.|[\w#-]|[^\x00-\xa0])+)|)|)whitespace*\]/ 72 attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + 73 "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", 74 75 //偽類正則字符串 76 pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", 77 78 // 去掉兩端空白和字符串中的反斜杠(如果連續(xù)兩個(gè)去掉一個(gè))正則 79 rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), 80 //并聯(lián)選擇器的正則 81 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), 82 //關(guān)系選擇器正則 83 rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ), 84 //偽類正則字符串 85 rpseudo = new RegExp( pseudos ), 86 ridentifier = new RegExp( "^" + identifier + "$" ), 87 88 matchExpr = { 89 "ID": new RegExp( "^#(" + characterEncoding + ")" ), 90 "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), 91 "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ), 92 "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), 93 "ATTR": new RegExp( "^" + attributes ), 94 "PSEUDO": new RegExp( "^" + pseudos ), 95 "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + 96 "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + 97 "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), 98 //開始為>+~或位置偽類,如果選擇器中有位置偽類解析從左往右 99 "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + 100 whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) 101 }, 102 //弟兄正則 103 rsibling = /[\x20\t\r\n\f]*[+~]/, 104 //原生函數(shù)正則 105 rnative = /^[^{]+\{\s*\[native code/, 106 107 //僅僅單個(gè)id或tag、class選擇器正則(用來快速解析并獲取元素) 108 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 109 //jQuery自定義的偽類,它們不是的CSS規(guī)范的一部分,使用它們查詢不能充分利用原生DOM提供的querySelectorAll() 方法來提高性能。為了在現(xiàn)代瀏覽器上獲得更佳的性能,請(qǐng)使用 .filter(":input")代替。 110 rinputs = /^(?:input|select|textarea|button)$/i, 111 //同上 112 rheader = /^h\d$/i, 113 114 rescape = /'|\\/g, 115 //屬性沒帶引號(hào)正則 116 rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g, 117 118 //css轉(zhuǎn)義,配合funescape使用 如:string.replace(runescape, funescape); 119 runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g, 120 funescape = function( _, escaped ) { 121 var high = "0x" + escaped - 0x10000; 122 // NaN means non-codepoint 123 return high !== high ? 124 escaped : 125 // BMP codepoint 126 high < 0 ? 127 String.fromCharCode( high + 0x10000 ) : 128 // Supplemental Plane codepoint (surrogate pair) 129 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); 130 }; 131 132 //把NodeList轉(zhuǎn)換為數(shù)組,因?yàn)閿?shù)組比集合效率高 133 try { 134 push.apply( 135 (arr = slice.call( preferredDoc.childNodes )), 136 preferredDoc.childNodes 137 ); 138 // Support: Android<4.0 139 // Detect silently failing push.apply 140 arr[ preferredDoc.childNodes.length ].nodeType; 141 } catch ( e ) { 142 push = { apply: arr.length ? 143 144 // Leverage slice if possible 145 function( target, els ) { 146 push_native.apply( target, slice.call(els) ); 147 } : 148 149 // Support: IE<9 150 // Otherwise append directly 151 function( target, els ) { 152 var j = target.length, 153 i = 0; 154 // Can't trust NodeList.length 155 while ( (target[j++] = els[i++]) ) {} 156 target.length = j - 1; 157 } 158 }; 159 } 160 161 //測試是否是原生函數(shù) 162 function isNative( fn ) { 163 return rnative.test( fn + "" ); 164 } 165 166 //創(chuàng)建緩存函數(shù)(緩存大小默認(rèn)為50,可以自己設(shè)置) 167 //這里利用了閉包(私有變量、變量一直保存在內(nèi)存中) 168 function createCache() { 169 var cache, 170 keys = []; 171 172 return (cache = function( key, value ) { 173 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) 174 if ( keys.push( key += " " ) > Expr.cacheLength ) { 175 // Only keep the most recent entries 176 delete cache[ keys.shift() ]; 177 } 178 return (cache[ key ] = value); 179 }); 180 } 181 182 //標(biāo)記函數(shù)供sizzle特殊用途 183 function markFunction( fn ) { 184 fn[ expando ] = true; 185 return fn; 186 } 187 188 // 用于做各種特征檢測,比如是否支持某個(gè)API,API支持是否完美 189 190 function assert( fn ) { 191 var div = document.createElement("div"); 192 193 try { 194 return !!fn( div ); 195 } catch (e) { 196 return false; 197 } finally { 198 // release memory in IE 199 div = null; 200 } 201 } 202 203 //sizzle主函數(shù) 204 //selector css選擇器, context上下文,results結(jié)果集,seed篩選集 205 206 function Sizzle( selector, context, results, seed ) { 207 var match, elem, m, nodeType, 208 // QSA vars 209 i, groups, old, nid, newContext, newSelector; 210 211 if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { 212 setDocument( context ); 213 } 214 215 context = context || document; 216 results = results || []; 217 218 if ( !selector || typeof selector !== "string" ) { 219 return results; 220 } 221 222 if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { 223 return []; 224 } 225 226 if ( documentIsHTML && !seed ) { 227 228 // Shortcuts 229 // 如果僅僅是id或class或tag用原生函數(shù) 230 if ( (match = rquickExpr.exec( selector )) ) { 231 // Speed-up: Sizzle("#ID") 232 if ( (m = match[1]) ) { 233 if ( nodeType === 9 ) { 234 elem = context.getElementById( m ); 235 // Check parentNode to catch when Blackberry 4.6 returns 236 // nodes that are no longer in the document #6963 237 if ( elem && elem.parentNode ) { 238 // Handle the case where IE, Opera, and Webkit return items 239 // by name instead of ID 240 if ( elem.id === m ) { 241 results.push( elem ); 242 return results; 243 } 244 } else { 245 return results; 246 } 247 } else { 248 // Context is not a document 249 if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && 250 contains( context, elem ) && elem.id === m ) { 251 results.push( elem ); 252 return results; 253 } 254 } 255 256 // Speed-up: Sizzle("TAG") 257 } else if ( match[2] ) { 258 push.apply( results, context.getElementsByTagName( selector ) ); 259 return results; 260 261 // Speed-up: Sizzle(".CLASS") 262 } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { 263 push.apply( results, context.getElementsByClassName( m ) ); 264 return results; 265 } 266 } 267 268 // QSA path 269 //使用querySelectorAll 270 if ( !support.qsa && !rbuggyQSA.test(selector) ) { 271 old = true; 272 nid = expando; 273 newContext = context; 274 newSelector = nodeType === 9 && selector; 275 276 // qSA works strangely on Element-rooted queries 277 // We can work around this by specifying an extra ID on the root 278 // and working up from there (Thanks to Andrew Dupont for the technique) 279 // IE 8 doesn't work on object elements 280 if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { 281 groups = tokenize( selector ); 282 283 if ( (old = context.getAttribute("id")) ) { 284 nid = old.replace( rescape, "\\$&" ); 285 } else { 286 context.setAttribute( "id", nid ); 287 } 288 nid = "[id='" + nid + "'] "; 289 290 i = groups.length; 291 while ( i-- ) { 292 groups[i] = nid + toSelector( groups[i] ); 293 } 294 newContext = rsibling.test( selector ) && context.parentNode || context; 295 newSelector = groups.join(","); 296 } 297 298 if ( newSelector ) { 299 try { 300 push.apply( results, 301 newContext.querySelectorAll( newSelector ) 302 ); 303 return results; 304 } catch(qsaError) { 305 } finally { 306 if ( !old ) { 307 context.removeAttribute("id"); 308 } 309 } 310 } 311 } 312 } 313 314 // All others 315 return select( selector.replace( rtrim, "$1" ), context, results, seed ); 316 } 317 318 //檢測是否為xml 319 isXML = Sizzle.isXML = function( elem ) { 320 // documentElement is verified for cases where it doesn't yet exist 321 // (such as loading iframes in IE - #4833) 322 var documentElement = elem && (elem.ownerDocument || elem).documentElement; 323 return documentElement ? documentElement.nodeName !== "HTML" : false; 324 }; 325 326 327 //根據(jù)當(dāng)前的document設(shè)置document相關(guān)的變量(只設(shè)置一次) 328 setDocument = Sizzle.setDocument = function( node ) { 329 var doc = node ? node.ownerDocument || node : preferredDoc; 330 331 //如果document已經(jīng)設(shè)置了返回(這里document是個(gè)變量初始值是undefined) 332 //不是文檔對(duì)象返回 333 //文檔對(duì)象沒有返回根節(jié)點(diǎn)時(shí)返回 334 if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { 335 return document; 336 } 337 338 //給document變量設(shè)置真正的文檔 339 document = doc; 340 docElem = doc.documentElement; 341 342 documentIsHTML = !isXML( doc ); 343 344 //檢查getElementsByTagName是否會(huì)返回注釋節(jié)點(diǎn),IE6-8會(huì)混雜注釋節(jié)點(diǎn) 345 support.getElementsByTagName = assert(function( div ) { 346 div.appendChild( doc.createComment("") ); 347 return !div.getElementsByTagName("*").length; 348 }); 349 350 // Check if attributes should be retrieved by attribute nodes 351 support.attributes = assert(function( div ) { 352 div.innerHTML = "<select></select>"; 353 var type = typeof div.lastChild.getAttribute("multiple"); 354 // IE8 returns a string for some attributes even when not present 355 return type !== "boolean" && type !== "string"; 356 }); 357 358 //檢查getElementsByClassName是否100%支持 359 support.getElementsByClassName = assert(function( div ) { 360 //Oprea9.6不可以發(fā)現(xiàn)第二個(gè)className 361 div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>"; 362 if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) { 363 return false; 364 } 365 366 //safari3.2緩存了class屬性,所以不能獲取改變過的classname 367 div.lastChild.className = "e"; 368 return div.getElementsByClassName("e").length === 2; 369 }); 370 371 //檢查getElementByName 372 support.getByName = assert(function( div ) { 373 // Inject content 374 div.id = expando + 0; 375 // Support: Windows 8 Native Apps 376 // Assigning innerHTML with "name" attributes throws uncatchable exceptions 377 // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx 378 // getElementsByName是一個(gè)問題多的API 379 //1 IE6-7下getElementsByName與getElementById都不區(qū)分元素的name與ID 380 //2 IE的getElementsByName只對(duì)表單元素有效,無視擁有相同name值的span div元素 381 //3 IE6-7下即使通過document.createElement創(chuàng)建一個(gè)表單元素,動(dòng)態(tài)設(shè)置name與插入 382 // DOM樹,getElementsByName無法找到此元素,innerHTML也不行。一定需要以 383 // document.createElement("<input name="aaa"/>")方式生成元素才行。 384 // 同樣的情況也發(fā)生在iframe上,IE6-7的iframe的name也需要這樣同時(shí)生成。 385 //4 name本來是一個(gè)property,但標(biāo)準(zhǔn)瀏覽器好像已經(jīng)默認(rèn)setAttribute("name","xxx") 386 // 也能被getElementsByName獲取到。 387 //5 IE6-8通過innerHTML生成包含name屬性的元素時(shí),可能發(fā)生無法捕獲的錯(cuò)誤 388 div.appendChild( document.createElement("a") ).setAttribute( "name", expando ); 389 div.appendChild( document.createElement("i") ).setAttribute( "name", expando ); 390 docElem.appendChild( div ); 391 392 // Test 393 var pass = doc.getElementsByName && 394 // buggy browsers will return fewer than the correct 2 395 doc.getElementsByName( expando ).length === 2 + 396 // buggy browsers will return more than the correct 0 397 doc.getElementsByName( expando + 0 ).length; 398 399 // Cleanup 400 docElem.removeChild( div ); 401 402 return pass; 403 }); 404 405 // Support: Webkit<537.32 406 // Detached nodes confoundingly follow *each other* 407 support.sortDetached = assert(function( div1 ) { 408 return div1.compareDocumentPosition && 409 // Should return 1, but Webkit returns 4 (following) 410 (div1.compareDocumentPosition( document.createElement("div") ) & 1); 411 }); 412 413 //ie6/7 href和type屬性獲取 414 Expr.attrHandle = assert(function( div ) { 415 div.innerHTML = "<a href='#'></a>"; 416 return div.firstChild && typeof div.firstChild.getAttribute !== strundefined && 417 div.firstChild.getAttribute("href") === "#"; 418 }) ? 419 {} : 420 { 421 "href": function( elem ) { 422 return elem.getAttribute( "href", 2 ); 423 }, 424 "type": function( elem ) { 425 return elem.getAttribute("type"); 426 } 427 }; 428 429 //查找id節(jié)點(diǎn)和節(jié)點(diǎn)id是否匹配過濾函數(shù) 430 if ( support.getByName ) { 431 Expr.find["ID"] = function( id, context ) { 432 if ( typeof context.getElementById !== strundefined && documentIsHTML ) { 433 var m = context.getElementById( id ); 434 // Check parentNode to catch when Blackberry 4.6 returns 435 // nodes that are no longer in the document #6963 436 //Blackberry 4.6 緩存過度,即便這元素被移出DOM樹也能找到 437 return m && m.parentNode ? [m] : []; 438 } 439 }; 440 Expr.filter["ID"] = function( id ) { 441 var attrId = id.replace( runescape, funescape ); 442 return function( elem ) { 443 return elem.getAttribute("id") === attrId; 444 }; 445 }; 446 } else { 447 Expr.find["ID"] = function( id, context ) { 448 if ( typeof context.getElementById !== strundefined && documentIsHTML ) { 449 var m = context.getElementById( id ); 450 451 return m ? 452 m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ? 453 [m] : 454 undefined : 455 []; 456 } 457 }; 458 Expr.filter["ID"] = function( id ) { 459 var attrId = id.replace( runescape, funescape ); 460 return function( elem ) { 461 var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); 462 return node && node.value === attrId; 463 }; 464 }; 465 } 466 467 //根據(jù)標(biāo)簽查找節(jié)點(diǎn) 468 Expr.find["TAG"] = support.getElementsByTagName ? 469 function( tag, context ) { 470 if ( typeof context.getElementsByTagName !== strundefined ) { 471 return context.getElementsByTagName( tag ); 472 } 473 } : 474 function( tag, context ) { 475 var elem, 476 tmp = [], 477 i = 0, 478 results = context.getElementsByTagName( tag ); 479 480 // Filter out possible comments 481 if ( tag === "*" ) { 482 while ( (elem = results[i++]) ) { 483 if ( elem.nodeType === 1 ) { 484 tmp.push( elem ); 485 } 486 } 487 488 return tmp; 489 } 490 return results; 491 }; 492 493 //如果支持根據(jù)name查找節(jié)點(diǎn) 494 Expr.find["NAME"] = support.getByName && function( tag, context ) { 495 if ( typeof context.getElementsByName !== strundefined ) { 496 return context.getElementsByName( name ); 497 } 498 }; 499 500 //如果支持根據(jù)class查找節(jié)點(diǎn) 501 Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { 502 if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { 503 return context.getElementsByClassName( className ); 504 } 505 }; 506 507 // QSA and matchesSelector support 508 509 rbuggyMatches = [];//支持的matchesSelector放到數(shù)組中 510 511 rbuggyQSA = [ ":focus" ];//支持的querySelectorAll放到數(shù)組中 512 513 if ( (support.qsa = isNative(doc.querySelectorAll)) ) { 514 // Build QSA regex 515 // Regex strategy adopted from Diego Perini 516 assert(function( div ) { 517 // Select is set to empty string on purpose 518 // This is to test IE's treatment of not explicitly 519 // setting a boolean content attribute, 520 // since its presence should be enough 521 // http://bugs.jquery.com/ticket/12359 522 div.innerHTML = "<select><option selected=''></option></select>"; 523 524 // IE8 - Some boolean attributes are not treated correctly 525 if ( !div.querySelectorAll("[selected]").length ) { 526 rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" ); 527 } 528 529 // Webkit/Opera - :checked should return selected option elements 530 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 531 // IE8 throws error here and will not see later tests 532 if ( !div.querySelectorAll(":checked").length ) { 533 rbuggyQSA.push(":checked"); 534 } 535 }); 536 537 assert(function( div ) { 538 539 // Opera 10-12/IE8 - ^= $= *= and empty values 540 // Should not select anything 541 div.innerHTML = "<input type='hidden' i=''/>"; 542 if ( div.querySelectorAll("[i^='']").length ) { 543 rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" ); 544 } 545 546 // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) 547 // IE8 throws error here and will not see later tests 548 if ( !div.querySelectorAll(":enabled").length ) { 549 rbuggyQSA.push( ":enabled", ":disabled" ); 550 } 551 552 // Opera 10-11 does not throw on post-comma invalid pseudos 553 div.querySelectorAll("*,:x"); 554 rbuggyQSA.push(",.*:"); 555 }); 556 } 557 558 if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector || 559 docElem.mozMatchesSelector || 560 docElem.webkitMatchesSelector || 561 docElem.oMatchesSelector || 562 docElem.msMatchesSelector) )) ) { 563 564 assert(function( div ) { 565 //ie9能匹配移出DOM樹的節(jié)點(diǎn) 566 support.disconnectedMatch = matches.call( div, "div" ); 567 568 //Gecko對(duì)于非法選擇符不會(huì)拋錯(cuò),而是返回false 569 matches.call( div, "[s!='']:x" ); 570 rbuggyMatches.push( "!=", pseudos ); 571 }); 572 } 573 574 rbuggyQSA = new RegExp( rbuggyQSA.join("|") ); 575 rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); 576 577 // Element contains another 578 // Purposefully does not implement inclusive descendent 579 // As in, an element does not contain itself 580 contains = isNative(docElem.contains) || docElem.compareDocumentPosition ? 581 function( a, b ) { 582 var adown = a.nodeType === 9 ? a.documentElement : a, 583 bup = b && b.parentNode; 584 return a === bup || !!( bup && bup.nodeType === 1 && ( 585 adown.contains ? 586 adown.contains( bup ) : 587 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 588 )); 589 } : 590 function( a, b ) { 591 if ( b ) { 592 while ( (b = b.parentNode) ) { 593 if ( b === a ) { 594 return true; 595 } 596 } 597 } 598 return false; 599 }; 600 601 //文檔順序排序 602 sortOrder = docElem.compareDocumentPosition ? 603 function( a, b ) { 604 605 //重復(fù)刪除標(biāo)記 606 if ( a === b ) { 607 hasDuplicate = true; 608 return 0; 609 } 610 611 var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); 612 613 if ( compare ) { 614 // Disconnected nodes 615 if ( compare & 1 || 616 (recompare && b.compareDocumentPosition( a ) === compare) ) { 617 618 // Choose the first element that is related to our preferred document 619 if ( a === doc || contains(preferredDoc, a) ) { 620 return -1; 621 } 622 if ( b === doc || contains(preferredDoc, b) ) { 623 return 1; 624 } 625 626 // Maintain original order 627 return sortInput ? 628 ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : 629 0; 630 } 631 632 return compare & 4 ? -1 : 1; 633 } 634 635 //不能直接比較,sort上不存在這個(gè)方法 636 return a.compareDocumentPosition ? -1 : 1; 637 } : 638 function( a, b ) { 639 var cur, 640 i = 0, 641 aup = a.parentNode, 642 bup = b.parentNode, 643 ap = [ a ], 644 bp = [ b ]; 645 646 // Exit early if the nodes are identical 647 if ( a === b ) { 648 hasDuplicate = true; 649 return 0; 650 651 // Parentless nodes are either documents or disconnected 652 } else if ( !aup || !bup ) { 653 return a === doc ? -1 : 654 b === doc ? 1 : 655 aup ? -1 : 656 bup ? 1 : 657 0; 658 659 // If the nodes are siblings, we can do a quick check 660 } else if ( aup === bup ) { 661 return siblingCheck( a, b ); 662 } 663 664 // Otherwise we need full lists of their ancestors for comparison 665 cur = a; 666 while ( (cur = cur.parentNode) ) { 667 ap.unshift( cur ); 668 } 669 cur = b; 670 while ( (cur = cur.parentNode) ) { 671 bp.unshift( cur ); 672 } 673 674 // Walk down the tree looking for a discrepancy 675 while ( ap[i] === bp[i] ) { 676 i++; 677 } 678 679 return i ? 680 // Do a sibling check if the nodes have a common ancestor 681 siblingCheck( ap[i], bp[i] ) : 682 683 // Otherwise nodes in our document sort first 684 ap[i] === preferredDoc ? -1 : 685 bp[i] === preferredDoc ? 1 : 686 0; 687 }; 688 689 return document; 690 }; 691 //篩選匹配的elements 692 Sizzle.matches = function( expr, elements ) { 693 return Sizzle( expr, null, null, elements ); 694 }; 695 696 Sizzle.matchesSelector = function( elem, expr ) { 697 // Set document vars if needed 698 if ( ( elem.ownerDocument || elem ) !== document ) { 699 setDocument( elem ); 700 } 701 702 //確保屬性選擇器有引號(hào)(querySelectorAll需要有引號(hào)) 703 expr = expr.replace( rattributeQuotes, "='$1']" ); 704 705 //rbuggyQSA中肯定存在:focus,所以不需要檢查是否存在 706 if ( support.matchesSelector && documentIsHTML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) { 707 try { 708 var ret = matches.call( elem, expr ); 709 710 //ie9和文檔分離的node返回false 711 //同樣在ie9中文檔片段也是分離的節(jié)點(diǎn)(createElement('div')這樣創(chuàng)建的節(jié)點(diǎn)有document屬性.document.nodeType為11) 712 if ( ret || support.disconnectedMatch || elem.document && elem.document.nodeType !== 11 ) { 713 return ret; 714 } 715 } catch(e) {} 716 } 717 718 return Sizzle( expr, document, null, [elem] ).length > 0; 719 }; 720 721 Sizzle.contains = function( context, elem ) { 722 // Set document vars if needed 723 if ( ( context.ownerDocument || context ) !== document ) { 724 setDocument( context ); 725 } 726 return contains( context, elem ); 727 }; 728 729 Sizzle.attr = function( elem, name ) { 730 var val; 731 732 // Set document vars if needed 733 if ( ( elem.ownerDocument || elem ) !== document ) { 734 setDocument( elem ); 735 } 736 737 if ( documentIsHTML ) { 738 name = name.toLowerCase(); 739 } 740 if ( (val = Expr.attrHandle[ name ]) ) { 741 return val( elem ); 742 } 743 if ( !documentIsHTML || support.attributes ) { 744 return elem.getAttribute( name ); 745 } 746 return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ? 747 name : 748 val && val.specified ? val.value : null; 749 }; 750 751 Sizzle.error = function( msg ) { 752 throw new Error( "Syntax error, unrecognized expression: " + msg ); 753 }; 754 755 //排序并去重 756 Sizzle.uniqueSort = function( results ) { 757 var elem, 758 duplicates = [], 759 j = 0, 760 i = 0; 761 762 // Unless we *know* we can detect duplicates, assume their presence 763 //除非我們知道我們可以檢測到重復(fù)的,假設(shè)他們的存在 764 hasDuplicate = !support.detectDuplicates; 765 // Compensate for sort limitations 766 recompare = !support.sortDetached; 767 sortInput = !support.sortStable && results.slice( 0 ); 768 results.sort( sortOrder ); 769 770 if ( hasDuplicate ) { 771 while ( (elem = results[i++]) ) { 772 if ( elem === results[ i ] ) { 773 j = duplicates.push( i ); 774 } 775 } 776 while ( j-- ) { 777 results.splice( duplicates[ j ], 1 ); 778 } 779 } 780 781 return results; 782 }; 783 784 // 兄弟節(jié)點(diǎn)排序 785 786 function siblingCheck( a, b ) { 787 var cur = b && a, 788 diff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE ); 789 790 // Use IE sourceIndex if available on both nodes 791 if ( diff ) { 792 return diff; 793 } 794 795 // Check if b follows a 796 if ( cur ) { 797 while ( (cur = cur.nextSibling) ) { 798 if ( cur === b ) { 799 return -1; 800 } 801 } 802 } 803 804 return a ? 1 : -1; 805 } 806 807 //創(chuàng)建一個(gè)偽類的過濾函數(shù),此方法是根據(jù)表單元素的type值生成 808 //比如:radio, :text, :checkbox, :file, :image等自定義偽類 809 function createInputPseudo( type ) { 810 return function( elem ) { 811 var name = elem.nodeName.toLowerCase(); 812 return name === "input" && elem.type === type; 813 }; 814 } 815 816 //創(chuàng)建一個(gè)偽類的過濾函數(shù),此方法是根據(jù)表單元素的type值或標(biāo)簽類型生成 817 //如果:button, :submit自定義偽類 818 function createButtonPseudo( type ) { 819 return function( elem ) { 820 var name = elem.nodeName.toLowerCase(); 821 return (name === "input" || name === "button") && elem.type === type; 822 }; 823 } 824 825 //用于創(chuàng)建位置偽類的過濾函數(shù),它們是模擬從左向右的順序進(jìn)行選擇, 826 //匹配到它時(shí)的結(jié)果集的位置來挑選元素的 827 //比如:odd,:even, :eq, :gt, :lt, :first, :last 828 function createPositionalPseudo( fn ) { 829 return markFunction(function( argument ) { 830 argument = +argument; 831 return markFunction(function( seed, matches ) { 832 var j, 833 matchIndexes = fn( [], seed.length, argument ), 834 i = matchIndexes.length; 835 836 // Match elements found at the specified indexes 837 while ( i-- ) { 838 if ( seed[ (j = matchIndexes[i]) ] ) { 839 seed[j] = !(matches[j] = seed[j]);//這里的j是數(shù)組索引值,matches數(shù)組中可能會(huì)出現(xiàn)undefinde值 如:var arr = []; arr[10] = 10;這里前9項(xiàng)會(huì)是undefined 840 } 841 } 842 }); 843 }); 844 } 845 846 //工具函數(shù)用于獲取給定節(jié)點(diǎn)的text 847 getText = Sizzle.getText = function( elem ) { 848 var node, 849 ret = "", 850 i = 0, 851 nodeType = elem.nodeType; 852 853 if ( !nodeType ) { 854 // If no nodeType, this is expected to be an array 855 for ( ; (node = elem[i]); i++ ) { 856 // Do not traverse comment nodes 857 ret += getText( node ); 858 } 859 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { 860 // Use textContent for elements 861 // innerText usage removed for consistency of new lines (see #11153) 862 if ( typeof elem.textContent === "string" ) { 863 return elem.textContent; 864 } else { 865 // Traverse its children 866 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 867 ret += getText( elem ); 868 } 869 } 870 } else if ( nodeType === 3 || nodeType === 4 ) { 871 return elem.nodeValue; 872 } 873 // Do not include comment or processing instruction nodes 874 875 return ret; 876 }; 877 878 Expr = Sizzle.selectors = { 879 880 // Can be adjusted by the user 881 cacheLength: 50, 882 883 createPseudo: markFunction, 884 885 match: matchExpr, 886 887 find: {},//查找元素 888 889 relative: { 890 ">": { dir: "parentNode", first: true }, 891 " ": { dir: "parentNode" }, 892 "+": { dir: "previousSibling", first: true }, 893 "~": { dir: "previousSibling" } 894 }, 895 896 preFilter: {//正則出來的數(shù)組不能直接用需要過濾下如:attr正則出來的數(shù)組引號(hào)還有~= 897 "ATTR": function( match ) { 898 match[1] = match[1].replace( runescape, funescape ); 899 900 //不管有沒有引號(hào)都把value值移到match[3] 901 //有引號(hào)["[name="username"]", "name", "=", """, "username", undefined] 902 //無引號(hào)["[name=username]", "name", "=", undefined, undefined, "username"] 903 match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); 904 905 if ( match[2] === "~=" ) {//匹配屬性值必須有空格分隔(這個(gè)選擇器測試屬性值中的每個(gè)單詞字符串,其中“word”是一個(gè)由空白分隔的字符串定義的) 906 match[3] = " " + match[3] + " "; 907 } 908 909 return match.slice( 0, 4 ); 910 }, 911 912 "CHILD": function( match ) { 913 /* matches from matchExpr["CHILD"] 914 1 type (only|nth|...) 915 2 what (child|of-type) 916 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 917 4 xn-component of xn+y argument ([+-]?\d*n|) 918 5 sign of xn-component 919 6 x of xn-component 920 7 sign of y-component 921 8 y of y-component 922 */ 923 //[":nth-child(2n + 1)", "nth", "child", "2n + 1", "2n", "", "2", "+", "1"] 924 //[":nth-last-child(1)", "nth-last", "child", "1", "", undefined, undefined, "", "1"] 925 //[":nth-child(even)", "nth", "child", "even", undefined, undefined, undefined, undefined, undefined] 926 match[1] = match[1].toLowerCase(); 927 //當(dāng)選擇器中有nth時(shí) 928 if ( match[1].slice( 0, 3 ) === "nth" ) { 929 // nth-* requires argument 930 //當(dāng)選擇器中有nth時(shí)小括號(hào)內(nèi)沒有值說明不是合法的CHILD選擇器 931 if ( !match[3] ) { 932 Sizzle.error( match[0] ); 933 } 934 935 // numeric x and y parameters for Expr.filter.CHILD 936 // remember that false/true cast respectively to 0/1 937 //處理(xn + y) 938 //true和false分別轉(zhuǎn)換為1和0, true和false參與運(yùn)算時(shí)會(huì)自動(dòng)轉(zhuǎn)換為1和0 939 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); 940 match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); 941 942 // other types prohibit arguments 943 //如果不是nth類型但是match[3]有值說明不是合法的CHILD選擇器 944 } else if ( match[3] ) { 945 Sizzle.error( match[0] ); 946 } 947 948 return match; 949 }, 950 951 "PSEUDO": function( match ) { 952 var excess, 953 unquoted = !match[5] && match[2]; 954 955 //如果是孩子偽類不處理 956 if ( matchExpr["CHILD"].test( match[0] ) ) { 957 return null; 958 } 959 //[":has(input[name=username])", "has", "input[name=username]", undefined, undefined, "input[name=username]", "name", "=", undefined, undefined, "username"] 960 // Accept quoted arguments as-is 961 //如果小括號(hào)內(nèi)有引號(hào) 如:[":eq("2")", "eq", ""2"", """, "2", undefined, undefined, undefined, undefined, undefined, undefined] 962 if ( match[4] ) { 963 match[2] = match[4]; 964 965 // Strip excess characters from unquoted arguments 966 //不知道什么偽類會(huì)走這里 967 } else if ( unquoted && rpseudo.test( unquoted ) && 968 // Get excess from tokenize (recursively) 969 (excess = tokenize( unquoted, true )) && 970 // advance to the next closing parenthesis 971 (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { 972 973 // excess is a negative index 974 match[0] = match[0].slice( 0, excess ); 975 match[2] = unquoted.slice( 0, excess ); 976 } 977 978 //返回捕獲中僅僅需要的過濾方法(type和argument) 979 return match.slice( 0, 3 ); 980 } 981 }, 982 983 filter: {//過濾函數(shù)(判斷各節(jié)點(diǎn)是否符合條件) 984 985 "TAG": function( nodeName ) { 986 if ( nodeName === "*" ) { 987 return function() { return true; }; 988 } 989 990 nodeName = nodeName.replace( runescape, funescape ).toLowerCase(); 991 return function( elem ) { 992 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; 993 }; 994 }, 995 996 "CLASS": function( className ) { 997 var pattern = classCache[ className + " " ]; 998 999 return pattern || 1000 (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && 1001 classCache( className, function( elem ) { 1002 return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" ); 1003 }); 1004 }, 1005 1006 "ATTR": function( name, operator, check ) { 1007 return function( elem ) { 1008 var result = Sizzle.attr( elem, name ); 1009 1010 if ( result == null ) { 1011 return operator === "!="; 1012 } 1013 if ( !operator ) { 1014 return true; 1015 } 1016 1017 result += ""; 1018 1019 return operator === "=" ? result === check : 1020 operator === "!=" ? result !== check : 1021 operator === "^=" ? check && result.indexOf( check ) === 0 : 1022 operator === "*=" ? check && result.indexOf( check ) > -1 : 1023 operator === "$=" ? check && result.slice( -check.length ) === check : 1024 operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : 1025 operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : 1026 false; 1027 }; 1028 }, 1029 1030 //:nth-child(2) 1031 //["nth", "child", "2", 0, 2, undefined, "", "2"] 1032 "CHILD": function( type, what, argument, first, last ) { 1033 var simple = type.slice( 0, 3 ) !== "nth", //是否有nth 1034 forward = type.slice( -4 ) !== "last",//是否正向查找 1035 ofType = what === "of-type"; //是否有of-type 1036 1037 return first === 1 && last === 0 ? 1038 1039 // Shortcut for :nth-*(n) 1040 function( elem ) { 1041 return !!elem.parentNode; 1042 } : 1043 1044 function( elem, context, xml ) { 1045 var cache, outerCache, node, diff, nodeIndex, start, 1046 dir = simple !== forward ? "nextSibling" : "previousSibling", 1047 parent = elem.parentNode, 1048 name = ofType && elem.nodeName.toLowerCase(), 1049 useCache = !xml && !ofType; 1050 1051 if ( parent ) { 1052 1053 // :(first|last|only)-(child|of-type) 1054 if ( simple ) { 1055 while ( dir ) { 1056 node = elem; 1057 while ( (node = node[ dir ]) ) { 1058 //如果不是of-type, first如果前面還有元素返回false, last如果后面還有元素返回false 1059 //如果是of-type, name值全等返回false 1060 if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { 1061 return false; 1062 } 1063 } 1064 // Reverse direction for :only-* (if we haven't yet done so) 1065 //如果type為only時(shí), 1066 start = dir = type === "only" && !start && "nextSibling"; 1067 } 1068 return true; 1069 } 1070 1071 start = [ forward ? parent.firstChild : parent.lastChild ]; 1072 1073 // non-xml :nth-child(...) stores cache data on `parent` 1074 if ( forward && useCache ) { 1075 // Seek `elem` from a previously-cached index 1076 outerCache = parent[ expando ] || (parent[ expando ] = {}); 1077 cache = outerCache[ type ] || []; 1078 nodeIndex = cache[0] === dirruns && cache[1]; 1079 diff = cache[0] === dirruns && cache[2]; 1080 node = nodeIndex && parent.childNodes[ nodeIndex ]; 1081 1082 while ( (node = ++nodeIndex && node && node[ dir ] || 1083 1084 // Fallback to seeking `elem` from the start 1085 //第一次執(zhí)行while循環(huán)時(shí)走這里(確切的說應(yīng)該是第一個(gè)遍歷childNodes節(jié)點(diǎn)時(shí))如果start內(nèi)沒有節(jié)點(diǎn)則循環(huán)一次找到節(jié)點(diǎn),這也是diff = nodeIndex = 0的原因 1086 (diff = nodeIndex = 0) || start.pop()) ) { 1087 1088 // When found, cache indexes on `parent` and break 1089 //當(dāng)獲取到的element,把這個(gè)element的索引值緩存在父節(jié)點(diǎn)[dirruns, 節(jié)點(diǎn)索引值, 真正的節(jié)點(diǎn)(不是文本或注釋節(jié)點(diǎn))] 1090 if ( node.nodeType === 1 && ++diff && node === elem ) { 1091 outerCache[ type ] = [ dirruns, nodeIndex, diff ]; 1092 break; 1093 } 1094 } 1095 1096 // Use previously-cached element index if available 1097 } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { 1098 diff = cache[1]; 1099 1100 // 如果是xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) 1101 } else { 1102 // Use the same loop as above to seek `elem` from the start 1103 while ( (node = ++nodeIndex && node && node[ dir ] || 1104 (diff = nodeIndex = 0) || start.pop()) ) { 1105 1106 if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { 1107 // Cache the index of each encountered element 1108 if ( useCache ) { 1109 (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; 1110 } 1111 1112 if ( node === elem ) { 1113 break; 1114 } 1115 } 1116 } 1117 } 1118 1119 // Incorporate the offset, then check against cycle size 1120 diff -= last; 1121 return diff === first || ( diff % first === 0 && diff / first >= 0 ); 1122 } 1123 }; 1124 }, 1125 1126 "PSEUDO": function( pseudo, argument ) { 1127 1128 //偽類names值不區(qū)分大小寫(不對(duì)) 1129 //優(yōu)先大小寫敏感的定制偽類 1130 //setFilters繼承了pseudos 1131 var args, 1132 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || 1133 Sizzle.error( "unsupported pseudo: " + pseudo ); 1134 //上面的fn才是真正的篩選函數(shù)(有sizzle自己定義的,用戶也可以自定義) 1135 1136 1137 //用戶可能用createPseuso(需要?jiǎng)?chuàng)建一個(gè)過濾函數(shù)做為參數(shù))自定義一個(gè)偽類, 就像sizzle創(chuàng)建的一樣 1138 if ( fn[ expando ] ) { 1139 return fn( argument ); 1140 } 1141 1142 //保持舊的簽名支持 1143 if ( fn.length > 1 ) { 1144 args = [ pseudo, pseudo, "", argument ]; 1145 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? 1146 markFunction(function( seed, matches ) { 1147 var idx, 1148 matched = fn( seed, argument ), 1149 i = matched.length; 1150 while ( i-- ) { 1151 idx = indexOf.call( seed, matched[i] ); 1152 seed[ idx ] = !( matches[ idx ] = matched[i] ); 1153 } 1154 }) : 1155 function( elem ) { 1156 return fn( elem, 0, args ); 1157 }; 1158 } 1159 1160 return fn; 1161 } 1162 }, 1163 1164 pseudos: { 1165 // Potentially complex pseudos 1166 "not": markFunction(function( selector ) { 1167 // Trim the selector passed to compile 1168 // to avoid treating leading and trailing 1169 // spaces as combinators 1170 var input = [], 1171 results = [], 1172 matcher = compile( selector.replace( rtrim, "$1" ) ); 1173 1174 return matcher[ expando ] ? 1175 markFunction(function( seed, matches, context, xml ) { 1176 var elem, 1177 unmatched = matcher( seed, null, xml, [] ), 1178 i = seed.length; 1179 1180 // Match elements unmatched by `matcher` 1181 while ( i-- ) { 1182 if ( (elem = unmatched[i]) ) { 1183 seed[i] = !(matches[i] = elem); 1184 } 1185 } 1186 }) : 1187 function( elem, context, xml ) { 1188 input[0] = elem; 1189 matcher( input, null, xml, results ); 1190 return !results.pop(); 1191 }; 1192 }), 1193 1194 "has": markFunction(function( selector ) { 1195 return function( elem ) { 1196 return Sizzle( selector, elem ).length > 0; 1197 }; 1198 }), 1199 1200 "contains": markFunction(function( text ) { 1201 return function( elem ) { 1202 return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; 1203 }; 1204 }), 1205 1206 // "Whether an element is represented by a :lang() selector 1207 // is based solely on the element's language value 1208 // being equal to the identifier C, 1209 // or beginning with the identifier C immediately followed by "-". 1210 // The matching of C against the element's language value is performed case-insensitively. 1211 // The identifier C does not have to be a valid language name." 1212 // http://www.w3.org/TR/selectors/#lang-pseudo 1213 "lang": markFunction( function( lang ) { 1214 // lang value must be a valid identifier 1215 if ( !ridentifier.test(lang || "") ) { 1216 Sizzle.error( "unsupported lang: " + lang ); 1217 } 1218 lang = lang.replace( runescape, funescape ).toLowerCase(); 1219 return function( elem ) { 1220 var elemLang; 1221 do { 1222 if ( (elemLang = documentIsHTML ? 1223 elem.lang : 1224 elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { 1225 1226 elemLang = elemLang.toLowerCase(); 1227 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; 1228 } 1229 } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); 1230 return false; 1231 }; 1232 }), 1233 1234 // Miscellaneous 1235 "target": function( elem ) { 1236 var hash = window.location && window.location.hash; 1237 return hash && hash.slice( 1 ) === elem.id; 1238 }, 1239 1240 "root": function( elem ) { 1241 return elem === docElem; 1242 }, 1243 1244 "focus": function( elem ) { 1245 return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); 1246 }, 1247 1248 // Boolean properties 1249 "enabled": function( elem ) { 1250 return elem.disabled === false; 1251 }, 1252 1253 "disabled": function( elem ) { 1254 return elem.disabled === true; 1255 }, 1256 1257 "checked": function( elem ) { 1258 // In CSS3, :checked should return both checked and selected elements 1259 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 1260 var nodeName = elem.nodeName.toLowerCase(); 1261 return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); 1262 }, 1263 1264 "selected": function( elem ) { 1265 // Accessing this property makes selected-by-default 1266 // options in Safari work properly 1267 if ( elem.parentNode ) { 1268 elem.parentNode.selectedIndex; 1269 } 1270 1271 return elem.selected === true; 1272 }, 1273 1274 // Contents 1275 "empty": function( elem ) { 1276 // http://www.w3.org/TR/selectors/#empty-pseudo 1277 // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), 1278 // not comment, processing instructions, or others 1279 // Thanks to Diego Perini for the nodeName shortcut 1280 // Greater than "@" means alpha characters (specifically not starting with "#" or "?") 1281 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 1282 if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { 1283 return false; 1284 } 1285 } 1286 return true; 1287 }, 1288 1289 "parent": function( elem ) { 1290 return !Expr.pseudos["empty"]( elem ); 1291 }, 1292 1293 // Element/input types 1294 "header": function( elem ) { 1295 return rheader.test( elem.nodeName ); 1296 }, 1297 1298 "input": function( elem ) { 1299 return rinputs.test( elem.nodeName ); 1300 }, 1301 1302 "button": function( elem ) { 1303 var name = elem.nodeName.toLowerCase(); 1304 return name === "input" && elem.type === "button" || name === "button"; 1305 }, 1306 1307 "text": function( elem ) { 1308 var attr; 1309 // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 1310 // use getAttribute instead to test this case 1311 return elem.nodeName.toLowerCase() === "input" && 1312 elem.type === "text" && 1313 ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); 1314 }, 1315 1316 // Position-in-collection 1317 "first": createPositionalPseudo(function() { 1318 return [ 0 ]; 1319 }), 1320 1321 "last": createPositionalPseudo(function( matchIndexes, length ) { 1322 return [ length - 1 ]; 1323 }), 1324 1325 "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { 1326 return [ argument < 0 ? argument + length : argument ]; 1327 }), 1328 1329 "even": createPositionalPseudo(function( matchIndexes, length ) { 1330 var i = 0; 1331 for ( ; i < length; i += 2 ) { 1332 matchIndexes.push( i ); 1333 } 1334 return matchIndexes; 1335 }), 1336 1337 "odd": createPositionalPseudo(function( matchIndexes, length ) { 1338 var i = 1; 1339 for ( ; i < length; i += 2 ) { 1340 matchIndexes.push( i ); 1341 } 1342 return matchIndexes; 1343 }), 1344 1345 "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { 1346 var i = argument < 0 ? argument + length : argument; 1347 for ( ; --i >= 0; ) { 1348 matchIndexes.push( i ); 1349 } 1350 return matchIndexes; 1351 }), 1352 1353 "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { 1354 var i = argument < 0 ? argument + length : argument; 1355 for ( ; ++i < length; ) { 1356 matchIndexes.push( i ); 1357 } 1358 return matchIndexes; 1359 }) 1360 } 1361 }; 1362 1363 //添加input和button偽類 1364 for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { 1365 Expr.pseudos[ i ] = createInputPseudo( i ); 1366 } 1367 for ( i in { submit: true, reset: true } ) { 1368 Expr.pseudos[ i ] = createButtonPseudo( i ); 1369 } 1370 1371 //把selector解析成一個(gè)個(gè)獨(dú)立的塊 1372 function tokenize( selector, parseOnly ) { 1373 var matched, match, tokens, type, 1374 soFar, groups, preFilters, 1375 cached = tokenCache[ selector + " " ]; 1376 1377 if ( cached ) { 1378 return parseOnly ? 0 : cached.slice( 0 ); 1379 } 1380 1381 soFar = selector; 1382 groups = []; 1383 preFilters = Expr.preFilter;//正則出來的數(shù)組不能直接用需要過濾下如:attr正則出來的數(shù)組引號(hào)還有~= 1384 1385 while ( soFar ) { 1386 1387 //第一次運(yùn)行或者并聯(lián)選擇器逗號(hào) 1388 if ( !matched || (match = rcomma.exec( soFar )) ) { 1389 if ( match ) { 1390 // Don't consume trailing commas as valid 1391 soFar = soFar.slice( match[0].length ) || soFar; 1392 } 1393 groups.push( tokens = [] ); 1394 } 1395 1396 matched = false; 1397 1398 //關(guān)系選擇器 1399 if ( (match = rcombinators.exec( soFar )) ) { 1400 matched = match.shift(); 1401 tokens.push( { 1402 value: matched, 1403 type: match[0].replace( rtrim, " " ) 1404 } ); 1405 soFar = soFar.slice( matched.length ); 1406 } 1407 1408 //過濾器 1409 for ( type in Expr.filter ) { 1410 //這里如果已匹配上是不是退出for等循環(huán)效率高點(diǎn)????tokenize函數(shù)要不要寫下(把rcomma、rcombinators、其它選擇器寫到一個(gè)for循環(huán)) 1411 if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || 1412 (match = preFilters[ type ]( match ))) ) { 1413 matched = match.shift();//真正的選擇器 1414 tokens.push( { 1415 value: matched,//真正的選擇器 1416 type: type,//選擇器類型 1417 matches: match//選擇器的各個(gè)部分如:attr ["[name="username"]", "name", "=", "username"] 1418 } ); 1419 soFar = soFar.slice( matched.length );//截取當(dāng)前匹配的選擇器 1420 } 1421 } 1422 1423 if ( !matched ) { 1424 break; 1425 } 1426 } 1427 1428 //如果我們僅僅解析返回?zé)o效的長度,否則返回解析完的選擇器對(duì)象或者拋出錯(cuò)誤 1429 return parseOnly ? 1430 soFar.length : 1431 soFar ? 1432 Sizzle.error( selector ) : 1433 // Cache the tokens 1434 //緩存解析完的選擇器 1435 tokenCache( selector, groups ).slice( 0 );//拷貝緩存中的,因?yàn)槭且妙愋腿绻苯邮褂脮?huì)改變緩存中的值 1436 } 1437 1438 function toSelector( tokens ) { 1439 var i = 0, 1440 len = tokens.length, 1441 selector = ""; 1442 for ( ; i < len; i++ ) { 1443 selector += tokens[i].value; 1444 } 1445 return selector; 1446 } 1447 1448 //根據(jù)關(guān)系選擇器檢查 1449 function addCombinator( matcher, combinator, base ) { 1450 var dir = combinator.dir, 1451 checkNonElements = base && dir === "parentNode", 1452 doneName = done++;//第幾個(gè)關(guān)系選擇器 1453 console.log('遇到第' + doneName + '個(gè)關(guān)系選擇器:'); 1454 return combinator.first ? 1455 // Check against closest ancestor/preceding element 1456 //檢查最靠近的祖先元素 1457 function( elem, context, xml ) { 1458 while ( (elem = elem[ dir ]) ) { 1459 if ( elem.nodeType === 1 || checkNonElements ) { 1460 return matcher( elem, context, xml ); 1461 } 1462 } 1463 } : 1464 1465 // Check against all ancestor/preceding elements 1466 //檢查最靠近的祖先元素或兄弟元素(概據(jù)>、~、+還有空格檢查) 1467 function( elem, context, xml ) { 1468 var data, cache, outerCache, 1469 dirkey = dirruns + " " + doneName; 1470 1471 //我們不可以在xml節(jié)點(diǎn)上設(shè)置任意數(shù)據(jù),所以它們不會(huì)從dir緩存中受益 1472 if ( xml ) { 1473 while ( (elem = elem[ dir ]) ) { 1474 if ( elem.nodeType === 1 || checkNonElements ) { 1475 if ( matcher( elem, context, xml ) ) { 1476 return true; 1477 } 1478 } 1479 } 1480 } else { 1481 while ( (elem = elem[ dir ]) ) { 1482 if ( elem.nodeType === 1 || checkNonElements ) { 1483 outerCache = elem[ expando ] || (elem[ expando ] = {}); 1484 //如果有緩存且符合下列條件則不用再次調(diào)用matcher函數(shù) 1485 if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { 1486 if ( (data = cache[1]) === true || data === cachedruns ) { 1487 return data === true; 1488 } 1489 } else { 1490 cache = outerCache[ dir ] = [ dirkey ]; 1491 cache[1] = matcher( elem, context, xml ) || cachedruns;//cachedruns//正在匹配第幾個(gè)元素 1492 if ( cache[1] === true ) { 1493 return true; 1494 } 1495 } 1496 } 1497 } 1498 } 1499 }; 1500 } 1501 1502 function elementMatcher( matchers ) { 1503 return matchers.length > 1 ? 1504 function( elem, context, xml ) { 1505 //這里代碼改為下面代碼方便調(diào)試 1506 // var i = matchers.length; 1507 // while ( i-- ) { 1508 // if ( !matchers[i]( elem, context, xml ) ) { 1509 // return false; 1510 // } 1511 // } 1512 var i = matchers.length; 1513 var matcher = null; 1514 while ( i-- ) { 1515 matcher = matchers[i]; 1516 //console.log(matcher) 1517 if ( !matcher( elem, context, xml ) ) { 1518 return false; 1519 } 1520 } 1521 return true; 1522 } : 1523 matchers[0]; 1524 } 1525 1526 function condense( unmatched, map, filter, context, xml ) { 1527 var elem, 1528 newUnmatched = [], 1529 i = 0, 1530 len = unmatched.length, 1531 mapped = map != null; 1532 1533 for ( ; i < len; i++ ) { 1534 if ( (elem = unmatched[i]) ) { 1535 if ( !filter || filter( elem, context, xml ) ) { 1536 newUnmatched.push( elem ); 1537 if ( mapped ) { 1538 map.push( i ); 1539 } 1540 } 1541 } 1542 } 1543 1544 return newUnmatched; 1545 } 1546 1547 //如:'\#test a input[name="username"]:last[type="text"] [value*=2]'(不建議寫這樣的選擇器) 1548 //preFilter位置偽類之前的所有選擇器過濾函數(shù) 如:'a input[name="username"]'選擇器的匹配函數(shù) 1549 //selector 位置偽類之前的所有選擇器 如:'a input[name="username"]' 1550 //matcher 位置偽類匹配函數(shù) 1551 //postFilter如果位置偽類后面還有選擇器, 且關(guān)系選擇器之前(如果有的話) 此選擇器的匹配函數(shù) 1552 //postFinder如果位置偽類后面還有關(guān)系選擇器,第一個(gè)關(guān)系選擇器以后的匹配函數(shù) 1553 //postSelector如果位置偽類后面還有關(guān)系選擇器,第一個(gè)關(guān)系選擇器以后的選擇器 如:' [value*=2]' 1554 function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { 1555 if ( postFilter && !postFilter[ expando ] ) { 1556 postFilter = setMatcher( postFilter ); 1557 } 1558 if ( postFinder && !postFinder[ expando ] ) { 1559 postFinder = setMatcher( postFinder, postSelector ); 1560 } 1561 return markFunction(function( seed, results, context, xml ) {//得到位置偽類之前的選擇器的元素后在篩選出符合條件偽類選擇器的元素 1562 var temp, i, elem, 1563 preMap = [], 1564 postMap = [], 1565 preexisting = results.length, 1566 1567 //根據(jù)把位置偽類前面的選擇器查找出元素然后再篩選位置偽類和它后面的選擇器 1568 elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), 1569 1570 // Prefilter to get matcher input, preserving a map for seed-results synchronization 1571 matcherIn = preFilter && ( seed || !selector ) ? 1572 condense( elems, preMap, preFilter, context, xml ) : 1573 elems, 1574 1575 matcherOut = matcher ? 1576 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, 1577 //如果postFinder存在,或者篩選的種子集存在,再或者篩選的種子集不存在但是postFilter存在或results中有值 1578 postFinder || ( seed ? preFilter : preexisting || postFilter ) ? 1579 1580 // ...intermediate processing is necessary必須中間處理 1581 [] : 1582 1583 // ...otherwise use results directly否則立即用resluts 1584 results : 1585 matcherIn; 1586 1587 // Find primary matches 1588 if ( matcher ) { 1589 matcher( matcherIn, matcherOut, context, xml ); 1590 } 1591 1592 // Apply postFilter 1593 if ( postFilter ) { 1594 temp = condense( matcherOut, postMap ); 1595 postFilter( temp, [], context, xml ); 1596 1597 // Un-match failing elements by moving them back to matcherIn 1598 //把沒有匹配失敗的元素放到matcherIn中 1599 i = temp.length; 1600 while ( i-- ) { 1601 if ( (elem = temp[i]) ) { 1602 matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); 1603 } 1604 } 1605 } 1606 1607 if ( seed ) { 1608 if ( postFinder || preFilter ) { 1609 if ( postFinder ) { 1610 // Get the final matcherOut by condensing this intermediate into postFinder contexts 1611 temp = []; 1612 i = matcherOut.length; 1613 while ( i-- ) { 1614 if ( (elem = matcherOut[i]) ) { 1615 // Restore matcherIn since elem is not yet a final match 1616 temp.push( (matcherIn[i] = elem) ); 1617 } 1618 } 1619 postFinder( null, (matcherOut = []), temp, xml ); 1620 } 1621 1622 // Move matched elements from seed to results to keep them synchronized 1623 i = matcherOut.length; 1624 while ( i-- ) { 1625 if ( (elem = matcherOut[i]) && 1626 (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { 1627 1628 seed[temp] = !(results[temp] = elem); 1629 } 1630 } 1631 } 1632 1633 // Add elements to results, through postFinder if defined 1634 } else { 1635 matcherOut = condense( 1636 matcherOut === results ? 1637 matcherOut.splice( preexisting, matcherOut.length ) : 1638 matcherOut 1639 ); 1640 if ( postFinder ) { 1641 postFinder( null, results, matcherOut, xml ); 1642 } else { 1643 push.apply( results, matcherOut ); 1644 } 1645 } 1646 }); 1647 } 1648 1649 function matcherFromTokens( tokens ) { 1650 var checkContext, matcher, j, 1651 len = tokens.length, 1652 leadingRelative = Expr.relative[ tokens[0].type ], 1653 implicitRelative = leadingRelative || Expr.relative[" "], 1654 i = leadingRelative ? 1 : 0, 1655 1656 //確保這些元素可以在context中找到 1657 matchContext = addCombinator( function( elem ) { 1658 return elem === checkContext; 1659 }, implicitRelative, true ), 1660 matchAnyContext = addCombinator( function( elem ) { 1661 return indexOf.call( checkContext, elem ) > -1; 1662 }, implicitRelative, true ), 1663 //這里用來確定元素在哪個(gè)context 1664 matchers = [ function( elem, context, xml ) { 1665 return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( 1666 (checkContext = context).nodeType ? 1667 matchContext( elem, context, xml ) : 1668 matchAnyContext( elem, context, xml ) ); 1669 } ]; 1670 1671 for ( ; i < len; i++ ) { 1672 if ( (matcher = Expr.relative[ tokens[i].type ]) ) { 1673 //當(dāng)遇到關(guān)系選擇器時(shí)elementMatcher函數(shù)將matchers數(shù)組中的函數(shù)生成一個(gè)函數(shù)(elementMatcher利用了閉包所以matchers一直存在內(nèi)存中) 1674 matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; 1675 } else { 1676 matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );//apply方式調(diào)用函數(shù), tokens[i].matches為參數(shù) 1677 1678 //返回一個(gè)特殊的位置匹配函數(shù) 1679 //偽類會(huì)把selector分兩部分 1680 if ( matcher[ expando ] ) { 1681 //發(fā)現(xiàn)下一個(gè)關(guān)系操作符(如果有話)并做適當(dāng)處理 1682 j = ++i; 1683 for ( ; j < len; j++ ) { 1684 if ( Expr.relative[ tokens[j].type ] ) {//如果位置偽類后面還有關(guān)系選擇器還需要篩選 1685 break; 1686 } 1687 } 1688 return setMatcher( 1689 i > 1 && elementMatcher( matchers ), 1690 i > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, "$1" ), 1691 matcher, 1692 i < j && matcherFromTokens( tokens.slice( i, j ) ),//如果位置偽類后面還有選擇器需要篩選 1693 j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),//如果位置偽類后面還有關(guān)系選擇器還需要篩選 1694 j < len && toSelector( tokens ) 1695 ); 1696 } 1697 matchers.push( matcher ); 1698 } 1699 } 1700 1701 return elementMatcher( matchers ); 1702 } 1703 1704 function matcherFromGroupMatchers( elementMatchers, setMatchers ) { 1705 // A counter to specify which element is currently being matched 1706 // 用計(jì)數(shù)器來指定當(dāng)前哪個(gè)元素正在匹配 1707 var matcherCachedRuns = 0, 1708 bySet = setMatchers.length > 0, 1709 byElement = elementMatchers.length > 0, 1710 superMatcher = function( seed, context, xml, results, expandContext ) { 1711 var elem, j, matcher, 1712 setMatched = [], 1713 matchedCount = 0, 1714 i = "0", 1715 unmatched = seed && [], 1716 outermost = expandContext != null, 1717 contextBackup = outermostContext, 1718 // We must always have either seed elements or context 1719 //我們必須總是檢查seed中的元素或context下的所有元素 1720 elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), 1721 // Use integer dirruns iff this is the outermost matcher 1722 //用整數(shù)dirruns區(qū)分這個(gè)是最外層的匹配函數(shù) 1723 dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); 1724 if ( outermost ) { 1725 outermostContext = context !== document && context; 1726 cachedruns = matcherCachedRuns; 1727 } 1728 1729 //通過elementMatchers內(nèi)的所有匹配函數(shù)的元素立即添加到results中 1730 //保持變量i是一個(gè)字符串,如果一個(gè)元素也沒有下面的元素匹配數(shù)量matchedCount為'00' 1731 for ( ; (elem = elems[i]) != null; i++ ) { 1732 if ( byElement && elem ) { 1733 j = 0; 1734 while ( (matcher = elementMatchers[j++]) ) { 1735 if ( matcher( elem, context, xml ) ) { 1736 results.push( elem ); 1737 break; 1738 } 1739 } 1740 if ( outermost ) { 1741 dirruns = dirrunsUnique; 1742 cachedruns = ++matcherCachedRuns;//正在匹配第幾個(gè)元素(同時(shí)告訴全局的,這里的全局是sizzle內(nèi)的不是window的) 1743 } 1744 } 1745 1746 // Track unmatched elements for set filters 1747 //跟蹤不匹配元素并設(shè)置過濾 1748 if ( bySet ) { 1749 // They will have gone through all possible matchers 1750 //它們已經(jīng)通過所有的匹配器,如果元素不匹配matchedCount減1 1751 if ( (elem = !matcher && elem) ) { 1752 matchedCount--; 1753 } 1754 1755 // Lengthen the array for every element, matched or not 1756 //如果seed中有元素的話,不管是否匹配都要把每個(gè)元素放到一個(gè)延長數(shù)組中 1757 if ( seed ) { 1758 unmatched.push( elem ); 1759 } 1760 } 1761 } 1762 1763 // Apply set filters to unmatched elements 1764 //用設(shè)置的過濾器來去除不匹配的元素 1765 matchedCount += i;//i是所有元素?cái)?shù)量,matchedCount之前是不匹配的元素?cái)?shù)量,所以matchedCount += i就是匹配的數(shù)量 1766 if ( bySet && i !== matchedCount ) { 1767 j = 0; 1768 while ( (matcher = setMatchers[j++]) ) { 1769 //這里篩選unmatched內(nèi)的元素 1770 matcher( unmatched, setMatched, context, xml );//(這里的setMatched是引用類型,所以函數(shù)matcher內(nèi)給setMatched添加的元素和這里的setMatched一樣 1771 } 1772 1773 if ( seed ) { 1774 // Reintegrate element matches to eliminate the need for sorting 1775 if ( matchedCount > 0 ) { 1776 while ( i-- ) { 1777 if ( !(unmatched[i] || setMatched[i]) ) { 1778 setMatched[i] = pop.call( results ); 1779 } 1780 } 1781 } 1782 1783 // Discard index placeholder values to get only actual matches 1784 setMatched = condense( setMatched ); 1785 } 1786 1787 // Add matches to results 1788 //添加匹配元素到results 1789 push.apply( results, setMatched ); 1790 1791 //并聯(lián)選擇器匹配成功后按規(guī)定排序 1792 if ( outermost && !seed && setMatched.length > 0 && 1793 ( matchedCount + setMatchers.length ) > 1 ) { 1794 1795 Sizzle.uniqueSort( results ); 1796 } 1797 } 1798 1799 // Override manipulation of globals by nested matchers 1800 if ( outermost ) { 1801 dirruns = dirrunsUnique; 1802 outermostContext = contextBackup; 1803 } 1804 1805 return unmatched; 1806 }; 1807 1808 return bySet ? 1809 markFunction( superMatcher ) : 1810 superMatcher; 1811 } 1812 1813 compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { 1814 var i, 1815 setMatchers = [], 1816 elementMatchers = [], 1817 cached = compilerCache[ selector + " " ]; 1818 1819 if ( !cached ) { 1820 //生成一個(gè)遞歸函數(shù)用來檢查每個(gè)元素 1821 if ( !group ) { 1822 group = tokenize( selector ); 1823 } 1824 i = group.length; 1825 while ( i-- ) {//如果是有并聯(lián)選擇器這里多次等循環(huán) 1826 cached = matcherFromTokens( group[i] ); 1827 if ( cached[ expando ] ) {//說明有位置偽類選擇器 1828 setMatchers.push( cached ); 1829 } else { 1830 elementMatchers.push( cached ); 1831 } 1832 } 1833 1834 //當(dāng)是并聯(lián)選擇器時(shí)(也就是group數(shù)組有多個(gè)元素),elementMatchers和setMatchers可能都有值 1835 cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); 1836 } 1837 return cached; 1838 }; 1839 1840 function multipleContexts( selector, contexts, results ) { 1841 var i = 0, 1842 len = contexts.length; 1843 for ( ; i < len; i++ ) { 1844 Sizzle( selector, contexts[i], results ); 1845 } 1846 return results; 1847 } 1848 1849 function select( selector, context, results, seed ) { 1850 var i, tokens, token, type, find, 1851 match = tokenize( selector );//把selector解析成一個(gè)個(gè)獨(dú)立的塊 1852 1853 if ( !seed ) { 1854 //如果不是并聯(lián)選擇器則盡量減少操作 1855 if ( match.length === 1 ) { 1856 1857 //如果第一個(gè)是selector是id我們可以設(shè)置context快速查找 1858 tokens = match[0] = match[0].slice( 0 ); 1859 if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && 1860 context.nodeType === 9 && documentIsHTML && 1861 Expr.relative[ tokens[1].type ] ) { 1862 1863 context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; 1864 if ( !context ) {//如果context這個(gè)元素(selector第一個(gè)id選擇器)都不存在就不用查找了 1865 return results; 1866 } 1867 1868 selector = selector.slice( tokens.shift().value.length );//去掉第一個(gè)id選擇器 1869 } 1870 1871 //如果selector中沒有有位置偽類從右向左匹配 1872 i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; 1873 while ( i-- ) { 1874 token = tokens[i]; 1875 1876 //如果遇到了關(guān)系選擇器中止 1877 if ( Expr.relative[ (type = token.type) ] ) { 1878 break; 1879 } 1880 if ( (find = Expr.find[ type ]) ) { 1881 //如果selector第一個(gè)選擇器是兄弟選擇器,則擴(kuò)大context范圍(原因要查找的節(jié)點(diǎn)在這里必須是它的父節(jié)點(diǎn)或祖先節(jié)點(diǎn)) 1882 if ( (seed = find( 1883 token.matches[0].replace( runescape, funescape ), 1884 rsibling.test( tokens[0].type ) && context.parentNode || context 1885 )) ) { 1886 1887 //如果seed是空的或者tokens中沒有值了,就可以return了沒有必要查找了 1888 tokens.splice( i, 1 ); 1889 selector = seed.length && toSelector( tokens ); 1890 if ( !selector ) { 1891 push.apply( results, seed ); 1892 return results; 1893 } 1894 1895 break; 1896 } 1897 } 1898 } 1899 } 1900 } 1901 1902 // Compile and execute a filtering function 1903 // Provide `match` to avoid retokenization if we modified the selector above 1904 //編譯并執(zhí)行過濾函數(shù) 1905 //上面如果修改了selector,match同樣修改,我們把match傳過去可以避免compile內(nèi)再次調(diào)用tokenize 1906 compile( selector, match )( 1907 seed, 1908 context, 1909 !documentIsHTML, 1910 results, 1911 rsibling.test( selector )//selector中是否有兄弟關(guān)系選擇器 1912 ); 1913 return results; 1914 } 1915 1916 // Deprecated 1917 Expr.pseudos["nth"] = Expr.pseudos["eq"]; 1918 1919 // Easy API for creating new setFilters 1920 // 1921 function setFilters() {} 1922 1923 setFilters.prototype = Expr.filters = Expr.pseudos; 1924 Expr.setFilters = new setFilters(); 1925 1926 // Check sort stability 1927 support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; 1928 1929 //初始化默認(rèn)document 1930 setDocument(); 1931 1932 // Always assume the presence of duplicates if sort doesn't 1933 // pass them to our comparison function (as in Google Chrome). 1934 [0, 0].sort( sortOrder ); 1935 support.detectDuplicates = hasDuplicate; 1936 1937 // EXPOSE 1938 //sizzle對(duì)外公開 1939 if ( typeof define === "function" && define.amd ) { 1940 define(function() { return Sizzle; }); 1941 } else { 1942 window.Sizzle = Sizzle; 1943 } 1944 // EXPOSE 1945 1946 })( window );

部分參考:http://www.cnblogs.com/rubylouvre/archive/2013/03/05/2943666.html

轉(zhuǎn)載于:https://www.cnblogs.com/daycool/archive/2013/04/15/3023169.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的jquery--选择器sizzle源码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

亚洲中文字幕va福利 | 久久伊人色av天堂九九小黄鸭 | 高中生自慰www网站 | 精品偷拍一区二区三区在线看 | 久久精品中文字幕一区 | 亚洲日韩中文字幕在线播放 | 亚洲国产成人a精品不卡在线 | 蜜桃视频插满18在线观看 | 国产精品亚洲一区二区三区喷水 | 99久久人妻精品免费二区 | 精品亚洲成av人在线观看 | 奇米影视7777久久精品人人爽 | 国产av剧情md精品麻豆 | 少妇一晚三次一区二区三区 | 中文字幕中文有码在线 | 少妇人妻大乳在线视频 | 成人性做爰aaa片免费看 | 中文字幕乱码人妻无码久久 | 精品国产一区二区三区av 性色 | 丰满少妇女裸体bbw | 熟女俱乐部五十路六十路av | 俺去俺来也www色官网 | 给我免费的视频在线观看 | 国产免费无码一区二区视频 | 红桃av一区二区三区在线无码av | 88国产精品欧美一区二区三区 | 亚洲国产一区二区三区在线观看 | 国产真实伦对白全集 | 超碰97人人做人人爱少妇 | 亚洲精品午夜无码电影网 | 欧美老人巨大xxxx做受 | 中文字幕人妻无码一夲道 | 九九综合va免费看 | 国产精品美女久久久久av爽李琼 | 亚洲精品国产a久久久久久 | 一本色道婷婷久久欧美 | 天天爽夜夜爽夜夜爽 | 久久久久成人片免费观看蜜芽 | 午夜精品久久久久久久 | 亚洲七七久久桃花影院 | 欧美精品无码一区二区三区 | 国产亚洲精品久久久久久久 | 亚洲成av人综合在线观看 | 国产精品久久久久影院嫩草 | 老司机亚洲精品影院 | 久久久国产精品无码免费专区 | 久久精品人人做人人综合 | 中文字幕无码日韩欧毛 | 99麻豆久久久国产精品免费 | 少妇性俱乐部纵欲狂欢电影 | 精品乱码久久久久久久 | 大乳丰满人妻中文字幕日本 | 一个人免费观看的www视频 | 日韩精品乱码av一区二区 | 无码一区二区三区在线观看 | 亚洲精品午夜无码电影网 | 成人无码视频在线观看网站 | 亚洲gv猛男gv无码男同 | 亚洲熟妇自偷自拍另类 | 日韩亚洲欧美中文高清在线 | 日韩人妻无码一区二区三区久久99 | 国产精品va在线观看无码 | 国产偷自视频区视频 | 精品国产一区二区三区四区在线看 | 福利一区二区三区视频在线观看 | 日韩亚洲欧美精品综合 | 国产av久久久久精东av | 中文字幕乱码中文乱码51精品 | 亚洲精品久久久久中文第一幕 | 大地资源网第二页免费观看 | 亚洲国产av精品一区二区蜜芽 | 无码午夜成人1000部免费视频 | 丰满护士巨好爽好大乳 | 少妇被粗大的猛进出69影院 | 无码人妻出轨黑人中文字幕 | 欧洲精品码一区二区三区免费看 | 国产精品亚洲五月天高清 | 国产口爆吞精在线视频 | 香蕉久久久久久av成人 | 真人与拘做受免费视频 | 久久久久亚洲精品中文字幕 | 国产精品99久久精品爆乳 | 美女扒开屁股让男人桶 | 夜夜高潮次次欢爽av女 | 日日天日日夜日日摸 | 亚洲一区二区三区香蕉 | 欧美刺激性大交 | 亚洲成熟女人毛毛耸耸多 | 日韩亚洲欧美精品综合 | 欧美三级a做爰在线观看 | 精品国产国产综合精品 | 天堂一区人妻无码 | 婷婷综合久久中文字幕蜜桃三电影 | 18精品久久久无码午夜福利 | 国产色精品久久人妻 | 亚洲日韩精品欧美一区二区 | 国产亚洲tv在线观看 | 久久久精品欧美一区二区免费 | 国产精品亚洲综合色区韩国 | 少妇性荡欲午夜性开放视频剧场 | 亚洲一区二区三区无码久久 | 55夜色66夜色国产精品视频 | 四虎影视成人永久免费观看视频 | 亚洲乱码国产乱码精品精 | 人妻人人添人妻人人爱 | 国产av剧情md精品麻豆 | 中文字幕精品av一区二区五区 | 国精产品一品二品国精品69xx | 97精品国产97久久久久久免费 | 青春草在线视频免费观看 | 国内精品人妻无码久久久影院蜜桃 | 欧美第一黄网免费网站 | 亚洲の无码国产の无码步美 | 欧美黑人乱大交 | 性啪啪chinese东北女人 | 精品国产av色一区二区深夜久久 | 欧美 日韩 人妻 高清 中文 | 天天做天天爱天天爽综合网 | 福利一区二区三区视频在线观看 | 少妇太爽了在线观看 | 欧洲美熟女乱又伦 | 三上悠亚人妻中文字幕在线 | 久久精品女人的天堂av | а√天堂www在线天堂小说 | 成人性做爰aaa片免费看不忠 | 少妇人妻偷人精品无码视频 | 日本在线高清不卡免费播放 | 无码人妻出轨黑人中文字幕 | www国产精品内射老师 | 亚洲 另类 在线 欧美 制服 | 亚洲综合色区中文字幕 | 熟妇人妻无乱码中文字幕 | 欧美zoozzooz性欧美 | 无码人妻出轨黑人中文字幕 | 天天躁夜夜躁狠狠是什么心态 | 人人爽人人澡人人高潮 | 国产成人精品优优av | 精品亚洲韩国一区二区三区 | 欧美xxxxx精品 | 六月丁香婷婷色狠狠久久 | 国产精品a成v人在线播放 | 久激情内射婷内射蜜桃人妖 | 波多野结衣一区二区三区av免费 | 久精品国产欧美亚洲色aⅴ大片 | 强开小婷嫩苞又嫩又紧视频 | 男女作爱免费网站 | 国产片av国语在线观看 | 精品国产一区二区三区av 性色 | 无码人妻av免费一区二区三区 | 97精品国产97久久久久久免费 | 98国产精品综合一区二区三区 | 色一情一乱一伦一区二区三欧美 | 扒开双腿疯狂进出爽爽爽视频 | 日本精品人妻无码免费大全 | 5858s亚洲色大成网站www | 成人欧美一区二区三区 | 2020久久超碰国产精品最新 | 在线天堂新版最新版在线8 | 人妻aⅴ无码一区二区三区 | 国产亚洲tv在线观看 | 天天综合网天天综合色 | 国产在线无码精品电影网 | 精品欧美一区二区三区久久久 | 久久久久亚洲精品男人的天堂 | 欧美 丝袜 自拍 制服 另类 | 国产精品久久久午夜夜伦鲁鲁 | 日日麻批免费40分钟无码 | 欧美激情内射喷水高潮 | 国产人妻精品一区二区三区不卡 | 性史性农村dvd毛片 | 国产97在线 | 亚洲 | 国产片av国语在线观看 | 成人无码精品一区二区三区 | 亚洲中文字幕无码中文字在线 | 日韩av无码一区二区三区不卡 | 国产精品亚洲综合色区韩国 | 天堂无码人妻精品一区二区三区 | 国产一区二区三区四区五区加勒比 | 88国产精品欧美一区二区三区 | 性欧美大战久久久久久久 | 激情国产av做激情国产爱 | 久久亚洲中文字幕无码 | 亚洲伊人久久精品影院 | 在线成人www免费观看视频 | 国产xxx69麻豆国语对白 | 伊人色综合久久天天小片 | 成人欧美一区二区三区黑人免费 | 日韩少妇内射免费播放 | 亚洲国产高清在线观看视频 | 午夜免费福利小电影 | 婷婷五月综合激情中文字幕 | 日本乱偷人妻中文字幕 | 国产精品久久久av久久久 | 最近的中文字幕在线看视频 | 国产一区二区三区影院 | 亚洲国产精品久久久天堂 | 免费中文字幕日韩欧美 | 丰满人妻精品国产99aⅴ | 色欲av亚洲一区无码少妇 | 熟女体下毛毛黑森林 | 乱码午夜-极国产极内射 | 久久久精品欧美一区二区免费 | 高潮毛片无遮挡高清免费 | 日欧一片内射va在线影院 | 无码国内精品人妻少妇 | 欧美亚洲日韩国产人成在线播放 | 国产真人无遮挡作爱免费视频 | 一本久久伊人热热精品中文字幕 | 亚洲国产精品无码久久久久高潮 | 午夜福利不卡在线视频 | 欧美日韩久久久精品a片 | 亚洲国产精品成人久久蜜臀 | 亚洲第一网站男人都懂 | 国产精品美女久久久久av爽李琼 | www国产亚洲精品久久网站 | 亚洲色大成网站www国产 | 欧美激情综合亚洲一二区 | 国产超级va在线观看视频 | 九九在线中文字幕无码 | 麻豆人妻少妇精品无码专区 | 久久久亚洲欧洲日产国码αv | 久久久久国色av免费观看性色 | 99精品视频在线观看免费 | 无码毛片视频一区二区本码 | 亚洲天堂2017无码中文 | 国产偷国产偷精品高清尤物 | 97久久国产亚洲精品超碰热 | 骚片av蜜桃精品一区 | 美女黄网站人色视频免费国产 | 欧美日韩一区二区三区自拍 | 国产农村乱对白刺激视频 | 日日干夜夜干 | 亚洲精品一区国产 | 麻花豆传媒剧国产免费mv在线 | 搡女人真爽免费视频大全 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 日本一区二区三区免费播放 | 99久久久无码国产aaa精品 | 一本久久a久久精品vr综合 | 六月丁香婷婷色狠狠久久 | 欧美日本精品一区二区三区 | 色婷婷av一区二区三区之红樱桃 | a在线亚洲男人的天堂 | 中文字幕日韩精品一区二区三区 | 国产色xx群视频射精 | 国产精品va在线播放 | 九一九色国产 | 乱人伦人妻中文字幕无码 | 亚洲综合在线一区二区三区 | 精品人妻中文字幕有码在线 | 在线 国产 欧美 亚洲 天堂 | 亚洲精品美女久久久久久久 | 天天做天天爱天天爽综合网 | 久久久av男人的天堂 | 亚洲娇小与黑人巨大交 | 国产另类ts人妖一区二区 | 国产无av码在线观看 | 婷婷丁香五月天综合东京热 | 啦啦啦www在线观看免费视频 | 亚洲国产精品久久人人爱 | 欧美一区二区三区视频在线观看 | 国产电影无码午夜在线播放 | 欧美日韩色另类综合 | aa片在线观看视频在线播放 | 88国产精品欧美一区二区三区 | 欧美国产日韩亚洲中文 | 在线精品国产一区二区三区 | 中国女人内谢69xxxxxa片 | 久久久久免费看成人影片 | 精品久久久无码人妻字幂 | 亚洲国产欧美在线成人 | 夜先锋av资源网站 | 丰满人妻翻云覆雨呻吟视频 | 一本色道婷婷久久欧美 | 日本va欧美va欧美va精品 | 国产精品久久久av久久久 | 强辱丰满人妻hd中文字幕 | 日韩精品a片一区二区三区妖精 | 男人的天堂2018无码 | 国产极品美女高潮无套在线观看 | 无码纯肉视频在线观看 | 天天综合网天天综合色 | 精品无码成人片一区二区98 | 男人和女人高潮免费网站 | 波多野结衣乳巨码无在线观看 | 免费国产成人高清在线观看网站 | 亚洲天堂2017无码中文 | 无码人妻黑人中文字幕 | 日韩人妻无码一区二区三区久久99 | 国产精品igao视频网 | 久久99精品国产麻豆蜜芽 | 丝袜美腿亚洲一区二区 | 久久aⅴ免费观看 | 亚洲男人av香蕉爽爽爽爽 | 少女韩国电视剧在线观看完整 | 亚洲第一无码av无码专区 | 免费无码一区二区三区蜜桃大 | 狂野欧美激情性xxxx | 沈阳熟女露脸对白视频 | 国产精品鲁鲁鲁 | 亚洲精品久久久久久一区二区 | 久久久中文字幕日本无吗 | 久久aⅴ免费观看 | 日日摸夜夜摸狠狠摸婷婷 | 国产午夜福利100集发布 | 亲嘴扒胸摸屁股激烈网站 | 日本一卡二卡不卡视频查询 | 99精品国产综合久久久久五月天 | 亚洲一区av无码专区在线观看 | 99riav国产精品视频 | 精品偷自拍另类在线观看 | 日本一卡二卡不卡视频查询 | 日本丰满护士爆乳xxxx | 久久无码中文字幕免费影院蜜桃 | 亚洲人成影院在线观看 | 性史性农村dvd毛片 | 亚洲一区二区三区在线观看网站 | 国产人妻精品午夜福利免费 | 久久国语露脸国产精品电影 | 日韩在线不卡免费视频一区 | 国产乱人伦av在线无码 | 国产午夜福利100集发布 | 国产极品视觉盛宴 | 99久久人妻精品免费二区 | 亚洲 激情 小说 另类 欧美 | 久久久久免费精品国产 | 玩弄人妻少妇500系列视频 | 国产亚洲精品久久久闺蜜 | 久久99精品久久久久久动态图 | 免费播放一区二区三区 | 国模大胆一区二区三区 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 日日摸日日碰夜夜爽av | 亚洲日韩av一区二区三区中文 | 性色欲情网站iwww九文堂 | 亚洲 高清 成人 动漫 | 色五月丁香五月综合五月 | 捆绑白丝粉色jk震动捧喷白浆 | 成人精品一区二区三区中文字幕 | 夜夜影院未满十八勿进 | 午夜精品一区二区三区的区别 | 精品久久久久久亚洲精品 | 亚洲大尺度无码无码专区 | 中文精品无码中文字幕无码专区 | 国产麻豆精品一区二区三区v视界 | 欧美精品一区二区精品久久 | 亚洲一区二区三区播放 | 日本一区二区三区免费播放 | 无码乱肉视频免费大全合集 | 婷婷五月综合激情中文字幕 | 国产精品久久久久久久影院 | 中文字幕+乱码+中文字幕一区 | 日日躁夜夜躁狠狠躁 | 乱人伦中文视频在线观看 | 天堂久久天堂av色综合 | 色欲综合久久中文字幕网 | 国模大胆一区二区三区 | 任你躁国产自任一区二区三区 | 色一情一乱一伦一区二区三欧美 | 狂野欧美性猛交免费视频 | 久久久亚洲欧洲日产国码αv | 国产精品人人爽人人做我的可爱 | a在线亚洲男人的天堂 | 又色又爽又黄的美女裸体网站 | 亚洲精品久久久久久久久久久 | 久久国产精品_国产精品 | a片在线免费观看 | 成人精品视频一区二区 | 强开小婷嫩苞又嫩又紧视频 | 国产艳妇av在线观看果冻传媒 | 小鲜肉自慰网站xnxx | www国产精品内射老师 | 无码国内精品人妻少妇 | 无套内谢的新婚少妇国语播放 | 日本熟妇大屁股人妻 | 久久久久免费精品国产 | 麻豆成人精品国产免费 | 综合网日日天干夜夜久久 | 精品国精品国产自在久国产87 | 日韩无套无码精品 | 久久久国产一区二区三区 | 日本熟妇浓毛 | 99精品无人区乱码1区2区3区 | 国产在线一区二区三区四区五区 | 伊人色综合久久天天小片 | 任你躁在线精品免费 | 日本乱偷人妻中文字幕 | 丝袜足控一区二区三区 | 国产精品丝袜黑色高跟鞋 | 国产乱码精品一品二品 | 国产精品久久国产精品99 | 国产精品多人p群无码 | 欧美精品在线观看 | 亚洲春色在线视频 | 无码吃奶揉捏奶头高潮视频 | 亚洲国产一区二区三区在线观看 | 精品国产福利一区二区 | 蜜臀av无码人妻精品 | 国产两女互慰高潮视频在线观看 | 欧美肥老太牲交大战 | 久久久中文久久久无码 | 久久人人爽人人爽人人片av高清 | 真人与拘做受免费视频一 | 97无码免费人妻超级碰碰夜夜 | 国产精品久久久久9999小说 | 亚洲欧美综合区丁香五月小说 | 亚洲综合另类小说色区 | 伊人久久大香线蕉亚洲 | 小sao货水好多真紧h无码视频 | 全黄性性激高免费视频 | 少妇性l交大片欧洲热妇乱xxx | 综合网日日天干夜夜久久 | 成人女人看片免费视频放人 | 日本va欧美va欧美va精品 | 伦伦影院午夜理论片 | 成人免费视频在线观看 | 男人和女人高潮免费网站 | 国产熟妇高潮叫床视频播放 | 久久97精品久久久久久久不卡 | 婷婷综合久久中文字幕蜜桃三电影 | 国产成人无码av一区二区 | 无码国产乱人伦偷精品视频 | 国产精品亚洲综合色区韩国 | 男女爱爱好爽视频免费看 | 国产激情艳情在线看视频 | 国产色视频一区二区三区 | 亚洲精品国产a久久久久久 | 亚洲精品一区二区三区四区五区 | 亚洲中文字幕无码一久久区 | 夜精品a片一区二区三区无码白浆 | 草草网站影院白丝内射 | 国产黑色丝袜在线播放 | 人人妻人人澡人人爽欧美一区九九 | 国产午夜视频在线观看 | 少妇高潮喷潮久久久影院 | 中文字幕亚洲情99在线 | 动漫av一区二区在线观看 | 日日橹狠狠爱欧美视频 | 中文字幕无线码免费人妻 | 美女毛片一区二区三区四区 | 5858s亚洲色大成网站www | 樱花草在线社区www | 亚洲人成网站在线播放942 | √天堂资源地址中文在线 | 国产又粗又硬又大爽黄老大爷视 | 欧美怡红院免费全部视频 | 人人妻人人澡人人爽欧美一区 | 国内精品久久久久久中文字幕 | 国产精品对白交换视频 | 精品国产成人一区二区三区 | 人人妻人人澡人人爽欧美精品 | 蜜桃臀无码内射一区二区三区 | 欧美激情内射喷水高潮 | 十八禁真人啪啪免费网站 | 性色欲情网站iwww九文堂 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 无码人妻黑人中文字幕 | 日韩人妻少妇一区二区三区 | 久久99精品久久久久久动态图 | 国内揄拍国内精品少妇国语 | 国产精品无码一区二区桃花视频 | 精品国产乱码久久久久乱码 | 东北女人啪啪对白 | 日本熟妇乱子伦xxxx | 久久精品国产大片免费观看 | 精品成人av一区二区三区 | 美女黄网站人色视频免费国产 | 亚洲国产精华液网站w | 给我免费的视频在线观看 | 国产人妻精品一区二区三区不卡 | 人妻与老人中文字幕 | 久久久国产一区二区三区 | 欧美性生交xxxxx久久久 | av人摸人人人澡人人超碰下载 | 小sao货水好多真紧h无码视频 | 精品无码一区二区三区爱欲 | 丰满人妻翻云覆雨呻吟视频 | 国产精品永久免费视频 | 亚洲欧洲日本无在线码 | 国产一区二区三区影院 | 亚洲色大成网站www | 野外少妇愉情中文字幕 | 亚洲精品国产精品乱码不卡 | 两性色午夜视频免费播放 | 人妻少妇精品视频专区 | 久久久久国色av免费观看性色 | 日本又色又爽又黄的a片18禁 | 国产精品久久久久久久9999 | 少妇厨房愉情理9仑片视频 | 天堂亚洲2017在线观看 | 无码av岛国片在线播放 | 国产在线aaa片一区二区99 | 婷婷色婷婷开心五月四房播播 | 国产片av国语在线观看 | 一本久久伊人热热精品中文字幕 | 麻豆成人精品国产免费 | 国产av人人夜夜澡人人爽麻豆 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 在线а√天堂中文官网 | 福利一区二区三区视频在线观看 | 亚洲熟妇色xxxxx亚洲 | 免费看男女做好爽好硬视频 | 精品国产av色一区二区深夜久久 | 无码av最新清无码专区吞精 | 国产精品va在线观看无码 | 人妻体内射精一区二区三四 | 55夜色66夜色国产精品视频 | 久久综合九色综合97网 | 女人被男人爽到呻吟的视频 | 人妻插b视频一区二区三区 | 成人影院yy111111在线观看 | 97无码免费人妻超级碰碰夜夜 | 成人一在线视频日韩国产 | 亚洲一区二区三区在线观看网站 | 亚洲一区二区三区香蕉 | 国产精品美女久久久网av | 久久久久久久女国产乱让韩 | 婷婷丁香六月激情综合啪 | 麻豆成人精品国产免费 | 精品乱子伦一区二区三区 | 天堂在线观看www | 在线播放免费人成毛片乱码 | 亚洲欧洲中文日韩av乱码 | 天天拍夜夜添久久精品大 | 国产人妻精品一区二区三区不卡 | 亚洲国产日韩a在线播放 | 精品厕所偷拍各类美女tp嘘嘘 | 欧洲欧美人成视频在线 | 免费观看又污又黄的网站 | 丝袜 中出 制服 人妻 美腿 | 国产69精品久久久久app下载 | 国产无遮挡又黄又爽又色 | 天天摸天天透天天添 | 丁香啪啪综合成人亚洲 | 女人被爽到呻吟gif动态图视看 | 日产国产精品亚洲系列 | 国产精品人妻一区二区三区四 | 18精品久久久无码午夜福利 | 免费无码午夜福利片69 | 97久久国产亚洲精品超碰热 | 国产精品福利视频导航 | 久久99久久99精品中文字幕 | 成年美女黄网站色大免费全看 | 性欧美熟妇videofreesex | 女人被男人爽到呻吟的视频 | 伊在人天堂亚洲香蕉精品区 | 国产激情综合五月久久 | 无码任你躁久久久久久久 | 人人妻人人澡人人爽精品欧美 | 永久免费精品精品永久-夜色 | 国产精品欧美成人 | 亚洲国产精品一区二区第一页 | 久久人人爽人人爽人人片av高清 | 国产在线精品一区二区高清不卡 | 国产乱人无码伦av在线a | 国产成人无码区免费内射一片色欲 | 欧美老妇交乱视频在线观看 | 四虎影视成人永久免费观看视频 | 亚洲国产精华液网站w | 欧美自拍另类欧美综合图片区 | 日本熟妇浓毛 | 亚洲高清偷拍一区二区三区 | 成人精品视频一区二区三区尤物 | 国产亚洲视频中文字幕97精品 | 亚洲国产欧美日韩精品一区二区三区 | 帮老师解开蕾丝奶罩吸乳网站 | 97人妻精品一区二区三区 | 亚洲精品一区三区三区在线观看 | 性史性农村dvd毛片 | 野外少妇愉情中文字幕 | 国产精品手机免费 | 亚洲国产精品久久久天堂 | 四虎4hu永久免费 | 无码人妻av免费一区二区三区 | 欧美日本精品一区二区三区 | 性啪啪chinese东北女人 | 人人妻人人澡人人爽欧美精品 | 色狠狠av一区二区三区 | 精品国精品国产自在久国产87 | 亚洲精品午夜无码电影网 | 狠狠色欧美亚洲狠狠色www | 欧美放荡的少妇 | 久久久久成人精品免费播放动漫 | 成人综合网亚洲伊人 | v一区无码内射国产 | 国产精品美女久久久久av爽李琼 | 黑森林福利视频导航 | 人人澡人人透人人爽 | 福利一区二区三区视频在线观看 | 亚洲色大成网站www国产 | 国产成人无码av一区二区 | 夜夜影院未满十八勿进 | 免费中文字幕日韩欧美 | www国产亚洲精品久久久日本 | 免费中文字幕日韩欧美 | 精品久久久中文字幕人妻 | 蜜臀aⅴ国产精品久久久国产老师 | 最新国产乱人伦偷精品免费网站 | 亚洲国产av精品一区二区蜜芽 | 无码人妻出轨黑人中文字幕 | 亚洲日韩av一区二区三区四区 | 欧美亚洲日韩国产人成在线播放 | 无码人妻久久一区二区三区不卡 | 在线 国产 欧美 亚洲 天堂 | 又大又黄又粗又爽的免费视频 | 久久久精品成人免费观看 | 久久99国产综合精品 | 国产片av国语在线观看 | 免费无码的av片在线观看 | 亚洲精品一区二区三区婷婷月 | 成人精品天堂一区二区三区 | 99国产欧美久久久精品 | 成人aaa片一区国产精品 | 高潮毛片无遮挡高清免费 | 四虎永久在线精品免费网址 | 国产乱子伦视频在线播放 | 国产人成高清在线视频99最全资源 | 国产香蕉97碰碰久久人人 | 人人妻人人澡人人爽人人精品浪潮 | aⅴ在线视频男人的天堂 | 无码帝国www无码专区色综合 | 久久精品中文字幕一区 | 在线а√天堂中文官网 | 久久综合香蕉国产蜜臀av | 乌克兰少妇性做爰 | 国产莉萝无码av在线播放 | 一本久道久久综合婷婷五月 | 又粗又大又硬毛片免费看 | 久久久久国色av免费观看性色 | 狠狠色噜噜狠狠狠7777奇米 | 久久无码中文字幕免费影院蜜桃 | 久久国产精品二国产精品 | 亚欧洲精品在线视频免费观看 | 任你躁在线精品免费 | 欧美丰满老熟妇xxxxx性 | 久久97精品久久久久久久不卡 | 国产精品怡红院永久免费 | 男女性色大片免费网站 | 国产精品国产自线拍免费软件 | 亚洲国产成人av在线观看 | 无遮挡国产高潮视频免费观看 | 国产精品无码成人午夜电影 | 水蜜桃亚洲一二三四在线 | 国产精品亚洲一区二区三区喷水 | 无码av岛国片在线播放 | 欧美一区二区三区视频在线观看 | 亚洲精品无码人妻无码 | 又色又爽又黄的美女裸体网站 | 国产精品久久精品三级 | 亚洲综合无码一区二区三区 | 久久精品中文闷骚内射 | 黑人粗大猛烈进出高潮视频 | 荫蒂被男人添的好舒服爽免费视频 | 99久久久国产精品无码免费 | 国产免费久久精品国产传媒 | 国产欧美精品一区二区三区 | www国产亚洲精品久久网站 | 纯爱无遮挡h肉动漫在线播放 | 一个人看的www免费视频在线观看 | 网友自拍区视频精品 | 欧美精品无码一区二区三区 | 午夜精品久久久内射近拍高清 | av无码久久久久不卡免费网站 | 亚洲大尺度无码无码专区 | 久久综合久久自在自线精品自 | 日韩av无码一区二区三区不卡 | 噜噜噜亚洲色成人网站 | 99久久久无码国产aaa精品 | 色欲人妻aaaaaaa无码 | 欧美 丝袜 自拍 制服 另类 | 国产成人一区二区三区别 | 国内综合精品午夜久久资源 | 欧美日韩一区二区三区自拍 | 无套内谢老熟女 | 国产免费观看黄av片 | 亚洲熟熟妇xxxx | 中文字幕 亚洲精品 第1页 | 亚洲综合无码久久精品综合 | 欧美xxxxx精品 | 国产美女极度色诱视频www | 欧美人与禽猛交狂配 | 无码一区二区三区在线观看 | 成人精品天堂一区二区三区 | 51国偷自产一区二区三区 | 欧美日韩人成综合在线播放 | 中文无码精品a∨在线观看不卡 | 鲁鲁鲁爽爽爽在线视频观看 | 国产精品久久久久久久9999 | 日欧一片内射va在线影院 | 久久精品国产99精品亚洲 | 欧美老妇与禽交 | 国产另类ts人妖一区二区 | 中文字幕乱码中文乱码51精品 | 自拍偷自拍亚洲精品被多人伦好爽 | 一本久久伊人热热精品中文字幕 | 老子影院午夜伦不卡 | 亚洲精品国产精品乱码不卡 | 国产精品久久久久影院嫩草 | 国产精品内射视频免费 | 国产香蕉尹人综合在线观看 | 色综合久久88色综合天天 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲欧美精品伊人久久 | 熟妇人妻无码xxx视频 | 丝袜 中出 制服 人妻 美腿 | 少妇的肉体aa片免费 | 亚洲va中文字幕无码久久不卡 | 日本爽爽爽爽爽爽在线观看免 | 少妇人妻大乳在线视频 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 欧洲极品少妇 | 无码乱肉视频免费大全合集 | 荡女精品导航 | 在线播放无码字幕亚洲 | 欧美国产日韩亚洲中文 | 亚洲综合无码久久精品综合 | 精品少妇爆乳无码av无码专区 | 成人精品天堂一区二区三区 | 欧美喷潮久久久xxxxx | 亚洲高清偷拍一区二区三区 | 欧美黑人性暴力猛交喷水 | 久久久www成人免费毛片 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲人成人无码网www国产 | 久久综合给合久久狠狠狠97色 | 一本大道久久东京热无码av | 亚洲国产欧美国产综合一区 | 国产精品亚洲专区无码不卡 | 国产激情一区二区三区 | 国产人妻精品一区二区三区不卡 | 国产精品国产三级国产专播 | 露脸叫床粗话东北少妇 | 成熟女人特级毛片www免费 | 色噜噜亚洲男人的天堂 | 午夜成人1000部免费视频 | 无码av免费一区二区三区试看 | 极品尤物被啪到呻吟喷水 | 波多野结衣乳巨码无在线观看 | 国产精品久久国产精品99 | 欧美老妇交乱视频在线观看 | 国产欧美熟妇另类久久久 | 亚洲中文字幕无码中字 | 特大黑人娇小亚洲女 | 亚洲精品国产a久久久久久 | 国产精品亚洲综合色区韩国 | 一本久道久久综合婷婷五月 | 国产精品欧美成人 | 成人aaa片一区国产精品 | 狠狠亚洲超碰狼人久久 | 精品久久久久久人妻无码中文字幕 | 久久综合狠狠综合久久综合88 | 国产无遮挡又黄又爽又色 | 国产激情无码一区二区app | 内射老妇bbwx0c0ck | 国产人妻人伦精品1国产丝袜 | 天天拍夜夜添久久精品 | 在线播放免费人成毛片乱码 | 亚洲精品欧美二区三区中文字幕 | 欧美精品在线观看 | 亚洲精品一区三区三区在线观看 | 亚洲成av人综合在线观看 | 丁香啪啪综合成人亚洲 | 爱做久久久久久 | 国内精品久久久久久中文字幕 | 精品 日韩 国产 欧美 视频 | 人人爽人人爽人人片av亚洲 | 最近中文2019字幕第二页 | 国产精品久久久久久无码 | 一本久久伊人热热精品中文字幕 | 国产欧美亚洲精品a | 一本久久伊人热热精品中文字幕 | 纯爱无遮挡h肉动漫在线播放 | 成人精品视频一区二区三区尤物 | 亚洲aⅴ无码成人网站国产app | 国产偷自视频区视频 | 国产亚洲精品久久久久久久久动漫 | 亚洲精品一区二区三区在线观看 | 国产激情精品一区二区三区 | 国产精品久久久av久久久 | 鲁大师影院在线观看 | 久久综合久久自在自线精品自 | 欧美丰满少妇xxxx性 | 一本一道久久综合久久 | 欧美日韩在线亚洲综合国产人 | 人妻少妇精品久久 | 国产另类ts人妖一区二区 | 白嫩日本少妇做爰 | 我要看www免费看插插视频 | 亚洲精品美女久久久久久久 | 荫蒂添的好舒服视频囗交 | 国产精品久久精品三级 | 性欧美疯狂xxxxbbbb | 久久人妻内射无码一区三区 | 亚洲中文字幕va福利 | 美女黄网站人色视频免费国产 | 一本久久a久久精品vr综合 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲天堂2017无码 | 免费无码av一区二区 | 国产精品内射视频免费 | 麻豆av传媒蜜桃天美传媒 | 精品日本一区二区三区在线观看 | 亚洲精品一区二区三区在线 | 成年美女黄网站色大免费全看 | 久久99精品久久久久婷婷 | 激情综合激情五月俺也去 | 亚洲国产午夜精品理论片 | 强伦人妻一区二区三区视频18 | 少妇久久久久久人妻无码 | 色综合久久久无码中文字幕 | 亚洲小说图区综合在线 | 精品欧美一区二区三区久久久 | 国产人妻精品午夜福利免费 | 天天躁夜夜躁狠狠是什么心态 | 熟女少妇在线视频播放 | 国产做国产爱免费视频 | 曰本女人与公拘交酡免费视频 | 久久精品成人欧美大片 | 窝窝午夜理论片影院 | 亚洲色在线无码国产精品不卡 | 精品国产成人一区二区三区 | 亚洲国产综合无码一区 | 精品国产一区二区三区av 性色 | 亚洲区小说区激情区图片区 | 国产亚洲美女精品久久久2020 | 天堂亚洲免费视频 | 久久人人爽人人人人片 | 无码人中文字幕 | 人妻无码αv中文字幕久久琪琪布 | 国产无遮挡又黄又爽免费视频 | 成人无码视频免费播放 | 无码av最新清无码专区吞精 | 国产精品免费大片 | 国产精品第一区揄拍无码 | 亚洲一区二区观看播放 | 亚洲精品国产品国语在线观看 | 亚洲一区av无码专区在线观看 | 国产无套粉嫩白浆在线 | 国产激情综合五月久久 | 国产艳妇av在线观看果冻传媒 | 男人的天堂2018无码 | 嫩b人妻精品一区二区三区 | 亚洲国产精品一区二区第一页 | 久久久久人妻一区精品色欧美 | 高潮毛片无遮挡高清免费视频 | 国产小呦泬泬99精品 | 亚洲国产日韩a在线播放 | 色综合久久中文娱乐网 | 性史性农村dvd毛片 | 亚洲中文字幕乱码av波多ji | 国产亚av手机在线观看 | 国产精品美女久久久网av | 精品国产一区av天美传媒 | 性开放的女人aaa片 | 在线观看免费人成视频 | 人人爽人人爽人人片av亚洲 | 少妇性荡欲午夜性开放视频剧场 | 福利一区二区三区视频在线观看 | 成人欧美一区二区三区 | 国产国语老龄妇女a片 | 狂野欧美性猛交免费视频 | 丰满少妇熟乱xxxxx视频 | 在教室伦流澡到高潮hnp视频 | 国内精品人妻无码久久久影院蜜桃 | 欧美日韩综合一区二区三区 | 国产精品久久久久久亚洲毛片 | 亚洲色大成网站www国产 | 国产人妻人伦精品1国产丝袜 | 人人超人人超碰超国产 | 亚洲男女内射在线播放 | 玩弄中年熟妇正在播放 | 欧洲熟妇色 欧美 | 国产莉萝无码av在线播放 | 亚洲精品美女久久久久久久 | 免费人成在线视频无码 | 丝袜美腿亚洲一区二区 | 日本精品高清一区二区 | 成人欧美一区二区三区黑人免费 | 亚洲欧美综合区丁香五月小说 | 天天爽夜夜爽夜夜爽 | 国产97人人超碰caoprom | 狠狠躁日日躁夜夜躁2020 | 在线欧美精品一区二区三区 | 久热国产vs视频在线观看 | 成人无码精品1区2区3区免费看 | 奇米影视7777久久精品人人爽 | 欧美日韩视频无码一区二区三 | 正在播放东北夫妻内射 | 午夜丰满少妇性开放视频 | 久青草影院在线观看国产 | 熟妇女人妻丰满少妇中文字幕 | 麻豆国产丝袜白领秘书在线观看 | 蜜桃av抽搐高潮一区二区 | 熟妇人妻激情偷爽文 | 午夜精品久久久内射近拍高清 | 日韩成人一区二区三区在线观看 | 在线亚洲高清揄拍自拍一品区 | 97久久国产亚洲精品超碰热 | 国产精品亚洲综合色区韩国 | 国产乱码精品一品二品 | www成人国产高清内射 | 国内少妇偷人精品视频免费 | 好屌草这里只有精品 | 精品成在人线av无码免费看 | 成人无码影片精品久久久 | 无码精品人妻一区二区三区av | 亚洲日韩av一区二区三区中文 | 国产97色在线 | 免 | 国产精品va在线观看无码 | 中文毛片无遮挡高清免费 | 女人被男人躁得好爽免费视频 | 日韩av无码一区二区三区 | 纯爱无遮挡h肉动漫在线播放 | 18禁黄网站男男禁片免费观看 | 国产亚洲精品久久久久久久久动漫 | 无码国产乱人伦偷精品视频 | 丝袜美腿亚洲一区二区 | 丰满人妻被黑人猛烈进入 | 国产精品人人妻人人爽 | 国产香蕉尹人视频在线 | 在线天堂新版最新版在线8 | 在线精品国产一区二区三区 | 人人妻人人澡人人爽欧美一区 | 无码播放一区二区三区 | 国产在线无码精品电影网 | 99久久婷婷国产综合精品青草免费 | 国产激情一区二区三区 | 久久久久久亚洲精品a片成人 | 亚洲精品国产a久久久久久 | 夜夜夜高潮夜夜爽夜夜爰爰 | 伊人久久大香线蕉av一区二区 | 激情五月综合色婷婷一区二区 | 中文字幕无码人妻少妇免费 | 欧美午夜特黄aaaaaa片 | 精品国产成人一区二区三区 | 四十如虎的丰满熟妇啪啪 | 77777熟女视频在线观看 а天堂中文在线官网 | 人妻无码αv中文字幕久久琪琪布 | 人人妻人人澡人人爽欧美精品 | 人人澡人摸人人添 | 少妇无码av无码专区在线观看 | 精品无人区无码乱码毛片国产 | 国产黄在线观看免费观看不卡 | 免费网站看v片在线18禁无码 | 人妻无码αv中文字幕久久琪琪布 | 亚洲 高清 成人 动漫 | 久久人人爽人人人人片 | 67194成是人免费无码 | 亚洲熟妇色xxxxx亚洲 | 国产精品亚洲lv粉色 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲一区二区三区无码久久 | 久久人妻内射无码一区三区 | 成人免费视频视频在线观看 免费 | 国产精品a成v人在线播放 | 国产猛烈高潮尖叫视频免费 | 天天综合网天天综合色 | 人妻互换免费中文字幕 | 人妻无码αv中文字幕久久琪琪布 | 亚洲中文字幕无码一久久区 | 一个人看的视频www在线 | 欧美刺激性大交 | 对白脏话肉麻粗话av | 天堂在线观看www | 亚洲中文字幕久久无码 | 国产av无码专区亚洲a∨毛片 | 18精品久久久无码午夜福利 | 无遮挡啪啪摇乳动态图 | 亚洲国产欧美在线成人 | 天天拍夜夜添久久精品大 | 少妇一晚三次一区二区三区 | 精品无码一区二区三区的天堂 | 久久久久久亚洲精品a片成人 | 日韩精品久久久肉伦网站 | 影音先锋中文字幕无码 | 日本一区二区三区免费播放 | 日本丰满护士爆乳xxxx | 青草青草久热国产精品 | 桃花色综合影院 | 欧美亚洲国产一区二区三区 | 国产乱人伦av在线无码 | 亚洲第一无码av无码专区 | 亚洲欧美日韩国产精品一区二区 | 久久精品国产大片免费观看 | 装睡被陌生人摸出水好爽 | 亚洲男女内射在线播放 | 任你躁国产自任一区二区三区 | 国产无遮挡又黄又爽又色 | 久久综合色之久久综合 | 欧美 日韩 人妻 高清 中文 | 久久五月精品中文字幕 | 搡女人真爽免费视频大全 | 人妻尝试又大又粗久久 | 国产精品对白交换视频 | 久久人妻内射无码一区三区 | 日本护士xxxxhd少妇 | 久在线观看福利视频 | 久久99热只有频精品8 | 亚欧洲精品在线视频免费观看 | 国产猛烈高潮尖叫视频免费 | 中文字幕无码av波多野吉衣 | 大地资源中文第3页 | 午夜福利试看120秒体验区 | 国产在热线精品视频 | 乱码av麻豆丝袜熟女系列 | 欧美日韩久久久精品a片 | 人妻中文无码久热丝袜 | 国产后入清纯学生妹 | 樱花草在线社区www | 东京无码熟妇人妻av在线网址 | 99久久人妻精品免费二区 | 大色综合色综合网站 | 乱码午夜-极国产极内射 | 四虎国产精品一区二区 | 色婷婷综合中文久久一本 | 夜精品a片一区二区三区无码白浆 | 狠狠色噜噜狠狠狠狠7777米奇 | 色五月五月丁香亚洲综合网 | 98国产精品综合一区二区三区 | 色婷婷综合激情综在线播放 | 日韩精品成人一区二区三区 | 狠狠综合久久久久综合网 | 日日噜噜噜噜夜夜爽亚洲精品 | 综合网日日天干夜夜久久 | 亚洲中文字幕在线观看 | 亚洲精品国偷拍自产在线麻豆 | 国产精品久久久一区二区三区 | 国内揄拍国内精品人妻 | 牲欲强的熟妇农村老妇女视频 | 国产亚洲精品久久久ai换 | 国产美女精品一区二区三区 | ass日本丰满熟妇pics | 无码精品国产va在线观看dvd | 亚洲熟妇自偷自拍另类 | 久久午夜无码鲁丝片午夜精品 | a在线亚洲男人的天堂 | 亚洲中文字幕在线无码一区二区 | 久久久成人毛片无码 | 美女张开腿让人桶 | 女人和拘做爰正片视频 | 在线播放亚洲第一字幕 | 国产精品久久久av久久久 | 亚洲一区二区三区偷拍女厕 | 少妇被黑人到高潮喷出白浆 | 国模大胆一区二区三区 | 亚洲国精产品一二二线 | 日韩欧美群交p片內射中文 | 国产乱人偷精品人妻a片 | 性做久久久久久久免费看 | 黄网在线观看免费网站 | 久久久精品人妻久久影视 | 国产av一区二区精品久久凹凸 | 特大黑人娇小亚洲女 | 国产激情精品一区二区三区 | 青青久在线视频免费观看 | 天堂在线观看www | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 精品欧洲av无码一区二区三区 | 亚洲国精产品一二二线 | 乱人伦中文视频在线观看 | 亚洲日韩av一区二区三区四区 | 国产成人无码区免费内射一片色欲 | 色婷婷久久一区二区三区麻豆 | 狠狠cao日日穞夜夜穞av | 永久免费观看国产裸体美女 | 久久久中文久久久无码 | 无遮挡啪啪摇乳动态图 | 国产精品人人妻人人爽 | 无码人妻丰满熟妇区五十路百度 | 丰腴饱满的极品熟妇 | 久久综合狠狠综合久久综合88 | 精品久久久久久人妻无码中文字幕 | 国产又粗又硬又大爽黄老大爷视 | 精品偷拍一区二区三区在线看 | 国产精品成人av在线观看 | 日日躁夜夜躁狠狠躁 | 国产精品va在线播放 | 国产精品久久久久久久9999 | 麻豆果冻传媒2021精品传媒一区下载 | 无码福利日韩神码福利片 | 国产人妻人伦精品1国产丝袜 | 76少妇精品导航 | 免费国产黄网站在线观看 | 中文字幕日韩精品一区二区三区 | 波多野结衣aⅴ在线 | 国产又爽又黄又刺激的视频 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 沈阳熟女露脸对白视频 | 久久综合狠狠综合久久综合88 | 色一情一乱一伦一区二区三欧美 | 欧美丰满老熟妇xxxxx性 | 国产乱子伦视频在线播放 | 日本精品人妻无码77777 天堂一区人妻无码 | 澳门永久av免费网站 | 亚洲人成无码网www | 免费网站看v片在线18禁无码 | 亚洲精品一区国产 | 在线观看国产午夜福利片 | 综合网日日天干夜夜久久 | 久久精品人妻少妇一区二区三区 | 中文字幕乱妇无码av在线 | 久久无码中文字幕免费影院蜜桃 | 成熟女人特级毛片www免费 | 国产av一区二区三区最新精品 | 无人区乱码一区二区三区 | 中文字幕无码日韩专区 | 精品少妇爆乳无码av无码专区 | 中文精品无码中文字幕无码专区 | 亚洲の无码国产の无码影院 | 丰满人妻精品国产99aⅴ | 精品乱码久久久久久久 | 妺妺窝人体色www在线小说 | 日日鲁鲁鲁夜夜爽爽狠狠 | 永久免费观看美女裸体的网站 | 99re在线播放 | 偷窥村妇洗澡毛毛多 | 中文字幕乱码亚洲无线三区 | av人摸人人人澡人人超碰下载 | 精品久久久久久人妻无码中文字幕 | 无码国产激情在线观看 | 色一情一乱一伦一视频免费看 | 欧美自拍另类欧美综合图片区 | 欧美第一黄网免费网站 | 国产精品高潮呻吟av久久4虎 | 国产成人一区二区三区别 | 又大又硬又黄的免费视频 | 无码人妻精品一区二区三区下载 | 99er热精品视频 | 激情内射日本一区二区三区 | 亚洲精品鲁一鲁一区二区三区 | 人人爽人人澡人人高潮 | a国产一区二区免费入口 | 国产农村乱对白刺激视频 | 国产无套内射久久久国产 | 少妇人妻av毛片在线看 | 日韩视频 中文字幕 视频一区 | 国产精品久久久久久亚洲影视内衣 | 性欧美videos高清精品 | 久久综合给合久久狠狠狠97色 | 性欧美疯狂xxxxbbbb | 荫蒂被男人添的好舒服爽免费视频 | 人妻体内射精一区二区三四 | 国产人妻精品午夜福利免费 | 亚洲国精产品一二二线 | 秋霞特色aa大片 | 欧美丰满熟妇xxxx | 亚洲日韩乱码中文无码蜜桃臀网站 | 男人的天堂av网站 | 男女性色大片免费网站 | 久久99精品久久久久婷婷 | 色一情一乱一伦一区二区三欧美 | aⅴ在线视频男人的天堂 | 大肉大捧一进一出好爽视频 | 亚洲精品午夜国产va久久成人 | 对白脏话肉麻粗话av | 女高中生第一次破苞av | 日本www一道久久久免费榴莲 | 国产精品久久久久久无码 | 亚洲欧洲中文日韩av乱码 | 中文字幕av伊人av无码av | 国产特级毛片aaaaaa高潮流水 | 国内老熟妇对白xxxxhd | 亚洲综合久久一区二区 | 狠狠躁日日躁夜夜躁2020 | 久久午夜无码鲁丝片秋霞 | 久久精品一区二区三区四区 | 亚洲精品久久久久久久久久久 | 色情久久久av熟女人妻网站 | 欧美丰满少妇xxxx性 | 人妻aⅴ无码一区二区三区 | 国产午夜无码视频在线观看 | 国产一区二区三区影院 | 国产精品久久国产精品99 | 亚洲一区二区观看播放 | 国内丰满熟女出轨videos | 日本在线高清不卡免费播放 | 久久久久久久久蜜桃 | 亚洲色偷偷偷综合网 | 亚洲va中文字幕无码久久不卡 | 色综合久久88色综合天天 | 国产精品美女久久久久av爽李琼 | 欧美怡红院免费全部视频 | 精品成在人线av无码免费看 | 欧洲欧美人成视频在线 | 乱码午夜-极国产极内射 | 日韩av无码中文无码电影 | a片免费视频在线观看 | 国产成人无码av片在线观看不卡 | 午夜熟女插插xx免费视频 | 国产精品视频免费播放 | 天天摸天天碰天天添 | 欧美 日韩 人妻 高清 中文 | 初尝人妻少妇中文字幕 | 久久天天躁狠狠躁夜夜免费观看 | 久久精品女人天堂av免费观看 | 亚洲精品中文字幕久久久久 | 亚洲国产成人av在线观看 | 亚洲色欲色欲天天天www | 牲欲强的熟妇农村老妇女 | 亚欧洲精品在线视频免费观看 | 激情国产av做激情国产爱 | 久久久无码中文字幕久... | 国产真人无遮挡作爱免费视频 | 亚洲大尺度无码无码专区 | 国产午夜福利100集发布 | 亚洲中文字幕在线观看 | 国产精品无码久久av | 日本一卡2卡3卡四卡精品网站 | 午夜理论片yy44880影院 | 成在人线av无码免观看麻豆 | 久久久久久亚洲精品a片成人 | 亚洲午夜福利在线观看 | 精品国产精品久久一区免费式 | 夜夜影院未满十八勿进 | 亚洲精品欧美二区三区中文字幕 | 亚洲精品国产a久久久久久 | 四虎影视成人永久免费观看视频 | 人妻体内射精一区二区三四 | 国产精品无码成人午夜电影 | 老司机亚洲精品影院无码 | 国产超碰人人爽人人做人人添 | 国产无遮挡吃胸膜奶免费看 | 荫蒂添的好舒服视频囗交 | 2020最新国产自产精品 | 国产亚洲精品久久久久久大师 | 久9re热视频这里只有精品 | 中文久久乱码一区二区 | 欧美精品无码一区二区三区 | 欧洲极品少妇 | 色综合久久88色综合天天 | 又大又紧又粉嫩18p少妇 | 亚洲の无码国产の无码步美 | 亚洲欧美精品aaaaaa片 | 牲欲强的熟妇农村老妇女视频 | 精品国产福利一区二区 | 亚洲国产精品久久久久久 | 2020最新国产自产精品 | 国产色精品久久人妻 | 欧美日韩色另类综合 | 欧美一区二区三区 | 伊人久久婷婷五月综合97色 | 国产精品理论片在线观看 | 免费观看激色视频网站 | 九九在线中文字幕无码 | 又大又硬又黄的免费视频 | 免费国产成人高清在线观看网站 | 久久国产劲爆∧v内射 | 国产精品美女久久久久av爽李琼 | 精品aⅴ一区二区三区 | 久久精品人人做人人综合试看 | 2020久久香蕉国产线看观看 | 中文无码成人免费视频在线观看 | 欧美人与禽猛交狂配 | 精品乱子伦一区二区三区 | 99久久久无码国产aaa精品 | 桃花色综合影院 | 亚洲精品久久久久久一区二区 | 丰满人妻被黑人猛烈进入 | 色综合久久中文娱乐网 | 日本熟妇浓毛 | 性欧美牲交xxxxx视频 | 1000部啪啪未满十八勿入下载 | 天天av天天av天天透 | 日欧一片内射va在线影院 | 欧美日韩人成综合在线播放 | 午夜理论片yy44880影院 | 性做久久久久久久免费看 | 免费网站看v片在线18禁无码 | 女高中生第一次破苞av | 色综合天天综合狠狠爱 | 精品无码国产一区二区三区av | 国产激情艳情在线看视频 | 久久伊人色av天堂九九小黄鸭 | 在线a亚洲视频播放在线观看 | 动漫av一区二区在线观看 | 最近的中文字幕在线看视频 | 黄网在线观看免费网站 | 国精产品一品二品国精品69xx | 男女猛烈xx00免费视频试看 | 精品无人区无码乱码毛片国产 | 亚洲aⅴ无码成人网站国产app | 亚洲の无码国产の无码影院 | 亚洲精品午夜国产va久久成人 | 狂野欧美激情性xxxx | 久久综合给久久狠狠97色 | 蜜臀av无码人妻精品 | 国产偷自视频区视频 | 熟妇人妻激情偷爽文 | 99国产精品白浆在线观看免费 | 亚洲日本在线电影 | 亚洲日韩av一区二区三区四区 | 亚洲国产成人a精品不卡在线 | 欧美一区二区三区视频在线观看 | 大屁股大乳丰满人妻 | 亚洲欧美综合区丁香五月小说 | av无码电影一区二区三区 | 老熟妇仑乱视频一区二区 | 精品夜夜澡人妻无码av蜜桃 | 俺去俺来也在线www色官网 | 97色伦图片97综合影院 | 国产人妻精品一区二区三区 | 久久久久久久久888 | 日日碰狠狠丁香久燥 | 亚洲自偷精品视频自拍 | 国产绳艺sm调教室论坛 | 奇米影视7777久久精品人人爽 | 美女黄网站人色视频免费国产 | 亚洲精品一区国产 | 女高中生第一次破苞av | 国产精品亚洲а∨无码播放麻豆 | 亚洲成色在线综合网站 | 免费视频欧美无人区码 | 国产精品亚洲lv粉色 | 国产人妻人伦精品 | 亚洲男女内射在线播放 | 国产特级毛片aaaaaaa高清 | 四虎影视成人永久免费观看视频 | 免费人成在线观看网站 | 扒开双腿疯狂进出爽爽爽视频 | 日韩视频 中文字幕 视频一区 | 婷婷六月久久综合丁香 | а√资源新版在线天堂 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 色窝窝无码一区二区三区色欲 | 国产精品-区区久久久狼 | 99精品国产综合久久久久五月天 | 久久aⅴ免费观看 | 亚洲s色大片在线观看 | 日本www一道久久久免费榴莲 | 东京无码熟妇人妻av在线网址 | 亚洲中文字幕在线观看 | 亚洲精品综合五月久久小说 | 亚洲a无码综合a国产av中文 | 亚洲男女内射在线播放 | 人人妻人人藻人人爽欧美一区 | 国产精品无码成人午夜电影 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 永久免费观看美女裸体的网站 | 一区二区三区乱码在线 | 欧洲 | 国产精品va在线播放 | 国产片av国语在线观看 | 国产精品爱久久久久久久 | 中文字幕人妻无码一夲道 | 久久精品成人欧美大片 | 老头边吃奶边弄进去呻吟 | 成人一区二区免费视频 | 女人高潮内射99精品 | 日韩精品a片一区二区三区妖精 | 99久久人妻精品免费一区 | 在线观看欧美一区二区三区 | 亚洲娇小与黑人巨大交 | 国产亚洲美女精品久久久2020 | 国产麻豆精品精东影业av网站 | 男女下面进入的视频免费午夜 | 无码成人精品区在线观看 | 久久国产自偷自偷免费一区调 | 久久久av男人的天堂 | 少妇人妻大乳在线视频 | 国产激情精品一区二区三区 | 精品久久久中文字幕人妻 | 图片区 小说区 区 亚洲五月 | 亚洲欧洲日本综合aⅴ在线 | 久久97精品久久久久久久不卡 | 草草网站影院白丝内射 | 婷婷五月综合激情中文字幕 | 在线а√天堂中文官网 | 久久国语露脸国产精品电影 | 国产精品va在线播放 | 欧美放荡的少妇 | 国产在线精品一区二区三区直播 | 久久午夜无码鲁丝片午夜精品 | 欧美日韩一区二区免费视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 无码吃奶揉捏奶头高潮视频 | 久久精品人人做人人综合 | 性欧美疯狂xxxxbbbb | 国产一区二区三区四区五区加勒比 | 国产午夜福利100集发布 | 99久久人妻精品免费二区 | 久久精品女人天堂av免费观看 | 国产亚洲精品久久久久久国模美 | 在线观看免费人成视频 | 妺妺窝人体色www婷婷 | 亚洲色成人中文字幕网站 | 国产69精品久久久久app下载 | 又紧又大又爽精品一区二区 | 久久久中文久久久无码 | 性啪啪chinese东北女人 | 天天拍夜夜添久久精品大 | 激情国产av做激情国产爱 | 国产精品丝袜黑色高跟鞋 | 久久午夜夜伦鲁鲁片无码免费 | 国产成人亚洲综合无码 | 国内揄拍国内精品人妻 | 一个人看的视频www在线 | 中文字幕乱妇无码av在线 | 永久免费精品精品永久-夜色 | 伊在人天堂亚洲香蕉精品区 | 午夜理论片yy44880影院 | 男人扒开女人内裤强吻桶进去 | 日韩 欧美 动漫 国产 制服 | 国产激情综合五月久久 | 日本一本二本三区免费 | 一本大道久久东京热无码av | 成年女人永久免费看片 | 少妇性l交大片欧洲热妇乱xxx | 双乳奶水饱满少妇呻吟 | 日本乱偷人妻中文字幕 | 国产在热线精品视频 | 一区二区三区乱码在线 | 欧洲 | 草草网站影院白丝内射 | 国产亚洲人成a在线v网站 | 欧美精品无码一区二区三区 | 男女猛烈xx00免费视频试看 | 久久99热只有频精品8 | 无码一区二区三区在线 | 丁香花在线影院观看在线播放 | 亚洲人成网站色7799 | 国产无套粉嫩白浆在线 | 学生妹亚洲一区二区 | а天堂中文在线官网 | 亚洲无人区午夜福利码高清完整版 | 亚洲成a人片在线观看日本 | 99久久人妻精品免费二区 | 国产极品视觉盛宴 | 亚洲va欧美va天堂v国产综合 | 精品久久久久香蕉网 | 国产极品视觉盛宴 | 久久综合九色综合97网 | a在线亚洲男人的天堂 | 中文字幕乱码亚洲无线三区 | 麻豆av传媒蜜桃天美传媒 | 亚洲日本va午夜在线电影 | 欧美国产日韩亚洲中文 | 人妻少妇精品久久 | 亚洲欧美国产精品久久 | 少妇厨房愉情理9仑片视频 | 久久久久成人精品免费播放动漫 | 人妻无码αv中文字幕久久琪琪布 | 牲交欧美兽交欧美 | 天下第一社区视频www日本 | 扒开双腿吃奶呻吟做受视频 | 国产在线精品一区二区三区直播 | 国产熟妇另类久久久久 | 无码午夜成人1000部免费视频 | 久久国产精品精品国产色婷婷 | 人人澡人人妻人人爽人人蜜桃 | 国精产品一品二品国精品69xx | 国精产品一品二品国精品69xx | 国产成人亚洲综合无码 | 丰满肥臀大屁股熟妇激情视频 | 亚洲日本一区二区三区在线 | 漂亮人妻洗澡被公强 日日躁 | 日本护士xxxxhd少妇 | aⅴ亚洲 日韩 色 图网站 播放 | 玩弄少妇高潮ⅹxxxyw | 人人妻人人澡人人爽欧美一区九九 | 日本护士xxxxhd少妇 | 东北女人啪啪对白 | 国内精品人妻无码久久久影院 | 国产网红无码精品视频 | 成人免费视频视频在线观看 免费 | 小泽玛莉亚一区二区视频在线 | 日本熟妇人妻xxxxx人hd | 老头边吃奶边弄进去呻吟 | 精品久久久无码人妻字幂 | 无人区乱码一区二区三区 | 国产色在线 | 国产 | 国产亚洲精品久久久久久 | 欧美日韩亚洲国产精品 | 人妻人人添人妻人人爱 | 成年美女黄网站色大免费视频 | 一本无码人妻在中文字幕免费 | 亚洲欧美色中文字幕在线 | 国产精品无码mv在线观看 | 亚洲国产精品美女久久久久 | 精品无码一区二区三区的天堂 | 激情爆乳一区二区三区 | 成熟女人特级毛片www免费 | 久久婷婷五月综合色国产香蕉 | 红桃av一区二区三区在线无码av | 性欧美疯狂xxxxbbbb | 国产欧美亚洲精品a | 国内揄拍国内精品少妇国语 | 最新国产麻豆aⅴ精品无码 | 成人女人看片免费视频放人 | 任你躁在线精品免费 | 98国产精品综合一区二区三区 | 天天躁夜夜躁狠狠是什么心态 | 亚洲国产精品毛片av不卡在线 | 3d动漫精品啪啪一区二区中 | 精品日本一区二区三区在线观看 | 又黄又爽又色的视频 | 国产综合在线观看 | 欧美性猛交xxxx富婆 | 永久免费观看国产裸体美女 | 中文字幕久久久久人妻 | 精品厕所偷拍各类美女tp嘘嘘 | 精品国产福利一区二区 | 丁香花在线影院观看在线播放 | 欧洲熟妇色 欧美 | 亚洲人成网站免费播放 | 国产精品永久免费视频 | 乱人伦中文视频在线观看 | 欧美日韩综合一区二区三区 | av在线亚洲欧洲日产一区二区 | 久久精品人人做人人综合 | 亚洲无人区午夜福利码高清完整版 | 女人高潮内射99精品 | 1000部夫妻午夜免费 | 在线а√天堂中文官网 | 国产精品无码成人午夜电影 | 中文字幕乱码人妻无码久久 | 久久久婷婷五月亚洲97号色 | 日本xxxx色视频在线观看免费 | 爆乳一区二区三区无码 | 免费观看的无遮挡av | 中文字幕乱码人妻二区三区 | 任你躁在线精品免费 | 久久久久亚洲精品男人的天堂 | 成人aaa片一区国产精品 | 精品久久久无码中文字幕 | 76少妇精品导航 | 97久久精品无码一区二区 | 国产综合久久久久鬼色 | 欧美三级a做爰在线观看 | 日本一区二区三区免费播放 | 国产高清av在线播放 | 免费观看激色视频网站 | 久久国产精品萌白酱免费 | 人妻少妇精品无码专区二区 | 天天爽夜夜爽夜夜爽 | 玩弄人妻少妇500系列视频 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 亚洲色大成网站www国产 | 国产9 9在线 | 中文 | 久久久精品成人免费观看 | 精品熟女少妇av免费观看 | 亚洲七七久久桃花影院 | 久久综合久久自在自线精品自 | 国产精品鲁鲁鲁 | 无码人妻av免费一区二区三区 | 亚洲第一网站男人都懂 | 国产精品视频免费播放 | 久久天天躁狠狠躁夜夜免费观看 | 黑人粗大猛烈进出高潮视频 | 天天综合网天天综合色 | 97无码免费人妻超级碰碰夜夜 | 欧美日韩一区二区三区自拍 | 99久久久国产精品无码免费 | 草草网站影院白丝内射 | 精品无码国产一区二区三区av | √天堂中文官网8在线 | 国产成人综合美国十次 | 99国产精品白浆在线观看免费 | 宝宝好涨水快流出来免费视频 | 色情久久久av熟女人妻网站 | 欧美 丝袜 自拍 制服 另类 | 色一情一乱一伦一视频免费看 | 日韩亚洲欧美中文高清在线 | 无码人妻丰满熟妇区五十路百度 | 国精产品一区二区三区 | 色综合久久中文娱乐网 | 在教室伦流澡到高潮hnp视频 | 久久久久久国产精品无码下载 | 俺去俺来也在线www色官网 | 久久无码人妻影院 | 日本爽爽爽爽爽爽在线观看免 | 中文字幕人妻无码一区二区三区 | 伊人久久大香线蕉亚洲 | 国产免费观看黄av片 | 日本熟妇乱子伦xxxx | 国产乱人无码伦av在线a | 午夜精品一区二区三区的区别 | 野外少妇愉情中文字幕 | 最近免费中文字幕中文高清百度 | 人妻少妇精品视频专区 | 少妇高潮喷潮久久久影院 | 久久综合给合久久狠狠狠97色 | 午夜时刻免费入口 | 欧美成人午夜精品久久久 | 欧美性猛交xxxx富婆 | 免费乱码人妻系列无码专区 | 久久人人97超碰a片精品 | 国产成人无码区免费内射一片色欲 | 日本大乳高潮视频在线观看 | 久久人人爽人人爽人人片av高清 | 久久国产精品_国产精品 | 久久久久久亚洲精品a片成人 | 最新国产乱人伦偷精品免费网站 | 成 人 网 站国产免费观看 | 日本高清一区免费中文视频 | 狠狠色丁香久久婷婷综合五月 | 中国女人内谢69xxxxxa片 | 牲交欧美兽交欧美 | 久久久久亚洲精品中文字幕 | 亚洲精品无码国产 | 18禁止看的免费污网站 | 亚洲色无码一区二区三区 | 色综合久久中文娱乐网 | 麻豆国产人妻欲求不满谁演的 | 国产明星裸体无码xxxx视频 | 欧美国产亚洲日韩在线二区 | 久久久久99精品国产片 | 国内精品九九久久久精品 | 成人免费视频视频在线观看 免费 | 国产黄在线观看免费观看不卡 | 亚洲精品久久久久中文第一幕 | 中文字幕av伊人av无码av | 一本无码人妻在中文字幕免费 | 欧美丰满熟妇xxxx | 1000部啪啪未满十八勿入下载 | 欧美黑人性暴力猛交喷水 | 久久久久国色av免费观看性色 | 中文字幕av日韩精品一区二区 | 中文字幕无码热在线视频 | 女人被爽到呻吟gif动态图视看 | 樱花草在线社区www | 亚洲精品成a人在线观看 | 亚洲精品久久久久avwww潮水 | 大地资源中文第3页 | 国产乱码精品一品二品 | 成人aaa片一区国产精品 | 一本色道久久综合亚洲精品不卡 | 无码av免费一区二区三区试看 | 蜜桃视频插满18在线观看 | 国产明星裸体无码xxxx视频 | 国产sm调教视频在线观看 | 人人妻人人澡人人爽精品欧美 | 六月丁香婷婷色狠狠久久 | 国精品人妻无码一区二区三区蜜柚 | 亚洲 日韩 欧美 成人 在线观看 | 日本熟妇大屁股人妻 | 精品国偷自产在线视频 | 国产av剧情md精品麻豆 | 97久久超碰中文字幕 | 人妻少妇精品久久 | 丰腴饱满的极品熟妇 | 国产亚洲精品久久久闺蜜 | 中文字幕av日韩精品一区二区 | 亚洲狠狠色丁香婷婷综合 | 又色又爽又黄的美女裸体网站 | 亚洲一区二区三区无码久久 | 一本精品99久久精品77 | 国产成人人人97超碰超爽8 | 亚洲色www成人永久网址 | 午夜无码人妻av大片色欲 | 亚洲中文字幕无码一久久区 | 一区二区三区高清视频一 | 免费国产成人高清在线观看网站 | 性欧美牲交在线视频 | 国产亲子乱弄免费视频 | 久久精品国产亚洲精品 | 欧美人与物videos另类 | 国产sm调教视频在线观看 | 丰满人妻被黑人猛烈进入 | 成人片黄网站色大片免费观看 | 国产欧美亚洲精品a | 久久熟妇人妻午夜寂寞影院 | 成人无码影片精品久久久 | 国产综合色产在线精品 | 国产无套粉嫩白浆在线 | 国内精品人妻无码久久久影院蜜桃 | 欧美亚洲日韩国产人成在线播放 | 欧美人与牲动交xxxx | 一个人看的www免费视频在线观看 | 亚洲欧美日韩成人高清在线一区 | 午夜精品一区二区三区的区别 | 又大又硬又黄的免费视频 | 蜜桃视频韩日免费播放 | 粉嫩少妇内射浓精videos | 欧美激情综合亚洲一二区 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产精品无码一区二区桃花视频 | 国产片av国语在线观看 | 99视频精品全部免费免费观看 |