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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

6.选择器引擎

發(fā)布時(shí)間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6.选择器引擎 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

jQuery憑借選擇器風(fēng)靡全球,各大框架類庫都爭(zhēng)先開發(fā)自己的選擇,一時(shí)間內(nèi)選擇器變?yōu)榭蚣艿臉?biāo)配

早期的JQuery選擇器和我們現(xiàn)在看到的遠(yuǎn)不一樣。最初它使用混雜的xpath語法的selector。
第二代轉(zhuǎn)換為純css的自定義偽類,(比如從xpath借鑒過來的位置偽類)的sizzle,但sizzle也一直在變,因?yàn)樗倪x擇器一直存在問題,一直到JQuery1.9才搞定,并最終全面支持css3的結(jié)構(gòu)偽類。

2005 年,Ben Nolan的Behaviours.js 內(nèi)置了聞名于世的getElementBySelector,是第一個(gè)集成事件處理,css風(fēng)格的選擇器引擎與onload處理的類庫,此外,日后的霸主prototype.js頁再2005年誕生。但它勉強(qiáng)稱的上是,選擇器$與getElementByClassName在1.2出現(xiàn),事件處理在1.3,因此,Behaviour.js還風(fēng)光一時(shí)。

本章從頭至尾實(shí)驗(yàn)制造一個(gè)選擇器引擎。再次,我們先看看前人的努力:

1.瀏覽器內(nèi)置尋找元素的方法

請(qǐng)不要追問05年之前開發(fā)人員是怎么在這種缺東缺西的環(huán)境下干活的。那時(shí)瀏覽器大戰(zhàn)正酣。程序員發(fā)明navugator.userAgent檢測(cè)進(jìn)行"自保"!網(wǎng)景戰(zhàn)敗,因此有關(guān)它的記錄不多。但I(xiàn)E確實(shí)留下不少資料,比如取得元素,我們直接可以根據(jù)id取得元素自身(現(xiàn)在所有瀏覽器都支持這個(gè)特性),不通過任何API ,自動(dòng)映射全局變量,在不關(guān)注全局污染時(shí),這是個(gè)很酷的特性。又如。取得所有元素,使用document.All,取得某一種元素的,只需做下分類,如p標(biāo)簽,document.all.tags("p")。

有資料可查的是 getElementById , getElementByTagName是ie5引入的。那是1999年的事情,伴隨一個(gè)輝煌的產(chǎn)品,window98,捆綁在一起,因此,那時(shí)候ie都傾向于為IE做兼容。

(感興趣的話參見讓ie4支持getElementById的代碼,此外,還有g(shù)etElementByTagsName的實(shí)現(xiàn))

但人們很快發(fā)現(xiàn)問并無法選取題了,就是IE的getElementById是不區(qū)分表單元素的ID和name,如果一個(gè)表單元素只定義name并與我們的目標(biāo)元素同名,且我們的目標(biāo)元素在它的后面,那么就會(huì)選錯(cuò)元素,這個(gè)問題一直延續(xù)到ie7.

IE下的getElementsByTagesName也有問題。當(dāng)參數(shù)為*號(hào)通配符時(shí),它會(huì)混入注釋節(jié)點(diǎn),并無法選取Object下的元素。

(解決辦法略去)

此外,w3c還提供了一個(gè)getElementByName的方法,這個(gè)IE也有問題,它只能選取表單元素。

在Prototype.js還未到來之前,所有可用的只有原生選擇器。因此,simon willson高出getElementBySelector,讓世人眼前一亮。

之后的過程就是N個(gè)版本的getElementBySlelector,不過大多數(shù)是在simon的基礎(chǔ)上改進(jìn)的,甚至還討論將它標(biāo)準(zhǔn)化!

getElementBySlelector代表的是歷史的前進(jìn)。JQuery在此時(shí)優(yōu)點(diǎn)偏向了,prototype.js則在Ajax熱浪中扶搖直上。不過,JQuery還是勝利了,sizzle的設(shè)計(jì)很特別,各種優(yōu)化別出心裁。


Netscape借助firefox還魂,在html引入xml的xpath,其API為document.evaluate.加之很多的版本及語法復(fù)雜,因此沒有普及開來。

微軟為保住ie占有率,在ie8上加入querySelector與querySlectorAll,相當(dāng)于getElementBySelector的升級(jí)版,它還支持前所未有的偽類,狀態(tài)偽類。語言偽類和取反偽類。此時(shí),chrome參戰(zhàn),激發(fā)瀏覽器標(biāo)準(zhǔn)的熱情和升級(jí),ie8加入的選擇器大家都支持了,還支持的更加標(biāo)準(zhǔn)。此時(shí),還出現(xiàn)了一種類似選擇器的匹配器————matchSelector,它對(duì)我們編寫選擇器引擎特別有幫助,由于是版本號(hào)競(jìng)賽時(shí)誕生的,誰也不能保證自己被w3c采納,都帶有私有前綴。現(xiàn)在css方面的Selector4正在起草中,querySeletorAll也只支持到selector3部分,但其間兼容性問題已經(jīng)很雜亂了。

2.getElementsBySelector

讓我們先看一下最古老的選擇器引擎。它規(guī)定了許多選擇器發(fā)展的方向。在解讀中能涉及到很多概念,但不要緊,后面有更詳細(xì)的解釋。現(xiàn)在只是初步了解下大概藍(lán)圖。

/* document.getElementsBySelector(selector)version 0.4 simon willson march 25th 2003-- work in phonix0.5 mozilla1.3 opera7 ie6 */function getAllchildren(e){//取得一個(gè)元素的子孫,并兼容ie5return e.all ? e.all : e.getElementsByTgaName('*');}document.getElementsBySelector = function(selector){//如果不支持getElementsByTagName 則直接返回空數(shù)組if (!document.getElementsByTgaName) {return new Array();}//切割CSS選擇符,分解一個(gè)個(gè)單元格(每個(gè)單元可能代表一個(gè)或多個(gè)選擇器,比如p.aaa則由標(biāo)簽選擇器和類選擇器組成)var tokens = selector.split(' ');var currentContext = new Array(document);//從左至右檢測(cè)每個(gè)單元,換言此引擎是自頂向下選擇元素//如果集合中間為空,立即中至此循環(huán)for (var i = 0 ; i < tokens.length; i++) {//去掉兩邊的空白(并不是所有的空白都沒有用,兩個(gè)選擇器組之間的空白代表著后代迭代器,這要看作者們的各顯神通)token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');//如果包含ID選擇器,這里略顯粗糙,因?yàn)樗赡茉谝?hào)里邊。此選擇器支持到屬性選擇器,則代表著可能是屬性值的一部分。if (token.indexOf('#') > -1) {//假設(shè)這個(gè)選擇器是以tag#id或#id的形式,可能導(dǎo)致bug(但這些暫且不談,沿著作者的思路看下去)var bits =token.split('#');var tagName = bits[0];var id = bits[1];//先用id值取得元素,然后判定元素的tagName是否等于上面的tagName//此處有一個(gè)不嚴(yán)謹(jǐn)?shù)牡胤?#xff0c;element可能為null,會(huì)引發(fā)異常var element = document.getElementById(id);if(tagName && element.nodeName.toLowerCase() != tagName) {//沒有直接返回空結(jié)合集return new Array();}//置換currentContext,跳至下一個(gè)選擇器組currentContext = new Array(element);continue;}//如果包含類選擇器,這里也假設(shè)它以.class或tag.class的形式if (token.indexOf('.') > -1){var bits = token.split('.');var tagName = bits[0];var className = bits[1];if (!tagName){tagName = '*';}//從多個(gè)父節(jié)點(diǎn),取得它們的所有子孫//這里的父節(jié)點(diǎn)即包含在currentContext的元素節(jié)點(diǎn)或文檔對(duì)象var found = new Array;//這里是過濾集合,通過檢測(cè)它們的className決定去留var foundCount = 0;for (var h = 0; h < currentContext.length; h++){var elements;if(tagName == '*'){elements = getAllchildren(currentContext[h]);} else {elements = currentContext[h].getElementsByTgaName(tagName);}for (var j = 0; j < elements.length; j++) {found[foundCount++] = elements[j];}}currentContext = new Array;for (var k = 0; k < found.length; k++) {//found[k].className可能為空,因此不失為一種優(yōu)化手段,但new regExp放在//外圍更適合if (found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))){currentContext[currentContextIndex++] = found[k];}}continue;}//如果是以tag[attr(~|^$*)=val]或[attr(~|^$*)=val]的組合形式if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)){var tagName = RegExp.$1;var attrName = RegExp.$2;var attrOperator = RegExp.$3;var attrValue = RegExp.$4;if (!tagName){tagName = '*';}//這里的邏輯以上面的class部分相似,其實(shí)應(yīng)該抽取成一個(gè)獨(dú)立的函數(shù)var found = new Array;var foundCount = 0;for (var h = 0; h < currentContext.length; h++){var elements;if (tagName == '*') {elements = getAllchildren(currentContext[h]);} else {elements = currentContext[h].getElementsByTagName(tagName);}for (var j = 0; j < elements.length; j++) {found[foundCount++] = elements[j];}}currentContext = new Array;var currentContextIndex = 0;var checkFunction;//根據(jù)第二個(gè)操作符生成檢測(cè)函數(shù),后面的章節(jié)有詳細(xì)介紹 ,請(qǐng)繼續(xù)關(guān)注哈switch (attrOperator) {case '=' : //checkFunction = function(e){ return (e.getAttribute(attrName) == attrValue);};break;case '~' :checkFunction = function(e){return (e.getAttribute(attrName).match(new RegExp('\\b' +attrValue+ '\\b')));};break;case '|' :checkFunction = function(e){ return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?')));};break;case '^' : checkFunction = function(e) {return (e.getAttribute(attrName).indexOf(attrValue) == 0);};break;case '$':checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length);};break;case '*':checkFunction = function(e) {return (e.getAttribute(attrName).indexOf(attrValue) > -1 );}break;default :checkFunction = function(e) {return e.getAttribute(attrName);}; }currentContext = new Array;var currentContextIndex = 0 ;for (var k = 0; k < found.length; k++) {if (checkFunction(found[k])) {currentContext[currentContextIndex++] = found[k];}}continue;}//如果沒有 # . [ 這樣的特殊字符,我們就當(dāng)是tagNamevar tagName = token;var found = new Array;var foundCount = 0;for (var h = 0; h < currentContext.length; h++) {var elements = currentContext[h].getElementsByTgaName(tagName);for (var j = 0; j < elements.length; j++) {found[foundCount++] = elements[j];}}currentContext = found;}return currentContext; //返回最后的選集}

?顯然當(dāng)時(shí)受網(wǎng)速限制,頁面不會(huì)很大,也不可能有很復(fù)雜的交互,因此javascript還沒有到大規(guī)模使用的階段,我們看到當(dāng)時(shí)的庫頁不怎么重視全局污染,也不支持并聯(lián)選擇器,要求每個(gè)選擇器組不能超過兩個(gè),否則報(bào)錯(cuò)。換言之,它們只對(duì)下面的形式CSS表達(dá)式有效:

#aa p.bbb [ccc=ddd]

Css表達(dá)符將以空白分隔成多個(gè)選擇器組,每個(gè)選擇器不能超過兩種選取類型,并且其中之一為標(biāo)簽選擇器

要求比較嚴(yán)格,文檔也沒有說明,因此很糟糕。但對(duì)當(dāng)時(shí)編程環(huán)境來說,已經(jīng)是喜出望外了。作為早期的選擇器,它也沒有想以后那樣對(duì)結(jié)果集進(jìn)行去重,把元素逐個(gè)按照文檔出現(xiàn)的順序進(jìn)行排序,我們?cè)诘谝还?jié)指出的bug,頁沒有進(jìn)行規(guī)避,可能是受當(dāng)時(shí)javascript技術(shù)交流太少。這些都是我們要改進(jìn)的地方。

3.選擇器引擎涉及的知識(shí)點(diǎn)

本小節(jié)我們學(xué)習(xí)上小節(jié)的大力的概念,其中,有關(guān)選擇器引擎實(shí)現(xiàn)的概念大多數(shù)是從sizzle中抽取出來的,兒CSS表達(dá)符部分則是W3C提供的,首先從CSS表達(dá)符部分介紹。

h1 {color: red;font-size: 14px;}

其中,h1 為選擇符,color和font-size為屬性,red和14px為值,兩組color: red和font-size: 14px;為它們的聲明。

上面的只是理想情況,重構(gòu)成員交給我們CSS文件,里邊的選擇符可是復(fù)雜多了。選擇符混雜著大量的標(biāo)記,可以分割為更細(xì)的單元。總的來說,分為四大類十七種。此外,還包含選擇引擎無法操作偽元素

四大類:指并聯(lián)選擇器、 簡(jiǎn)單選擇器 、 關(guān)系選擇器 、 偽類

并聯(lián)選擇器:就是“,”,一種不是選擇器的選擇器,用于合并多個(gè)分組的結(jié)果

關(guān)系選擇器?分四種: 親子 后代 相鄰,通配符

偽類分為六種: 動(dòng)作偽類, 目標(biāo)偽類, 語言偽類, 狀態(tài)偽類, 結(jié)構(gòu)偽類, 取得反偽類。

簡(jiǎn)單的選擇器又稱為基本選擇器,這是在prototype.js之前的選擇器都已經(jīng)支持的選擇器類型。不過在css上,ie7才開始支持部分屬性選擇器。其中,它們?cè)O(shè)計(jì)的非常整齊劃一,我們可以通過它的一個(gè)字符決定它們的類型。比如id選擇器的第一個(gè)字符為#,類選擇器為. ,屬性選擇器為[ ,通配符選擇器為 * ;標(biāo)簽選擇器為英文字母。你可以可以解釋為什么沒有特殊符號(hào)。jQuery就是使用/isTag = !/\W/.test( part )進(jìn)行判定的。

在實(shí)現(xiàn)上,我們?cè)谶@里有很多原生的API可以使用,如getElementById. getElementsByTagName. getElementsByClassName. document.all?屬性選擇器可以用getAttribute 、 getAttributeNode attributes, hasAttribute,2003年曾經(jīng)討論引入getElementByAttribute,但沒成功,實(shí)際上,firefix上的XUI的同名就是當(dāng)時(shí)的產(chǎn)物。不過屬性選擇器的確比較復(fù)雜,歷史上他是分為兩步實(shí)現(xiàn)的。

css2.1中,屬性選擇器又以下四種狀態(tài)。

[att]:選取設(shè)置了att屬性的元素,不管設(shè)定值是什么。
[att=val]:選取了所有att屬性的值完全等于val的元素。
[att~=val]:表示一個(gè)元素?fù)碛袑傩詀tt,并且該屬性還有空格分割的一組值,其中之一為'val'。這個(gè)大家應(yīng)該能聯(lián)想到類名,如果瀏覽器不支持getElementsByClassName,在過濾階段,我們可以將.aaa轉(zhuǎn)換為[class~=aaa]來處理
[att|=val]:選取一個(gè)元素?fù)碛袑傩詀tt,并且該屬性含'val'或以'val-'開頭

Css3中,屬性選擇器又增加三種形態(tài):
[att^=val]:選取所有att屬性的值以val開頭的元素
[att$=val]:選取所有att屬性的值以val結(jié)尾的元素
[att*=val]:選取所有att屬性的值包含val字樣的元素。
以上三者,我們都可以通過indexOf輕松實(shí)現(xiàn)。

此外,大多選取器引擎,還實(shí)現(xiàn)了一種[att!=val]的自定義屬性選擇器。意思很簡(jiǎn)單,選取所有att屬性不等于val的元素,著正好與[att=val]相反。這個(gè)我們也可以通過css3的去反偽類實(shí)現(xiàn)。

我們?cè)倏纯?strong>關(guān)系選擇器。關(guān)系選擇器是不能單獨(dú)存在的,它必須在其他兩類選擇器組合使用,在CSS里,它必須夾在它們中間,但選擇器引擎可能允許放在開始。在很長(zhǎng)時(shí)間內(nèi),只存在后代選擇器(E F),就在兩個(gè)選擇器E與F之間的空白。css2.1又增加了兩個(gè),親子選擇器(E > F)相鄰選取(E + F),它們也夾在兩個(gè)簡(jiǎn)單選擇器之間,但允許大于號(hào)或加號(hào)兩邊存在空白,這時(shí),空白就不是表示后代選擇器。CSS3又增加了一個(gè),兄長(zhǎng)選擇器(E ~ F),規(guī)則同上。CSS4又增加了一個(gè)父親選取器,不過其規(guī)則一直在變化。

后代選擇器:通常我們?cè)谝鎯?nèi)構(gòu)建一個(gè)getAll的函數(shù),要求傳入一個(gè)文檔對(duì)象或元素節(jié)點(diǎn)取得其子孫。這里要特別注意IE下的document.all,getElementByTagName ?的("*")混入注釋節(jié)點(diǎn)的問題。

親子選擇器:這個(gè)我們?nèi)绻淮蛩慵嫒軽ML,直接使用children就行。不過在IE5-8它都會(huì)混入注釋節(jié)點(diǎn)。下面是兼容列情況。

chrome :1+ ? firefox:3.5+ ? ie:5+ ?opera: 10+ ?safari: 4+ ?

function getChildren(el) {if (el.childElementCount) {return [].slice.call(el.children);}var ret = [];for (var node = el.firstChild; node; node = node.nextSibling) {node.nodeType == 1 && ret.push(node);}return ret;}

相鄰選擇器: 就是取得當(dāng)前元素向右的一個(gè)元素節(jié)點(diǎn),視情況使用nextSibling或nextElementSibling.

function getNext (el) {if ("nextElementSibling" in el) {return el.nextElementSibling}while (el = el.nextSibling) {if (el.nodeType === 1) {return el;}}return null}

兄長(zhǎng)選擇器:就是取其右邊的所有同級(jí)元素節(jié)點(diǎn)。

function getPrev(el) {if ("previousElementSibling" in el) {return el.previousElementSibling;}while (el = el.previousSibling) {if (el.nodeType === 1) {return el;}}return null;}

上面提到的childElementCount 、 nextElementSibling是08年12月通過Element Traversal規(guī)范的,用于遍歷元素節(jié)點(diǎn)。加上后來補(bǔ)充的parentElement,我們查找元素就非常方便。如下表

查找元素
?遍歷所有子節(jié)點(diǎn)遍歷所有子元素
第一個(gè)firstChildfirstElementChild
最后一個(gè)lastChildlastElementChild
前面的previousSiblingpreviousElementSibling
后面的nextSiblingnextElementSibling
父節(jié)點(diǎn)parentNodeparentElement
數(shù)量  lengthchildElementCount

偽類

偽類是選擇器家族中最龐大的家族,從css1開始,以字符串開頭,到css3時(shí)代,出現(xiàn)了要求傳參的機(jī)構(gòu)偽類和去反偽類。

(1).動(dòng)作偽類

動(dòng)作偽類又分為鏈接偽類和用戶行為偽類,其中,鏈接偽類由:visted和:link組成,用戶行為偽類分為:hover,:active, :focus組成。這這里我們基本上只能模擬:link,而在瀏覽器的原生的querySeletorAll對(duì)它們的支持也存在差異,ie8-ie10存在取:link錯(cuò)誤,它只能取a的標(biāo)簽,實(shí)際:link指代a aera link這三種標(biāo)簽,這個(gè)其它標(biāo)簽瀏覽器都正確。另外,opera,safari外,其它瀏覽器取:focus都正常,除opera外,其它瀏覽器取得:hover都正確。剩下:active和:visted都正確。剩下的:active與visted都為零。

window.onload = function(){document.querySelector("#aaa").onclick = function() {alert(document.querySelectorAll(":focus").length) ;// =>1}document.querySelector("#bbb").onclick = function() {alert(document.querySelectorAll(":hover").length); //=> 4 //4 ,html body p a}function test() {alert(document.querySelectorAll(":link").length);//=> 3} }

偽類沒有專門的api得到結(jié)果集合,因此,我們需要通過上一次得到的結(jié)果集就行過濾。在瀏覽器中,我們可以通過document.links得到部分結(jié)果,因此不包含link標(biāo)簽。因此,最好的方法是判定它的tagName是否等于A,LINK,AREA中的其中一個(gè)。

(2).目標(biāo)偽類

目標(biāo)偽類即:target偽類,指其id或者name屬性與url的hash部分(#之后的部分),匹配上的元素。
假如一個(gè)文檔,其id為section_2,而url中的hash部分也是#section_2,那么它就是我們要取的元素。

Sizzle中過濾的函數(shù)如下:

"target": function(elem) {var hash = window.location && window.location.hash;return hash && hash.slice(1) === elem.id;}

(3).語言偽類

語言偽類即:length偽類,用來設(shè)置使用特殊語言的內(nèi)容樣式,如:lang(de)的內(nèi)部應(yīng)該為德語,需要特殊處理。

注意:lang 雖然為DOM元素的一個(gè)屬性,但:lang偽類與屬性選擇器有所不同,具體表現(xiàn):lang偽類具有“繼承性”,如下面的html表示的文檔

<html> <head> </head> <body lang="de"> <p>一個(gè)段落</p> </body> </html>

如果使用[lang=de]則只能選擇到body元素,因?yàn)閜元素沒有l(wèi)ang屬性,但是使用:lang(de)則可以同時(shí)選擇到body和p元素,表現(xiàn)出繼承性。

"lang": markFunction(function(lang) {//lang value must be a valid iddentifiderif (!ridentifier,test(lang || "") + lang);}lang = lang.replace(runescape, funescape).toLowerCase();return function(elem) {var ememLang;do {if ((ememLang = documentIsXML ? elem.getAttribute("xml:lang") || elem.getAttribute("lang"):elem.lang)){elemLang = elemLang.toLowerCase();return elemLang === lang || elemLang.indexOf(lang + "-") === 0;}} while ((elem = elem.parentNode) && elem.nodeType === 1);return false;}}),

(4).狀態(tài)偽類

狀態(tài)偽類用于標(biāo)記一個(gè)UI元素的當(dāng)前狀態(tài),有:checked , :enabled , :disable 和 :indeterminate這四個(gè)偽類組成。我們可以分別通過元素的checked , disabled , indeteminate屬性進(jìn)行判定

?(5).結(jié)構(gòu)偽類

它又可以分為三種根偽類子元素過濾偽類空偽類
根偽類是由它在文檔的位置判定子元素過濾偽類是根據(jù)它在其父親的所有孩子的位置或標(biāo)簽類型判定空偽類是根據(jù)它孩子的個(gè)數(shù)判定

:root偽類?用于選取根元素,在html文檔中,通常是html元素。

:nth-child?是所有子元素的過濾偽藍(lán)本,其它8種都是由它衍生出來的。它帶有參數(shù),可以是純數(shù)字,代數(shù)式或單詞,如果是數(shù)字,則從1計(jì)起,如果是代數(shù)式,n則從0遞增,非常不好理解的規(guī)則。

:nth-child(2)選取當(dāng)前父節(jié)點(diǎn)的第2個(gè)子元素

:nth-child(n+4)?選取大于等于4的的標(biāo)簽,我們可以將n看成自增量(0 <= n <= parent.children.length),此代數(shù)的值因變量。

:nth-child(-n+4)選取小于等于4標(biāo)簽

:nth-child(2n)選取偶數(shù)標(biāo)簽,2n也可以是even

:nth-child(2n-1)選取奇數(shù)標(biāo)簽,2n-1也可以是odd

:nth-child(3n+1)表示沒三個(gè)為一組,選取它的第一個(gè)

:nth-last-child與:nth-child差不多,不過是從后面取起來。比如:nth-last-child(2)

:nth-of-type和nth-last-of-type與:nth-child和nth-last-child類似,規(guī)則是將當(dāng)前元素的父節(jié)點(diǎn)的所有元素按照tagName分組,只要其參數(shù)符合它在那一組的位置就被匹配到。比如:nth-of-type(2),另外一例子,nth-of-type(even).

:frist-child用于選取第一個(gè)子元素,效果等同于:nth-child(1)

:last-child用于選取最后一個(gè)元素,效果等同于:nth-last-child(1)

:only-child用于選擇唯一的子元素,當(dāng)子元素的個(gè)數(shù)超過1時(shí),選擇器失效。

:only-of-type將父節(jié)點(diǎn)的元素按照tagName分組,如果某一組只有一個(gè)元素,那么就選擇這些元素返回。

:empty?用于選擇那些不包含任何元素的節(jié)點(diǎn),文本節(jié)點(diǎn),CDATA節(jié)點(diǎn)的元素,但允許里邊只存在注釋節(jié)點(diǎn)。

Sizzle中:empty的實(shí)現(xiàn)如下:

"empty": function(elem) {for (elem = elem.firstChild; elem ; elem = elem.nextSibling) {if (elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4){return false;}}return true;},

mootools中的Slick.實(shí)現(xiàn)如下。

"empty": function(node) {var child = node.firstChild;return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length;},

(6).去反偽類

去反偽類即:not偽類,其參數(shù)為一個(gè)或多簡(jiǎn)單選擇器,里邊用逗號(hào)隔開。在jQuery等選擇器引擎中允許你傳入其它類型的選擇器,甚至可以進(jìn)行多個(gè)去反偽類嵌套。

(7).引擎實(shí)現(xiàn)時(shí)涉及的概念

種子集:或者叫候選集,如果css選擇符非常復(fù)雜,我們要分幾步才能得到我們想要的元素。那么第一次得到的元素集合就叫種子集。在Sizzle中,這樣基本從右到左,它的種子集中就有一部分為我們最后得到的元素。如果選擇器引擎是從左至右的選擇,那么它們只是我們繼續(xù)查找它的子元素或兄弟的“據(jù)點(diǎn)”而已。

結(jié)果集:選擇器引擎最終返回的元素集合們現(xiàn)在約定俗成,它要保持與querySlectorAll得到的結(jié)果一致,即,沒有重復(fù)元素。元素要按照他們?cè)贒OM樹上出現(xiàn)的順序排序。

過濾集:我們選取一組元素后,它之后每一個(gè)步驟要處理的元素集合都可以稱為過濾集。比如p.aaa,如果瀏覽器不支持querySelectorAll,若支持getElementByClassName,那么我們就用它得到種子集,然后通過className進(jìn)行過濾。顯然在大多數(shù)情況下,前者比后者快多了。同理,如果存在ID選擇器,由于ID在一個(gè)文檔中不重復(fù),因此,使用ID查找更快。在Sizzle下如果不支持QuerySlectorAll,它會(huì)只能地以ID,class,Tag順序去查找。

選擇器群組:一個(gè)選擇符被并聯(lián)選擇器","劃分成的每一個(gè)大組

選擇器組:一個(gè)選擇器群組被關(guān)系選擇器劃分為的第一個(gè)小分組。考慮到性能,每一個(gè)小分組都建議加上tagName,因此這樣在IE6方便使用documentsByTagName,比如p div.aaa 比 p.aaa快多了。前者兩次getElementsByTagName查找,最后用className過濾。后者是通過getElementsByTagName得到種子集,然后再取它們的所有子孫,明顯這樣得到的過濾集比前者數(shù)量多很多。

從實(shí)現(xiàn)上,你可以從左至右,也可以像sizzle那樣從右至左(大體上是,實(shí)際情況復(fù)雜很多)。

另外,選擇器也分為編譯型和非編譯型,編譯型是Ext發(fā)明的,這個(gè)陣營(yíng)的選擇器中有Ext,Qwrap,NWMatchers,JindoJS.非編譯型的就更多了,如Sizzle,Icarus,Slick,YUI,dojo,uupaa,peppy...

還有一些利用xpath實(shí)現(xiàn)的選擇器,最著名的是base2,它先實(shí)現(xiàn)了xpath那一套,方便IE也是有document,evaluate,然后將css選擇符翻譯成xpath。其它比較著名的有casperjs,DOMAssistant.

像sizzle mootools Icarus等還支持選擇XML元素(因?yàn)閄ML還是一種比較重要的數(shù)據(jù)傳輸格式。后端通過XHR返回我們的就可能是XML),這樣我們通過選擇器引擎抽取所需要的數(shù)據(jù)就簡(jiǎn)單多了。

4.選擇器引擎涉及的通用函數(shù)

1. isXML

最強(qiáng)大的前幾名選擇器引擎都能操作XML文檔,但XML與HTMl存在很大的差異,沒有className,getElementById,并且nodeName需要區(qū)分大小寫,在舊版IE中還不能直接給XML元素添加自定義屬性。因此,這些區(qū)分非常有必要。因此我們看一下各大引擎的實(shí)現(xiàn)吧。

Sizzle的實(shí)現(xiàn)如下。

var isXML = Sizzle.isXML = function (elem) {var documentElement = elem && (elem.ownDocument || elem).documentElement;return documentElement ? documentElement.nodeName !== "HTML" : false;};

但這樣做不嚴(yán)謹(jǐn),因?yàn)閄ML的根節(jié)點(diǎn)可能是HTML標(biāo)簽,比如這樣創(chuàng)建一個(gè)XML文檔:

try{var doc = document.implementation.createDocument(null, 'HTML', null);alert(doc.documentElement)alert(isXML(doc))} catch (e) {alert("不支持creatDocument")}

我們來看看mootools的slick的實(shí)現(xiàn)

isXML = function(document){return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') || (document.nodeType == 9 && document.documentElement.nodeName != 'HTML');};

mootools用到了大量的屬性來進(jìn)行判定,從mootools1.2到現(xiàn)在還沒什么改動(dòng),說明還是很穩(wěn)定的。我們?cè)倬?jiǎn)一下。

在標(biāo)準(zhǔn)瀏覽器里,暴露了一個(gè)創(chuàng)建HTML文檔的構(gòu)造器HTMLDocument,而IE下的XML元素又擁有selectNodes:

var isXML = window.HTMLDocument ? function(doc) {return !(doc instanceof HTMLDocument)} : function (doc) {return "selectNodes" in doc}

不過這些方法都是規(guī)范,javascript對(duì)象可以隨意添加,屬性法很容易被攻破,最好使用功能法。無論XML或HTML文檔都支持createElement方法,我們判定創(chuàng)建了元素的nodeName是否區(qū)分大小寫。

var isXML = function(doc) {return doc.createDocument("p").nodeName !== doc.createDocument("p").nodeName;}

這是目前能給出最嚴(yán)謹(jǐn)?shù)暮瘮?shù)了

2.contains

contains方法就是判定參數(shù)1是否包含參數(shù)2。這通常用于優(yōu)化。比如早期的Sizzle,對(duì)于#aaa p.class選擇符,它會(huì)優(yōu)先用getElementByClassName或getElementsByTagName取種子集,然后就不繼續(xù)往左走了,直接跑到最左的#aaa,取得#aaa元素,然后通過contains方法進(jìn)行過濾。隨著Sizzle體積進(jìn)行增大,它現(xiàn)在只剩下另一個(gè)關(guān)于ID的用法,即:如果上下文對(duì)象非文檔對(duì)象,那么它會(huì)取得其ownerDocument,這樣就可以用getElementById,然后用contains方法進(jìn)行驗(yàn)證!

//sizzle 1.10.15if (context.ownerDocument && (elem = context.ownerDocument.getElementById(m)) && contains(context, elem) && elem.id === m) {results.push(elem);return results;}

contains的實(shí)現(xiàn)。

var rnative = /^[^]+\{\s*\[native \w/,hasCompare = rnative.test( docElem.compareDocumentPosition ),contains = hasCompare || rnative.test(docElem.contains) ?function(a, b){var adown = a.nodeType === 9 ? a.documentElement : a,bup = b && b.parentNode;return a === bup || !!(bup && bup.nodeType === 1 && (adown.contains ?adown.contains(bup) :a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));} :function (a, b) {if (b) {while ((b = b.parentNode)) {if (b === a) {return true}}}return false;};

它自己做了預(yù)判定,但這時(shí)傳入xml元素節(jié)點(diǎn),可能就會(huì)出錯(cuò),因此建議改成實(shí)時(shí)判定。雖然每次都進(jìn)入都判定一次那個(gè)原生API。

mass framework的實(shí)現(xiàn)方式:

//第一個(gè)節(jié)點(diǎn)是否包含第二個(gè)節(jié)點(diǎn),same允許兩者相等if (a === b){return !!same;}if (!b.parentNode)return false;if (a.contains) {return a.contains(b);} else if (a.compareDocumentPosition) {return !!(a.compareDocumentPosition(b) & 16);}while ((b = b.parentNode))if (a === b) return true;return false;}

現(xiàn)在來解釋一下contanscompareDocumentPosition這兩個(gè)API。contains原來是IE私有的,后來其他瀏覽器也借鑒這方法。如fireFox在9.0也安裝了此方法。它是一個(gè)元素節(jié)點(diǎn)的方法,如果另一個(gè)等于或包含它的內(nèi)部,就返回true.compareDocumentPosition是DOM的level3 specification定義的方法,firefox等標(biāo)準(zhǔn)瀏覽器都支持,它等于判定兩個(gè)節(jié)點(diǎn)的關(guān)系,而不但是包含關(guān)系。這里是NodeA.compareDocumentPosition(Node.B)包含你可以得到的信息。

Bits??
0000000元素一致
0000011節(jié)點(diǎn)在不同的文檔(或者一個(gè)在文檔之外)
0000102節(jié)點(diǎn)B在節(jié)點(diǎn)A之前
0001004節(jié)點(diǎn)A在節(jié)點(diǎn)B之前
0010008節(jié)點(diǎn)B包含節(jié)點(diǎn)A
01000016節(jié)點(diǎn)A包含節(jié)點(diǎn)B
10000032瀏覽器的私有使用

有時(shí)候,兩個(gè)元素的位置關(guān)系可能連續(xù)滿足上表的兩者情況,比如A包含B,并且A在B的前面,那么compareDocumentPosition就返回20.

舊版本的IE不支持compareDocumentPosition。jQuery作者john resig寫了個(gè)兼容函數(shù),用到IE的另一個(gè)私有實(shí)現(xiàn),sourceIndex, sourceIndex會(huì)根據(jù)元素位置的從上到下,從左至右依次加1,比如HTML標(biāo)簽的sourceIndex為0,Head的標(biāo)簽為1,Body的標(biāo)簽為2,Head的第一個(gè)子元素為3.如果元素不在DOM樹,那么返回-1.

function comparePosition(a, b) {return a.compareDocumentPosition ? a.compareDocumentPosition(b) :a.contains ? (a != b && a.contains(b) && 16) +(a.sourceIndex >= 0 && b.sourceIndex >= 0 ?(a.sourceIndex < b.sourceIndex && 4) +(a.sourceIndex > b.sourceIndex && 2): 1) : 0;}

3.節(jié)點(diǎn)的排序與去重

為了讓選擇器引擎搜到的結(jié)果集盡可能接近原生的API結(jié)果(因?yàn)樵谧钚碌臑g覽器中,我們可能只使用querySlelectorAll實(shí)現(xiàn)),我們需要讓元素節(jié)點(diǎn)按它們?cè)贒OM樹出現(xiàn)的順序排序。

IE早期的版本,我們可以使用sourceIndex進(jìn)行排序。

標(biāo)準(zhǔn)的瀏覽器可以使用compareDocumentPosition.在上小節(jié)中介紹了它可以判定兩個(gè)節(jié)點(diǎn)的位置關(guān)系。我們只要將它們的結(jié)果按位于4不等于0就知道其前后順序了

var compare =comparerange.compareBoundaryPoints(how, sourceRange);

compare:返回1,0,-1(0為相等,1為compareRange在sourceRange之后,-1為compareRange在sourceRange之前)

how:比較那些邊界點(diǎn):為常數(shù)

  • Range.START_TO_START 比較兩個(gè)Range節(jié)點(diǎn)的開始點(diǎn)
  • Range.END_TO_END 比較兩個(gè)Range節(jié)點(diǎn)的結(jié)束點(diǎn)
  • Range.START_TO_END 用sourceRange的開始點(diǎn)與當(dāng)前范圍的結(jié)束點(diǎn)比較
  • Range.END_TO_START 用sourceRange的結(jié)束點(diǎn)與當(dāng)前范圍的開始點(diǎn)做比較
  • 特別的情況發(fā)生于要兼容舊版本標(biāo)準(zhǔn)瀏覽器與XML文檔時(shí),這時(shí)只有一些很基礎(chǔ)的DOM API,我們需要使用nextSibling來判定誰是哥哥,誰是“弟弟”。如果他們不是同一個(gè)父節(jié)點(diǎn),我們就需要將問題轉(zhuǎn)化為求最近公共祖先,判定誰是“父親”,誰是"伯父"節(jié)點(diǎn)。

    到這里,已經(jīng)是很單純的算法問題了。實(shí)現(xiàn)的思路有很多,最直觀最笨的做法是,不斷向上獲取他們的父節(jié)點(diǎn),直到HTML元素,連同最初的那個(gè)節(jié)點(diǎn),組成兩個(gè)數(shù)組,然后每次取數(shù)組最后的元素進(jìn)行比較,如果相同就去掉。一直取到不相同為止。最后用nextSibling結(jié)束。下面是測(cè)試的代碼。需要自己去試驗(yàn)。

    window.onload = function () {function shuffle(a) {//洗牌var array = a.concat();var i = array.length;while (i) {var j = Math.floor(Math.random() * i);var t = array[--i];array[i] = array[j];array[j] = t;}return array;}var log = function(s) {//查看調(diào)試消息window.console && window.console.log(s)}var sliceNodes = function(arr){//將NodeList轉(zhuǎn)化為純數(shù)組var ret = [],i = arr.length;while (i)ret [--i] = arr[i];return ret;}var sortNodes = function(a, b) {//節(jié)點(diǎn)排序var p = "parentNode",ap = a[p],bp = b[p];if (a === b) {return 0} else if (ap === bp) {while (a = a.nextSibling) {if (a === b) {return -1}}return 1} else if (!ap) {return -1} else if (!bp) {return 1}var al = [],ap = a//不斷往上取,一值取到HTMLwhile (ap && ap.nodeType === 1) {al[al.length] = apap = ap[p]}var bl =[],bp = b;while (bp && bp.nodeType === 1) {bl[bl.length] = bpbp = bp[p]}//然后一起去掉公共祖先ap = al.pop();bp = bl.pop();while(ap === bp) {ap = al.pop();bp = bl.pop();}if (ap && bp) {while (ap = ap.nextSibling) {if (ap === bp) {return -1}}return 1;}return ap ? 1 : -1 }var els = document.getElementsByTagName("*")els = sliceNodes(els); //轉(zhuǎn)換成純數(shù)組log(els);els = shuffle(els); //洗牌的過程(模擬選擇器引擎最初得到的結(jié)果集的情況)log(els);els = els.sort(sortNodes); //進(jìn)行節(jié)點(diǎn)排序log(els) }

    ?它沒打算支持xml與舊版標(biāo)準(zhǔn)瀏覽器,不支持就不會(huì)排序。

    mass Framework的icarus引擎,結(jié)合了一位編程高手JK的算法,在排序去重遠(yuǎn)勝Sizzle。

    其特點(diǎn)在于,無論sizzle或者slick,它們都是通過傳入比較函數(shù)進(jìn)行排序。而數(shù)組的原生sort方法,當(dāng)它傳一個(gè)比較函數(shù)時(shí),不管它內(nèi)部用哪種排序算法(ecma沒有規(guī)定sort的具體實(shí)現(xiàn)方法,因此,各個(gè)瀏覽器而異,比如FF2使用堆排序,FF3使用歸并排序,IE比較慢,具體的算法不明,可能為冒泡或插入排序,而chrome為了最大效率,采用了兩者算法:

    http://yiminghe.iteye.com/blog/469713(玉伯大神) 附加一個(gè)排序方法:http://runjs.cn/code/tam0czbv

    ),都需要多次比對(duì),所以非常耗時(shí)間,如果能設(shè)計(jì)讓排序在不傳參的情況下進(jìn)行,那么速度就會(huì)提高N倍。

    下面是具體的思路(當(dāng)然只能用于IE或早期的Opeara,所以代碼不貼出來。)

    i.取出元素節(jié)點(diǎn)的sourceIndex值,轉(zhuǎn)換為一個(gè)String對(duì)象
    ii.將元素節(jié)點(diǎn)附在String對(duì)象上
    iii.用String對(duì)象組成數(shù)組
    iiii.用原生的sor進(jìn)行string對(duì)象數(shù)組排序
    iiiii.在排序好的String數(shù)組中,排序取出元素節(jié)點(diǎn),即可得到排序好的結(jié)果集。

    在這里貼兩篇關(guān)于排序和節(jié)點(diǎn)選擇的前輩文章:擴(kuò)展閱讀
    http://www.cnblogs.com/jkisjk/archive/2011/01/28/array_quickly_sortby.html
    http://www.cnblogs.com/jkisjk/archive/2011/01/28/1946936.html

    擴(kuò)展閱讀?(參考司徒先生的多代選擇器引擎:)http://www.cnblogs.com/rubylouvre/archive/2011/11/10/2243838.html

    4.切割器

    選擇器降低了javascript的入行門檻,它們?cè)谶x擇元素時(shí)都很隨意,一級(jí)一級(jí)地向上加ID類名,導(dǎo)致選擇符非常長(zhǎng),因此,如果不支持querySlelectorAll,沒有一個(gè)原生API能承擔(dān)這份工作,因此,我們通過使用正常用戶對(duì)選擇符進(jìn)行切割,這個(gè)步奏有點(diǎn)像編譯原理的詞法分析,拆分出有用的符號(hào)法來。

    這里就拿Icarus的切割器來舉例,看它是怎么一步步優(yōu)化,就知道這工作需要多少細(xì)致。

    /[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:\[][\w\(\)\]]+|\s*[>+~,*]\s*|\s+/g

    比如,對(duì)于".td1,div a,body"上面的正則可完美將它分解為如下數(shù)組:

    [".td1",",","div"," ","*",",","body"]

    然后我們就可以根據(jù)這個(gè)符號(hào)流進(jìn)行工作。由于沒有指定上下文對(duì)象,就從document開始,發(fā)現(xiàn)第一個(gè)是類選擇器,可以用getElementsByClassName,如果沒有原生的,我們仿照一個(gè)也不是難事。然后是并聯(lián)選擇器,將上面得到的結(jié)果放進(jìn)結(jié)果集。接著是標(biāo)簽選擇器,使用getElementsByTgaName。接著是后代選擇器,這里可以優(yōu)化,我們可以預(yù)先查看一個(gè)選擇器群組是什么,發(fā)現(xiàn)是通配符選擇器,因此繼續(xù)使用getElementsByTgaName。接著又是并聯(lián)選擇器,將上面結(jié)果放入結(jié)果集。最后一個(gè)是標(biāo)簽選擇器,又使用getElementsByTgaName。最后是去重排序。

    顯然,有切割好的符號(hào),工作簡(jiǎn)單多了。

    但沒有東西一開始就是完美的,比如我們遇到一個(gè)這樣的選擇符,"nth-child(2n+1)".這是一個(gè)單獨(dú)的子元素過濾偽類,它不應(yīng)該在這里被分析。后面有專門的正則對(duì)它的偽類名與傳參進(jìn)行處理。在切割器里,它能得到最小的詞素是選擇器!

    于是切割器進(jìn)行改進(jìn)

    //讓小括號(hào)里邊的東西不被切割var reg = /[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:\[](?:[\w\u00a1-\uFFFF-]|\([^\)]*\)|\])+|(?:\s*)[>+~,*](?:\s*)|\s+/g

    我們不斷增加測(cè)試樣例,我們問他越來越多,如這個(gè)選擇符 :“.td1[aa='>111']” ,在這種情況下,屬性選擇器被拆碎了!

    [".td1","[aa",">","111"]

    于是正則改進(jìn)如下:

    //確保屬性選擇器作為一個(gè)完整的詞素var reg = /[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:](?:[\w\u00a1-\uFFFF-]|\S*\([^\)]*\))+|\[[^\]]*\]|(?:\s*)[>+~,*](?:\s*)|\s+/g

    對(duì)于選擇符"td + div span",如果最后有一大堆空白,會(huì)導(dǎo)致解析錯(cuò)誤,我們確保后代選擇器夾在兩個(gè)選擇器之間

    ["td", "+", "div", " ", "span", " "]

    最后一個(gè)選擇器會(huì)被我們的引擎認(rèn)作是后代選擇器,需要提前去掉

    //縮小后迭代選擇器的范圍var reg = /[\w\u00a1-\uFFFF][\w\u00a1-\uFFFF-]*|[#.:](?:[\w\u00a1-\uFFFF-]|\S+\([^\)]*\))+|\[[^\]]*\]|(?:\s*)[>+~,*](?:\s)|\s(?=[\w\u00a1-\uFFFF*#.[:])/g

    如果我們也想將前面的空白去掉,可能不是一個(gè)單獨(dú)的正則能做到的。現(xiàn)在切割器已經(jīng)被我們搞的相當(dāng)復(fù)雜了。維護(hù)性很差。在mootools中等引擎中,里邊的正則表達(dá)式更加復(fù)雜,可能是用工具生成的 。到了這個(gè)地方,我們需要轉(zhuǎn)換思路,將切割器該為一個(gè)函數(shù)處理。當(dāng)然,它里邊也少了不少正則。正則是處理字符串的利器。

    var reg_split = /^[\w\u00a1-\uFFFF\-\*]+|[#.:][\w\u00a1-\uFFFF-]+(?:\([^\])*\))?|\[[^\]]*\])|(?:\s*)[>+~,](?:\s*)|\s(?=[\w\u00a1-\uFFFF*#.[:])|^\s+/;var slim = /\s+|\s*[>+~,*]\s*$/function spliter(expr) {var flag_break = false;var full = []; //這里放置切割單個(gè)選擇器群組得到的詞素,以,為界var parts = []; //這里放置切割單個(gè)選擇器組得到的詞素,以關(guān)系選擇器為界do {expr = expr.replace(reg_split,function(part) {if (part === ",") { //這個(gè)切割器只處理到一個(gè)并聯(lián)選擇器flag_break = true;} else {if (part.match(slim)) { //對(duì)于關(guān)系并聯(lián)。通配符選擇器兩邊的空白進(jìn)行處理//對(duì)parts進(jìn)行反轉(zhuǎn),例如 div.aaa,反轉(zhuǎn)先處理aaafull = full.concat(parts.reverse(),part.replace(/\s/g, ''));parts = [];} else {parts[parts.length] = part}}return "";//去掉已經(jīng)處理了的部分});if (flag_break) break;} while (expr)full =full.concat(parts.reverse());!full[0] && full.shift(); //去掉開頭的第一個(gè)空白return full;} var expr = " div > div#aaa,span"console.log(spliter(expr)); //=> ["div", ">", "div"]

    當(dāng)然,這個(gè)相對(duì)于sizzle1.8與slick等引擎來說,不值一提,需要有非常深厚的正則表達(dá)式功力,深層的知識(shí)寶庫自動(dòng)機(jī)理論才能寫出來

    5.屬性選擇器對(duì)于空白字符的匹配策略

    上文已經(jīng)介紹過屬性選擇器的七種形態(tài)了,但屬性選擇器并沒有這么簡(jiǎn)單,在w3c草案對(duì)屬性選擇器[att~=val]提到了一個(gè)點(diǎn),val不能為空白字符,否則比較值flag(flag為val與元素實(shí)際值比較結(jié)果)返回false。如果querySlelectorAll測(cè)試一下屬性其他狀態(tài),我們會(huì)得到更多類似結(jié)果。

    <!DOCTYPE html> <html> <head><title></title><meta charset="utf-8"> </head> <body> <script type="text/javascript"> window.onload = function () {console.log(document.querySelector("#test1[title='']")); //<div title="" id="test1"></div>console.log(document.querySelector("#test1[title~='']")); // nullconsole.log(document.querySelector("#test1[title|='']")); //<div title="" id="test1"></div>console.log(document.querySelector("#test1[title^='']")); //nullconsole.log(document.querySelector("#test1[title$='']")); // nullconsole.log(document.querySelector("#test1[title*='']")); //nullconsole.log("==========================================")console.log(document.querySelector("#test2[title='']")); //nullconsole.log(document.querySelector("#test2[title~='']")); //nullconsole.log(document.querySelector("#test2[title|='']")); //nullconsole.log(document.querySelector("#test2[title^='']")); //nullconsole.log(document.querySelector("#test2[title$='']")); //nullconsole.log(document.querySelector("#test2[title*='']")); //null } </script><div title="" id="test1"></div> <div title="aaa" id="test2"></div> </body> </html>

    換言之,只要val為空,除=或|=除外,flag必為false,并且非=,!=操作符,如果取得值為空白字符,flag也必為false.

    6.子元素過濾偽類的分級(jí)與匹配

    子元素過濾偽類是css3新增的一種選擇器。比較復(fù)雜,這里單獨(dú)放出來說。首先,我們要將它從選擇符中分離出來。這個(gè)一般由切割器搞定。然后我們用正則將偽類名與它小括號(hào)里的傳參分解出來。

    如下是Icarus的做法

    var expr = ":nth-child(2n+1)"var rsequence = /^([#\.:])|\[\s*]((?:[-\w]|[^\x00-\xa0]|\\.)+)/var rpseudo = /^\(\s*("([^"]*)"|'([^']*)'|[^\(\)]*(\([^\(\)]*\))?)\s*\)/var rBackslash = /\\/g//這里把偽類從選擇符里分散出來match = expr.match(rsequence); //[":nth-child",":",":nth-child"]expr = RegExp.rightContext; //用它左邊的部分重寫expr--> "(2n+1)"key = (match[2] || "").replace(rBackslash, ""); //去掉換行符 key=--> "nth-child" switch (match[1]) {case "#"://id選擇器 略break;case "."://類選擇器 略break;case ":"://偽類 略tmp = Icarus.pseudoHooks[key];//Icarus.pseudoHooks里邊放置我們所能處理的偽類expr = RegExp.rightContext;//繼續(xù)取它左邊的部分重寫exprif ( !! ~key.indexOf("nth")) { //如果子元素過濾偽類args = parseNth[match[1]] || parseNth(match[1]);//分解小括號(hào)的傳參} else {args = match[3] || match [2] || match[1]}break;default://屬性選擇器 略break;}

    這里有個(gè)小技巧,我們需要不斷把處理過的部分從選擇器中去掉。一般選擇器引擎是使用expr = expr.replace(reg,"")進(jìn)行處理,Icarus巧妙的使用正則的RegExp.rightContext進(jìn)行復(fù)寫,將小括號(hào)里邊的字符串取得我們通過parseNTH進(jìn)行加工。將數(shù)字1,4,單詞even,odd,-n+1等各種形態(tài)轉(zhuǎn)換為an+b的形態(tài)。

    function parseNth (expr) {var orig = exprexpr = expr.replace(/^\+|\s*/g, '');//清除掉無用的空白var match = (expr === "even" && "2n" || expr === "odd" && "2n+1" || !/\D/.test(expr) && "0n+" + expr || expr).match(/(-?)(\d*)n([-+]?\d*)/);return parse_nth[orig] = {a: (match[1] + (match[2] || 1) - 0 ,b: match[3] - 0)};}

    parseNth是一個(gè)緩存函數(shù),這樣能避免重復(fù)解析,提高引擎的總體性能(緩存的精髓)

    關(guān)于緩存的利用,可以參看Icarus Sizzle1.8+ Slice等引擎,需求自己可尋找。

    ?5.sizzle引擎

    jQuery最大的特點(diǎn)就是其選擇器,jQuery1.3開始裝其Sizzle引擎。sizzle引擎與當(dāng)時(shí)主流的引擎大不一樣,人們說它是從右至左選擇(雖然不對(duì),但大致方向如此),速度遠(yuǎn)勝當(dāng)時(shí)選擇器(不過當(dāng)時(shí)也沒有什么選擇器,因此sizzle一直自娛自樂)

    Sizzle當(dāng)時(shí)有以下幾個(gè)特點(diǎn)

    i允許關(guān)系選擇器開頭
    ii允許反選擇器套取反選擇器
    iii大量的自定義偽類,比如位置偽類(eq,:first:even....),內(nèi)容偽類(:contains),包含偽類(:has),標(biāo)簽偽類(:radio,:input,:text,:file...),可見性偽類(:hidden,:visible)
    iiii對(duì)結(jié)果進(jìn)行去重,以元素在DOM樹的位置進(jìn)行排序,這樣與未來出現(xiàn)的querySelector行為一致。

    ?顯然,搞出這么東西,不是一朝半夕的事情,說明john Resig研發(fā)了很久。當(dāng)時(shí)sizzle的版本號(hào)為0.9.1,代碼風(fēng)格跟jQuery大不一樣,非常整齊清晰。這個(gè)風(fēng)格一直延續(xù)到j(luò)Query.1.7.2,Sizzle版本也跟上為1.7.2,在jQuery.1.8時(shí),或sizzle1.8時(shí),風(fēng)格大變,首先里邊的正則式是通過編譯得到的,以求更加準(zhǔn)確,結(jié)構(gòu)也異常復(fù)雜,開始走ext那樣編譯函數(shù)的路子,通過多種緩存手段提高查詢速度和匹配速度。

    由于第二階段的Sizzle蛻變還沒有完成,每星期都在變,tokenize ,addMatcher,matcherFrom,Tokens,matcherFormGroupMachers,complile這些關(guān)鍵的內(nèi)部函數(shù)都在改進(jìn),不斷膨脹。我們看是來看看sizzle1.72,這個(gè)版本是john Resing第一個(gè)階段的最完美的思想結(jié)晶。

    當(dāng)時(shí),Sizzle的整體結(jié)構(gòu)如下:

    i.Sizzle主函數(shù),里邊包含選擇符的切割,內(nèi)部循環(huán)調(diào)用住查找函數(shù),主過濾函數(shù),最后是去重過濾。
    ii.其它輔助函數(shù),如uniqueSort, matches, matchesSelector
    iii.Sizzle.find主查找函數(shù)
    iiii.Sizzle.filiter過濾函數(shù)
    iiiii.Sizzle.selectors包含各種匹配用的正則,過濾用的正則,分解用的正則,預(yù)處理用的函數(shù),過濾函數(shù)等
    iiiiii.根據(jù)瀏覽器特征設(shè)計(jì)makeArray,sortOrder,contains等方法
    iiiiiii.根據(jù)瀏覽器特征重寫Sizzle.selectors中的部分查找函數(shù),過濾函數(shù),查找次序。
    iiiiiiii.若瀏覽器支持querySelectorAll,那么用它重寫Sizzle,將原來的sizzle作為后備方案包裹在新的sizzle里邊
    iiiiiiiii.其它輔助函數(shù),如isXML,posProcess

    ?下面使用一部分源碼分析下1.7.2sizzle

    var Sizzle = function(slelctor, context, results, seed) {//通過短路運(yùn)算符,設(shè)置一些默認(rèn)值results = results || [];context = context || document;//備份,因?yàn)閏ontext會(huì)被改寫,如果出現(xiàn)并聯(lián)選擇器,就無法確保當(dāng)前節(jié)點(diǎn)是對(duì)于哪一個(gè)contextvar origContext = context;//上下文對(duì)象必須是元素節(jié)點(diǎn)或文檔對(duì)象if (context.nodeType !== 1 && context.nodeType !== 9) {return [];}//選擇符必須是字符,且不能為空if (!slelctor || typeof slelctor !== "string") {return results;} var m, set, checkSet, extra, ret, cur, pop, i,prune = true,contextXML = Sizzle.isXML(context),parts = [],soFar = slelctor;//下面是切割器的實(shí)現(xiàn),每次只處理到并聯(lián)選擇器,extra給留下次遞歸自身時(shí)作傳參//不過與其他引擎實(shí)現(xiàn)不同的是,它沒有一下子切成選擇器,而且切成選擇器組與關(guān)系選擇器的集合//比如body div > div:not(.aaa),title//后代選擇器雖然被忽略了,但在循環(huán)這個(gè)數(shù)組時(shí),它默認(rèn)每?jī)蓚€(gè)選擇器組與關(guān)系選擇器不存在就放在后代選擇器到那個(gè)位置上do {chunker.exec(""); //這一步主要講chunker的lastIndex重置,當(dāng)然是直接設(shè)置chunker.lastIndex效果也一樣m = chunker.exec(soFar);if (m) {soFar = m[3];parts.push(m[1]);if (m[2]) { //如果存在并聯(lián)選擇器,就中斷extra = m[3];break;}}} while (m);// 略....}

    接下來有許多分支,分別是對(duì)ID與位置偽類進(jìn)行優(yōu)化的(暫時(shí)跳過),著重幾個(gè)重要概念,查找函數(shù),種子集,映射集。這里集合sizzle源碼。

    查找函數(shù)就是Sizzle.selecters.find下的幾種函數(shù),常規(guī)情況下有ID,TAG,NAME三個(gè),如果瀏覽器支持getElementByClassName,還會(huì)有Class函數(shù)。正如我們前面所介紹的那樣,getElementById,geyElementsByName,getElementsByTagName,geyElementByClassName不能完全信任他們,即便是標(biāo)準(zhǔn)瀏覽器都會(huì)有bug,因此四大查找函數(shù)都做了一層封裝,不支持返回undefined,其它則返回?cái)?shù)組NodeList

    種子集,或叫候選集,就是通過最右邊的選擇器組得到的元素集合,比如說"div.aaa span.bbb",最右邊的選擇器組就是"span.bbb" ,這時(shí)引擎就會(huì)根據(jù)瀏覽器支持的情況選擇getElemntByTagName或者getElementClassName得到一組元素,然后通過className或tagName進(jìn)行過濾。這時(shí)得到的集合就是種子集,Sizzle的變量名seed就體現(xiàn)了這一點(diǎn)

    映射集,或叫影子集,Sizzle源碼的變量名為checkSet。這是個(gè)怎樣的東西呢?當(dāng)我們?nèi)〉梅N子集后,而是將種子集賦值一份出來,這就是映射集。種子集是由選擇器組選出來的,這時(shí)選擇符不為空,必然往左就是關(guān)系選擇器。關(guān)系選擇器會(huì)讓引擎去選其兄長(zhǎng)或父親(具體參見Sizzle.selector.relative下的四大函數(shù)),把這些元素置換到候選集對(duì)等的位置上。然后到下一個(gè)選擇器組時(shí),就是純過濾操作。主過濾函數(shù)sizzle.filter會(huì)調(diào)用sizzle.seletors下N個(gè)過濾函數(shù)對(duì)這些元素進(jìn)行監(jiān)測(cè),將不符合的元素替換為false.因此,到最后去重排序時(shí),映射集是一個(gè)包含布爾值與元素節(jié)點(diǎn)的數(shù)組(true也是在這個(gè)步奏中產(chǎn)生的)。

    種子集是分兩步選擇出來的。?首先,通過Sizzle.find得到一個(gè)大致的結(jié)果。然后通過Sizzle.filter,傳入最右那個(gè)選擇器組剩余的部分做參數(shù),縮小范圍。

    //這是征對(duì)最左邊的選擇器組存在ID做出的優(yōu)化ret = Sizzle.find(parts.shift(), context, contextXML);context = ret.expr ? Sizzle.filter(ret.expr, ret.set)[0] : ret.set[0]ret = seed ? {expr : parts.pop(),set : makeArray(seed)//這里會(huì)對(duì)~,+進(jìn)行優(yōu)化,直接取它的上一級(jí)做上下文} : Sizzle.find(parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+" ) && context.parentNode ? context.parentNode : context, contextXML);set = ret.expr ? Sizzle.filter(ret.expr, ret.set) : ret.set;

    我們是先取span還是取.aaa呢?這里有個(gè)準(zhǔn)則,確保我們后面的映射集最小化。直白的說,映射集里邊的元素越少,那么調(diào)用的過濾函數(shù)的次數(shù)就越少,說明進(jìn)入另一個(gè)函數(shù)作用域所造成的耗時(shí)就越少,從而整體提高引擎的選擇速度。

    為了達(dá)到此目的,這里做了一個(gè)優(yōu)化,原生選擇器的調(diào)用順序被放到了一個(gè)叫Sizzle.selector.order的數(shù)組中,對(duì)于陳舊的瀏覽器,其順序?yàn)镮D,NANME,TAG,對(duì)于支持getElementByClassName的瀏覽器,其順序?yàn)镮D,Class,NAME,TAG。因?yàn)?#xff0c;ID至多返回一個(gè)元素節(jié)點(diǎn),ClassName與樣式息息相關(guān),不是每個(gè)元素都有這個(gè)類名,name屬性帶來的限制可能比className更大,但用到的幾率較少,而tagName可排除的元素則更少了。

    那么Sizzle.find就會(huì)根據(jù)上面的數(shù)組,取得它的名字,依次調(diào)用Sizzle.leftMatch對(duì)應(yīng)的正則,從最右的選擇器組切割下需要的部分,將換行符處理掉,通過四大查找函數(shù)得到一個(gè)粗糙的節(jié)點(diǎn)集合。如果得到"[href=aaa]:visible"這樣的選擇符,那么只有把文檔中所有節(jié)點(diǎn)作為結(jié)果返回。

    //sizzle.find為主查找函數(shù)Sizzle.find = function(expr, context, isXML) {var set, i, len, match, type, left;if (!expr) {return [];}for (i = 0, len = Expr.order.length; i < len; i++) {type = Expr.order[i];//讀取正則,匹配想要的id class name tagif ((match = Expr.leftMatch[type].exec(expr))) {left = match[1];match.splice(1, 1);//處理換行符if (left.substr(left.length - 1) !== "\\") {match[1] = (match[1] || "").replace(rBackslash, "");set = Expr.find[type] (match, context, isXML);//如果不為undefined , 那么取得選擇器組中用過的部分if (set != null) {expr = expr.replace(Expr.match[type], "");break;}}}}if (!set) { //沒有的話,尋找該上下文對(duì)象的所有子孫set = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName("*") : [];}return {set: set,expr : expr};};

    經(jīng)過主查找函數(shù)處理后,我們得到一個(gè)初步的結(jié)果,這時(shí)最右邊的選擇器可能還有殘余,比如“div span.aaa”可能余下"div span","div .aaa.bbb"可能余下“div .bbb”,這個(gè)轉(zhuǎn)交主過濾函數(shù)Sizzle.filter函數(shù)處理。

    它有兩種不同的功能,一是不斷的縮小集合的個(gè)數(shù),構(gòu)成種子集返回。另一種是將原集合中不匹配的元素置換為false。這個(gè)根據(jù)它的第三個(gè)傳參inplace而定。

    Sizzle.filter = function (expr, set, inplace, not) {//用于生成種子集或映射集,視第三個(gè)參數(shù)而定//expr: 選擇符//set: 元素?cái)?shù)組//inplace: undefined, null時(shí)進(jìn)入種子集模式,true時(shí)進(jìn)入映射集模式//not: 一個(gè)布爾值,來源自去反選擇器.....}

    ?待我們把最右邊的選擇器組的最后都去掉后,種子集宣告完成,然后處理下一個(gè)選擇器組,并將種子集復(fù)制一下,生成映射集。在關(guān)系選擇器4個(gè)對(duì)應(yīng)函數(shù)———他們?yōu)镾izzle.selectors.relative命名空間下————只是將映射集里邊的元素置換為它們的兄長(zhǎng)父親,個(gè)數(shù)是不變。因此映射集與種子集的數(shù)量總是相當(dāng)。另外,這四個(gè)函數(shù)內(nèi)部也在調(diào)用Sizzle.filter函數(shù),它們的inplace參數(shù)為true,走映射集的邏輯。

    如果存在并聯(lián)選擇器,那就再調(diào)用Sizzle主函數(shù),把得到兩個(gè)結(jié)果合并去重

    if (extara) {Sizzle(extra, origContext, results, seed);Sizzle.uniqueSort(result) }


    這個(gè)過程就是Sizzle的主流程。下面將是根據(jù)瀏覽器的特性優(yōu)化或調(diào)整的部分。比如ie6 7下的getElementById有bug,需要沖洗Expr.find.ID與Expr.filterID.ie6-ie8下,Array.prototype.slice.call無法切割NodeList,需要從寫makeArray.IE6-8下,getElementsByTagName("*")會(huì)混雜在注釋節(jié)點(diǎn),需要從寫Expr.find.TAG,如果瀏覽器支持querySelectorAll,那么需要重寫整個(gè)Sizzle.

    下面就從寫個(gè)瀏覽器支持querySelectorAll的方法把:

    if (document.querySelectorAll) { //如果支持querySelectorAll(function(){var oldSizzle = Sizzle,div = document.createElement("div"),id = "__sizzle__";div.innerHTML = "<p class='TEST'>test</p>";//safari在怪異模式下querySelectorAll不能工作,終止從寫if (div.querySelectorAll && div.querySelectorAll(".TEST").length === 0) {return;}Sizzle = function(query, context, extra, seed) {context = context || document;//querySelectorAll只能用于HTML文檔,在標(biāo)準(zhǔn)瀏覽器XML文檔中實(shí)現(xiàn)了接口,但不工作if (!seed && !Sizzle.isXML(context)) {//See if we find a selector to speed upvar match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(query);if (match && (context.nodeType === 1 || context.nodeType === 9)) { //元素Element文檔Document//優(yōu)化只有單個(gè)標(biāo)簽選擇器的情況if (match[1]) {return makeArray(context.getElementsByTagName(query), extra);//優(yōu)化只有單個(gè)類選擇的情況} else if (match[2] && Expr.find.CLASS && context.getElementsByClassName) {return makeArray(context.getElementsByClassName(match[2]), extra);}}if (context.nodeType === 9) { //文檔Document//優(yōu)化選擇符為body的情況//因?yàn)槲臋n只有它一個(gè)標(biāo)簽,并且對(duì)于屬性直接取它if (query === "body" && context.body) {return makeArray ([context.body], extra);//優(yōu)化只有ID選擇器的情況//speed-up: Sizzle("ID")} else if (match && match[3]) {var elem = context.getElementById(match[3]);//注意,瀏覽器也會(huì)優(yōu)化,它會(huì)緩存了上次的結(jié)果//即便他現(xiàn)在移除了DOM樹if (elem && elem.parentNode) {//ie和opera會(huì)混淆id和name,確保id等于目標(biāo)值if (elem.id === match[3]) {return makeArray([elem], extra);}} else {return makeArray([], extra);}}try {return makeArray(context.querySelectorAll(query), extra);} catch (queryError) {}//ie8下的querySelectorAll實(shí)現(xiàn)存在bug,它會(huì)包含自己的集合內(nèi)查找符合自己的元素節(jié)點(diǎn)//根據(jù)規(guī)范,應(yīng)該是在當(dāng)前上下文中的所有子孫元素下查找,IE8下如果元素節(jié)點(diǎn)為Object,無法查找元素} else if (context.nodeType === 1 && context.nodeName.toLowerCase() !== "object") {var oldContext = context;old = context.getElementById("id"),nid = old || id,hasParent = context.parentNode,relativeHierarchySelector = /^\s*[+~]/.test(query);if (!old) {context.setAttribute("id" , nid);} else {nid = nid.replace(/'/g, "\\$&");}if (relativeHierarchySelector && hasParent) {context = context.parentNode;}// 如果存在id ,則將id取出來放到這個(gè)分組的最前面,比如div b --> [id=xxx] div b//不存在id,就創(chuàng)建一個(gè),重復(fù)上面的操作,最后會(huì)刪掉這個(gè)idtry {if (!relativeHierarchySelector || hasParent) {return makeArray(context.querySelectorAll("[id='" + nid +"']" + query), extra);}} catch (pseudoError) {} finally {if (!old) {oldContext.removeAttribute("id");}}}}return oldSizzle(query, context, extra, seed);};//將原來的方法重新綁定到Sizzle函數(shù)上for (var prop in oldSizzle) {Sizzle[prop] = oldSizzle[prop];}//release memory in IEdiv = null})();}

    ?從源碼中可以看出,它不單單是重寫那么簡(jiǎn)單,根據(jù)不同的情況還有各種提速方案。getElementById自不用說,速度肯定快,這內(nèi)部做了緩存,而且getElementById最多只返回一個(gè)元素節(jié)點(diǎn),而querySelectorAll則會(huì)返回?fù)碛羞@個(gè)ID值的多個(gè)元素。這個(gè)聽起來有點(diǎn)奇怪,querySelectorAll不會(huì)理會(huì)你的錯(cuò)誤行為,機(jī)械執(zhí)行指令。

    另外getElementsByTagName也是內(nèi)部使用了緩存,它也比querySelectorAll快,getElementsByTagName返回的是一個(gè)NodeList對(duì)象,而querySelectorAll返回的是一個(gè)StaticNodeList對(duì)象。一個(gè)是動(dòng)態(tài)的,一個(gè)是靜態(tài)的。

    測(cè)試下不同:

    var tag = "getElementsByTagName", sqa = "querySelectorAll";console.log(document[tag]("div") == document[tag]("div")); //=>trueconsole.log(document[sqa]("div") == document[sqa]("div")); //=>false

    ps:true意味著它們拿到的同是cache引用,Static每次返回都是不一樣的Object

    往上有數(shù)據(jù)表明,創(chuàng)建一個(gè)動(dòng)態(tài)的NodeList對(duì)象比一個(gè)靜態(tài)的StaticNodeList對(duì)象快90%

    querySelectorAll的問題遠(yuǎn)不至與此,IE8中微軟搶先實(shí)現(xiàn)了它,那時(shí)征對(duì)它的規(guī)范還沒有完成,因此不明確的地方微軟自行發(fā)揮了。IE8下如果對(duì)StaticNodeList取下標(biāo)超界,不會(huì)返回undefined,而是拋出異常 Invalid ?procedure call or argument。

    var els = document.body.querySelectorAll('div');alert(els[2])//2> els.length-1

    因此,一些奇特的循環(huán),要適可而止。

    最后,說明下querySelectorAll這個(gè)API在不同的瀏覽器。不同的版本中都存在bug,不支持的選擇器類型多了,我們需要在工作中做充分的測(cè)試(Sizzle1.9中,中槍的偽類就有focus , :enabled , :disabled , :checked.....)。


    在現(xiàn)實(shí)工作中,想要支持選擇器類型越多,就需要在結(jié)構(gòu)上設(shè)計(jì)的有擴(kuò)展性。但過分添加直接的定義偽類,就意味著未來與querySelectorAll發(fā)生的沖突越多。像zopto.js,就是一個(gè)querySelectorAll當(dāng)成自己選擇器的引擎,Sizzle1.9時(shí)已經(jīng)有1700行代碼。最近jQuery也做了一個(gè)selector-native模塊,審視未來。

    轉(zhuǎn)載于:https://www.cnblogs.com/wingzw/p/7360236.html

    總結(jié)

    以上是生活随笔為你收集整理的6.选择器引擎的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    亚洲精品鲁一鲁一区二区三区 | 亚洲阿v天堂在线 | 最新国产麻豆aⅴ精品无码 | 日韩人妻系列无码专区 | a在线亚洲男人的天堂 | 99riav国产精品视频 | 在线播放免费人成毛片乱码 | 2020最新国产自产精品 | 久久久精品人妻久久影视 | 欧美老妇交乱视频在线观看 | 国产精品无码成人午夜电影 | 国产人妻大战黑人第1集 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲日韩精品欧美一区二区 | 中文字幕无码日韩专区 | 国产无套粉嫩白浆在线 | 无码福利日韩神码福利片 | 国内精品久久毛片一区二区 | 亚洲综合无码久久精品综合 | 在线精品亚洲一区二区 | 欧美阿v高清资源不卡在线播放 | 毛片内射-百度 | 波多野42部无码喷潮在线 | 无码人妻丰满熟妇区五十路百度 | 久久久国产一区二区三区 | 久久99国产综合精品 | 亚洲精品鲁一鲁一区二区三区 | 男女超爽视频免费播放 | 成熟妇人a片免费看网站 | 精品一二三区久久aaa片 | 色五月五月丁香亚洲综合网 | 中文字幕+乱码+中文字幕一区 | 无码吃奶揉捏奶头高潮视频 | 香港三级日本三级妇三级 | 丰满少妇熟乱xxxxx视频 | 亚洲国产成人av在线观看 | 久久久久亚洲精品男人的天堂 | 又大又硬又爽免费视频 | 色老头在线一区二区三区 | 毛片内射-百度 | 性色欲情网站iwww九文堂 | 人妻天天爽夜夜爽一区二区 | 亚洲乱亚洲乱妇50p | 男女性色大片免费网站 | 久久天天躁狠狠躁夜夜免费观看 | 国产av一区二区三区最新精品 | 天天综合网天天综合色 | 国产精品嫩草久久久久 | 国产精品二区一区二区aⅴ污介绍 | 在线看片无码永久免费视频 | 精品水蜜桃久久久久久久 | 人妻夜夜爽天天爽三区 | 亚洲性无码av中文字幕 | 国产成人无码午夜视频在线观看 | 激情亚洲一区国产精品 | 日日躁夜夜躁狠狠躁 | 夜精品a片一区二区三区无码白浆 | 色综合久久久久综合一本到桃花网 | 亚洲日韩中文字幕在线播放 | 最近中文2019字幕第二页 | 美女黄网站人色视频免费国产 | 青春草在线视频免费观看 | 免费无码av一区二区 | 麻豆果冻传媒2021精品传媒一区下载 | 亚洲热妇无码av在线播放 | 中文亚洲成a人片在线观看 | 精品人妻人人做人人爽夜夜爽 | 国产片av国语在线观看 | 国产午夜手机精彩视频 | 性欧美熟妇videofreesex | 狠狠躁日日躁夜夜躁2020 | 草草网站影院白丝内射 | 国产超碰人人爽人人做人人添 | 亚洲精品一区二区三区在线观看 | 无码任你躁久久久久久久 | 国产亚洲精品精品国产亚洲综合 | 国产精品久久久午夜夜伦鲁鲁 | 久久久国产一区二区三区 | 国产亚洲欧美在线专区 | 无码国模国产在线观看 | 人人妻人人澡人人爽欧美一区 | 亚洲毛片av日韩av无码 | 丰满少妇高潮惨叫视频 | 精品夜夜澡人妻无码av蜜桃 | 久久99精品久久久久久 | 丰满岳乱妇在线观看中字无码 | 久久久久成人片免费观看蜜芽 | 国产猛烈高潮尖叫视频免费 | 欧美35页视频在线观看 | 露脸叫床粗话东北少妇 | 日产精品99久久久久久 | 少妇高潮一区二区三区99 | 国产亚洲tv在线观看 | 99久久久国产精品无码免费 | 在教室伦流澡到高潮hnp视频 | 精品成人av一区二区三区 | 久9re热视频这里只有精品 | 欧美亚洲国产一区二区三区 | 久久国产36精品色熟妇 | 亚洲一区二区三区偷拍女厕 | av无码久久久久不卡免费网站 | 亚洲成av人影院在线观看 | 成人无码视频在线观看网站 | 国产麻豆精品一区二区三区v视界 | 国产综合在线观看 | 国产亚洲人成a在线v网站 | 亚洲欧洲日本无在线码 | 在线看片无码永久免费视频 | 国产av人人夜夜澡人人爽麻豆 | 中国大陆精品视频xxxx | 亚洲一区二区三区偷拍女厕 | 亚洲国产精华液网站w | 国产人妻精品一区二区三区不卡 | 久久精品中文闷骚内射 | 婷婷五月综合缴情在线视频 | 免费观看的无遮挡av | 亚洲日本va午夜在线电影 | 国产精品爱久久久久久久 | 强伦人妻一区二区三区视频18 | 国产香蕉尹人综合在线观看 | 黑人巨大精品欧美黑寡妇 | 国产明星裸体无码xxxx视频 | 国产麻豆精品精东影业av网站 | 国产亚洲精品久久久久久久久动漫 | 精品欧美一区二区三区久久久 | 香蕉久久久久久av成人 | 精品人妻人人做人人爽 | 国产人妻精品一区二区三区 | 国产无套粉嫩白浆在线 | 欧美老妇交乱视频在线观看 | 国产人妻精品午夜福利免费 | 国产99久久精品一区二区 | 国产深夜福利视频在线 | 天堂一区人妻无码 | 一二三四在线观看免费视频 | 亚洲日韩精品欧美一区二区 | 又紧又大又爽精品一区二区 | 中文无码伦av中文字幕 | 国产乱子伦视频在线播放 | 午夜精品久久久久久久久 | 成人aaa片一区国产精品 | 久激情内射婷内射蜜桃人妖 | 特黄特色大片免费播放器图片 | 亚洲精品无码国产 | 爆乳一区二区三区无码 | 亚洲日韩乱码中文无码蜜桃臀网站 | 成人综合网亚洲伊人 | 日日碰狠狠躁久久躁蜜桃 | 久久久精品456亚洲影院 | 国精产品一品二品国精品69xx | 99久久婷婷国产综合精品青草免费 | 水蜜桃色314在线观看 | 男女猛烈xx00免费视频试看 | 欧洲vodafone精品性 | 国精产品一区二区三区 | 国产97人人超碰caoprom | 久热国产vs视频在线观看 | 国产亚洲精品久久久ai换 | 色婷婷av一区二区三区之红樱桃 | 免费看男女做好爽好硬视频 | 中文毛片无遮挡高清免费 | 成人无码影片精品久久久 | 妺妺窝人体色www在线小说 | 亚洲va中文字幕无码久久不卡 | 国产亚洲精品久久久久久国模美 | 在线观看免费人成视频 | 免费乱码人妻系列无码专区 | 亚洲精品成人福利网站 | 日日麻批免费40分钟无码 | 亚洲成a人片在线观看无码3d | 欧洲精品码一区二区三区免费看 | 日本护士毛茸茸高潮 | 成在人线av无码免费 | v一区无码内射国产 | 国产人妻人伦精品1国产丝袜 | 帮老师解开蕾丝奶罩吸乳网站 | 久久精品一区二区三区四区 | 十八禁视频网站在线观看 | 99久久人妻精品免费一区 | 久久亚洲精品成人无码 | 日韩欧美群交p片內射中文 | 亚洲伊人久久精品影院 | 十八禁真人啪啪免费网站 | 无码人妻av免费一区二区三区 | 精品久久久中文字幕人妻 | 少妇被黑人到高潮喷出白浆 | 国产精品.xx视频.xxtv | 日本丰满熟妇videos | 中文无码精品a∨在线观看不卡 | 欧美第一黄网免费网站 | 免费看少妇作爱视频 | 亚洲成熟女人毛毛耸耸多 | 国产人成高清在线视频99最全资源 | 国产 精品 自在自线 | 99久久精品国产一区二区蜜芽 | 国产精品人人爽人人做我的可爱 | 鲁一鲁av2019在线 | 日韩精品无码免费一区二区三区 | 亚洲 a v无 码免 费 成 人 a v | 日本在线高清不卡免费播放 | 思思久久99热只有频精品66 | 在教室伦流澡到高潮hnp视频 | 强伦人妻一区二区三区视频18 | 日韩视频 中文字幕 视频一区 | 人妻尝试又大又粗久久 | 风流少妇按摩来高潮 | 欧美乱妇无乱码大黄a片 | 国内精品一区二区三区不卡 | 欧美国产日韩亚洲中文 | 中文字幕中文有码在线 | 国产农村妇女高潮大叫 | 久久精品人妻少妇一区二区三区 | 亚洲中文字幕av在天堂 | 久久无码人妻影院 | av无码电影一区二区三区 | 亚洲国精产品一二二线 | 亚洲男女内射在线播放 | 九九热爱视频精品 | 在线a亚洲视频播放在线观看 | 在教室伦流澡到高潮hnp视频 | 亚洲成av人片天堂网无码】 | 国产乱子伦视频在线播放 | 一二三四社区在线中文视频 | 两性色午夜视频免费播放 | 久久99精品国产麻豆 | 丁香啪啪综合成人亚洲 | 理论片87福利理论电影 | 夜夜躁日日躁狠狠久久av | 波多野结衣av在线观看 | 天干天干啦夜天干天2017 | 波多野结衣高清一区二区三区 | 日韩人妻无码中文字幕视频 | 一本久道久久综合狠狠爱 | 欧美一区二区三区视频在线观看 | 国产精品.xx视频.xxtv | 中国女人内谢69xxxx | 亚洲一区av无码专区在线观看 | 天堂无码人妻精品一区二区三区 | 久久精品中文字幕一区 | 久久人人97超碰a片精品 | 好男人社区资源 | 性啪啪chinese东北女人 | 大屁股大乳丰满人妻 | 欧美人与善在线com | 99久久人妻精品免费二区 | 欧美激情综合亚洲一二区 | 偷窥日本少妇撒尿chinese | 国内精品人妻无码久久久影院 | 久久国语露脸国产精品电影 | 国内精品久久毛片一区二区 | 免费网站看v片在线18禁无码 | 一区二区传媒有限公司 | 青青青爽视频在线观看 | 无人区乱码一区二区三区 | 久久久久久a亚洲欧洲av冫 | 国产精品爱久久久久久久 | 久久久成人毛片无码 | www国产亚洲精品久久网站 | 无码国产色欲xxxxx视频 | 丝袜人妻一区二区三区 | ass日本丰满熟妇pics | 东京热无码av男人的天堂 | a在线亚洲男人的天堂 | 无码av最新清无码专区吞精 | 丰满岳乱妇在线观看中字无码 | www国产亚洲精品久久久日本 | 97精品国产97久久久久久免费 | 秋霞成人午夜鲁丝一区二区三区 | 亚洲大尺度无码无码专区 | 国产卡一卡二卡三 | 亚洲天堂2017无码 | 丰满少妇高潮惨叫视频 | 丰满人妻翻云覆雨呻吟视频 | 国产成人av免费观看 | 又粗又大又硬毛片免费看 | 少女韩国电视剧在线观看完整 | 一本久久a久久精品亚洲 | 美女黄网站人色视频免费国产 | 久久精品国产精品国产精品污 | 精品人人妻人人澡人人爽人人 | 亚洲一区二区观看播放 | 在线播放免费人成毛片乱码 | 性欧美videos高清精品 | 国产偷抇久久精品a片69 | 久久人妻内射无码一区三区 | 中文字幕人妻无码一夲道 | 国产亚洲人成在线播放 | 97夜夜澡人人爽人人喊中国片 | 欧美亚洲国产一区二区三区 | 蜜桃视频插满18在线观看 | 东京一本一道一二三区 | 成人综合网亚洲伊人 | 午夜福利不卡在线视频 | 欧美人与物videos另类 | 亚洲日韩av一区二区三区中文 | 国产午夜手机精彩视频 | 亚洲欧洲日本综合aⅴ在线 | 国产亚洲视频中文字幕97精品 | 人人爽人人爽人人片av亚洲 | 麻豆国产97在线 | 欧洲 | 奇米影视888欧美在线观看 | 国产精品-区区久久久狼 | 成人精品视频一区二区三区尤物 | 久久99久久99精品中文字幕 | 久久久久国色av免费观看性色 | 国产激情无码一区二区 | 精品无码国产一区二区三区av | 波多野结衣一区二区三区av免费 | 暴力强奷在线播放无码 | 一本大道久久东京热无码av | 天天做天天爱天天爽综合网 | 亚洲国产一区二区三区在线观看 | 国产免费无码一区二区视频 | 久久国产精品精品国产色婷婷 | 亚洲另类伦春色综合小说 | 亚洲国产欧美国产综合一区 | 99国产欧美久久久精品 | 精品国产一区av天美传媒 | 日本精品人妻无码免费大全 | 综合人妻久久一区二区精品 | 76少妇精品导航 | 亚洲精品国产a久久久久久 | 国产三级精品三级男人的天堂 | 欧美阿v高清资源不卡在线播放 | 牲欲强的熟妇农村老妇女视频 | 午夜嘿嘿嘿影院 | 国产精品内射视频免费 | 少妇性俱乐部纵欲狂欢电影 | 久久久www成人免费毛片 | 最新版天堂资源中文官网 | 欧美国产日产一区二区 | 人妻少妇被猛烈进入中文字幕 | 99久久久无码国产aaa精品 | 亚洲国产精品久久人人爱 | 国产成人精品久久亚洲高清不卡 | 中文字幕无码日韩专区 | 国内精品九九久久久精品 | 波多野42部无码喷潮在线 | 国产9 9在线 | 中文 | 久久久久久久人妻无码中文字幕爆 | aⅴ亚洲 日韩 色 图网站 播放 | 欧美日韩一区二区免费视频 | 97资源共享在线视频 | 亚洲人成网站在线播放942 | 无码国产乱人伦偷精品视频 | 亚洲狠狠婷婷综合久久 | 亚洲aⅴ无码成人网站国产app | 欧美肥老太牲交大战 | 亚洲欧洲中文日韩av乱码 | 国产亚洲欧美日韩亚洲中文色 | 久久国产精品二国产精品 | 国产精品久免费的黄网站 | 精品 日韩 国产 欧美 视频 | 久久婷婷五月综合色国产香蕉 | 精品欧美一区二区三区久久久 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产一区二区三区四区五区加勒比 | 日韩在线不卡免费视频一区 | 夫妻免费无码v看片 | 精品人妻人人做人人爽 | 久久久精品456亚洲影院 | 日韩在线不卡免费视频一区 | 在教室伦流澡到高潮hnp视频 | 亚洲中文字幕va福利 | 亚洲人成人无码网www国产 | 欧美国产日韩亚洲中文 | 无码人妻少妇伦在线电影 | 综合激情五月综合激情五月激情1 | 97精品人妻一区二区三区香蕉 | 久久久中文久久久无码 | 2020久久超碰国产精品最新 | www国产亚洲精品久久网站 | 亚洲国产av美女网站 | 国产精品久久久久久亚洲影视内衣 | 国产做国产爱免费视频 | 99久久精品国产一区二区蜜芽 | 熟女少妇在线视频播放 | 成人一在线视频日韩国产 | 学生妹亚洲一区二区 | 亚洲一区二区三区含羞草 | 欧美日韩一区二区三区自拍 | 国产猛烈高潮尖叫视频免费 | 国产高清av在线播放 | 色欲久久久天天天综合网精品 | 精品水蜜桃久久久久久久 | 国产日产欧产精品精品app | 亚洲国产成人av在线观看 | 四虎影视成人永久免费观看视频 | 高清国产亚洲精品自在久久 | 人妻天天爽夜夜爽一区二区 | 国产成人久久精品流白浆 | 人人妻人人澡人人爽欧美一区九九 | 日产国产精品亚洲系列 | 成人av无码一区二区三区 | 天堂а√在线地址中文在线 | 亚洲国产午夜精品理论片 | 亚洲欧美国产精品专区久久 | 无码国内精品人妻少妇 | 国产成人精品视频ⅴa片软件竹菊 | 一本久道久久综合狠狠爱 | 97精品人妻一区二区三区香蕉 | 欧美黑人性暴力猛交喷水 | 双乳奶水饱满少妇呻吟 | 丝袜 中出 制服 人妻 美腿 | 夜精品a片一区二区三区无码白浆 | 亚洲无人区午夜福利码高清完整版 | 少妇被粗大的猛进出69影院 | 免费网站看v片在线18禁无码 | 少妇久久久久久人妻无码 | 2019nv天堂香蕉在线观看 | 国产精品久久精品三级 | 无码av最新清无码专区吞精 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 夜先锋av资源网站 | 曰本女人与公拘交酡免费视频 | √天堂资源地址中文在线 | 午夜精品一区二区三区的区别 | 精品熟女少妇av免费观看 | 国产97人人超碰caoprom | 红桃av一区二区三区在线无码av | 亚洲色大成网站www | 久久久久成人片免费观看蜜芽 | 台湾无码一区二区 | 国产午夜福利100集发布 | 午夜熟女插插xx免费视频 | 丰满诱人的人妻3 | 丝袜美腿亚洲一区二区 | 成人免费视频一区二区 | 少妇性俱乐部纵欲狂欢电影 | 国产激情精品一区二区三区 | 国产乱子伦视频在线播放 | 99视频精品全部免费免费观看 | 国产精品无码一区二区桃花视频 | 国产真实乱对白精彩久久 | 伊人色综合久久天天小片 | 狠狠cao日日穞夜夜穞av | 丰满人妻一区二区三区免费视频 | 在线欧美精品一区二区三区 | 午夜无码区在线观看 | 免费人成网站视频在线观看 | 国产精品亚洲五月天高清 | 日韩欧美中文字幕在线三区 | 黑人巨大精品欧美黑寡妇 | 久久久国产一区二区三区 | 在线观看国产午夜福利片 | 青青久在线视频免费观看 | 国产舌乚八伦偷品w中 | 久久久久久九九精品久 | 亚洲大尺度无码无码专区 | 国产深夜福利视频在线 | 伊人久久大香线焦av综合影院 | 欧美猛少妇色xxxxx | 亚洲男人av香蕉爽爽爽爽 | 国产乱子伦视频在线播放 | 亚洲精品成人福利网站 | 亚洲爆乳无码专区 | a在线亚洲男人的天堂 | 性色欲情网站iwww九文堂 | 国产三级久久久精品麻豆三级 | 少妇无码一区二区二三区 | 久久精品丝袜高跟鞋 | 精品人人妻人人澡人人爽人人 | 99在线 | 亚洲 | 熟女少妇人妻中文字幕 | 日本熟妇大屁股人妻 | 久久这里只有精品视频9 | 老太婆性杂交欧美肥老太 | 77777熟女视频在线观看 а天堂中文在线官网 | 亚洲国产欧美在线成人 | 人妻有码中文字幕在线 | 国产精品久久久久久亚洲影视内衣 | 亚洲无人区午夜福利码高清完整版 | 一二三四社区在线中文视频 | 亚洲国精产品一二二线 | 任你躁国产自任一区二区三区 | www成人国产高清内射 | 色一情一乱一伦 | 国产精品99久久精品爆乳 | 国产麻豆精品精东影业av网站 | 人妻少妇精品久久 | 真人与拘做受免费视频 | 国产三级精品三级男人的天堂 | 日本大香伊一区二区三区 | 中文字幕av伊人av无码av | 麻豆国产丝袜白领秘书在线观看 | 国内揄拍国内精品人妻 | 天天躁夜夜躁狠狠是什么心态 | 98国产精品综合一区二区三区 | 国产成人久久精品流白浆 | 美女黄网站人色视频免费国产 | 曰本女人与公拘交酡免费视频 | 成人av无码一区二区三区 | 日日碰狠狠躁久久躁蜜桃 | 福利一区二区三区视频在线观看 | 成年美女黄网站色大免费全看 | 麻豆果冻传媒2021精品传媒一区下载 | 蜜桃臀无码内射一区二区三区 | 亚洲中文字幕无码一久久区 | 老子影院午夜精品无码 | 九九久久精品国产免费看小说 | 天堂а√在线中文在线 | 极品嫩模高潮叫床 | 成人三级无码视频在线观看 | 亚洲中文无码av永久不收费 | 久久亚洲中文字幕精品一区 | 少妇高潮一区二区三区99 | 国产亚洲精品精品国产亚洲综合 | а√资源新版在线天堂 | 国产极品美女高潮无套在线观看 | 久久99热只有频精品8 | 自拍偷自拍亚洲精品10p | 综合人妻久久一区二区精品 | 少妇无套内谢久久久久 | 无码免费一区二区三区 | 熟妇人妻中文av无码 | 国产精品人妻一区二区三区四 | 日韩人妻系列无码专区 | 欧美第一黄网免费网站 | 国产精品va在线播放 | 国产精品第一国产精品 | 秋霞成人午夜鲁丝一区二区三区 | 动漫av网站免费观看 | 97无码免费人妻超级碰碰夜夜 | 欧美阿v高清资源不卡在线播放 | 妺妺窝人体色www婷婷 | 国産精品久久久久久久 | 国产精品爱久久久久久久 | 亚洲男人av香蕉爽爽爽爽 | 99久久人妻精品免费一区 | 国产成人久久精品流白浆 | 国产精品-区区久久久狼 | 国产国产精品人在线视 | 女人被爽到呻吟gif动态图视看 | 在线观看国产一区二区三区 | 久久久精品国产sm最大网站 | 麻豆av传媒蜜桃天美传媒 | 国产又爽又黄又刺激的视频 | 亚洲欧美日韩国产精品一区二区 | 香港三级日本三级妇三级 | av香港经典三级级 在线 | 捆绑白丝粉色jk震动捧喷白浆 | 色情久久久av熟女人妻网站 | 人人超人人超碰超国产 | 国产艳妇av在线观看果冻传媒 | 丰满岳乱妇在线观看中字无码 | 青青青手机频在线观看 | 国产成人综合美国十次 | 麻豆国产丝袜白领秘书在线观看 | 午夜福利一区二区三区在线观看 | 国产精品美女久久久久av爽李琼 | 国产婷婷色一区二区三区在线 | 欧美真人作爱免费视频 | 亚洲国产午夜精品理论片 | 亚洲a无码综合a国产av中文 | 精品人人妻人人澡人人爽人人 | 亚洲第一无码av无码专区 | 成 人 免费观看网站 | 亚洲第一网站男人都懂 | 亚洲欧美日韩综合久久久 | 国产黄在线观看免费观看不卡 | 精品无码国产一区二区三区av | 国产精品.xx视频.xxtv | 亚洲小说春色综合另类 | 精品欧美一区二区三区久久久 | 日韩av无码一区二区三区 | 人人妻人人澡人人爽欧美一区九九 | 欧洲熟妇精品视频 | 高潮毛片无遮挡高清免费视频 | 中文字幕无码视频专区 | 欧美精品一区二区精品久久 | 任你躁国产自任一区二区三区 | 欧美 丝袜 自拍 制服 另类 | 久久国内精品自在自线 | 国产9 9在线 | 中文 | 欧美日韩在线亚洲综合国产人 | 精品日本一区二区三区在线观看 | 亚洲精品一区二区三区四区五区 | 亚洲aⅴ无码成人网站国产app | 婷婷丁香五月天综合东京热 | 少女韩国电视剧在线观看完整 | 国产亚洲精品久久久ai换 | av无码电影一区二区三区 | 国产亚洲日韩欧美另类第八页 | 香港三级日本三级妇三级 | 欧美真人作爱免费视频 | 亚洲欧美日韩成人高清在线一区 | 亚洲国产精品成人久久蜜臀 | 日本免费一区二区三区最新 | 婷婷综合久久中文字幕蜜桃三电影 | 蜜桃视频插满18在线观看 | 88国产精品欧美一区二区三区 | 国产av人人夜夜澡人人爽麻豆 | 亚洲人成影院在线观看 | 国产情侣作爱视频免费观看 | 日本又色又爽又黄的a片18禁 | 精品久久久久久亚洲精品 | 水蜜桃色314在线观看 | 18无码粉嫩小泬无套在线观看 | 亚洲一区二区三区四区 | 国产电影无码午夜在线播放 | 欧美老妇与禽交 | 日日麻批免费40分钟无码 | 高清不卡一区二区三区 | 亚洲乱码国产乱码精品精 | 日日天日日夜日日摸 | 色欲综合久久中文字幕网 | 少妇性荡欲午夜性开放视频剧场 | 丁香啪啪综合成人亚洲 | 少妇久久久久久人妻无码 | 高潮毛片无遮挡高清免费 | 大屁股大乳丰满人妻 | 国产三级精品三级男人的天堂 | 国产亚洲tv在线观看 | 婷婷丁香六月激情综合啪 | 少妇无套内谢久久久久 | 久久人人爽人人爽人人片av高清 | 久久人人爽人人爽人人片av高清 | 国产精品美女久久久网av | 欧美丰满熟妇xxxx性ppx人交 | av无码久久久久不卡免费网站 | 亚洲中文字幕在线观看 | 亚洲国产欧美日韩精品一区二区三区 | 人妻人人添人妻人人爱 | 国内揄拍国内精品少妇国语 | 亚洲一区二区三区无码久久 | 少妇愉情理伦片bd | 国产精品久久久午夜夜伦鲁鲁 | 成 人影片 免费观看 | 高潮毛片无遮挡高清免费 | 搡女人真爽免费视频大全 | 亚洲国产一区二区三区在线观看 | 国产在线aaa片一区二区99 | 日韩精品无码免费一区二区三区 | 人妻少妇被猛烈进入中文字幕 | 国内揄拍国内精品人妻 | 中文无码精品a∨在线观看不卡 | 亚洲伊人久久精品影院 | 日本护士xxxxhd少妇 | 2020最新国产自产精品 | 亚洲精品中文字幕 | 97无码免费人妻超级碰碰夜夜 | 欧美人妻一区二区三区 | 国产色视频一区二区三区 | 丰腴饱满的极品熟妇 | 少妇性l交大片 | 亚洲成av人影院在线观看 | 成人欧美一区二区三区 | 精品久久久无码中文字幕 | 中文字幕无码免费久久9一区9 | 麻豆国产丝袜白领秘书在线观看 | √天堂资源地址中文在线 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 日产国产精品亚洲系列 | 日韩精品成人一区二区三区 | 亚洲 激情 小说 另类 欧美 | 欧美色就是色 | 无码免费一区二区三区 | 人妻少妇精品无码专区二区 | 狠狠躁日日躁夜夜躁2020 | 日本精品人妻无码77777 天堂一区人妻无码 | 精品久久久中文字幕人妻 | 一本久道久久综合狠狠爱 | 亚洲精品国偷拍自产在线麻豆 | 日韩精品无码一本二本三本色 | 性生交大片免费看女人按摩摩 | 巨爆乳无码视频在线观看 | 国产精品内射视频免费 | 国精产品一品二品国精品69xx | 欧美三级a做爰在线观看 | 大肉大捧一进一出好爽视频 | 久久国产精品_国产精品 | 人人爽人人澡人人人妻 | 又粗又大又硬毛片免费看 | 国产成人精品优优av | 午夜理论片yy44880影院 | 2020最新国产自产精品 | 国产精品资源一区二区 | 精品国产一区二区三区四区 | 精品久久久中文字幕人妻 | 任你躁在线精品免费 | 97夜夜澡人人爽人人喊中国片 | 欧洲熟妇精品视频 | 人妻少妇精品无码专区二区 | 久久综合久久自在自线精品自 | 欧美黑人乱大交 | 国产精品久久久一区二区三区 | av无码久久久久不卡免费网站 | 蜜臀aⅴ国产精品久久久国产老师 | 国产另类ts人妖一区二区 | 婷婷色婷婷开心五月四房播播 | 一本加勒比波多野结衣 | 中文字幕日产无线码一区 | 无码吃奶揉捏奶头高潮视频 | 亚洲最大成人网站 | 红桃av一区二区三区在线无码av | 高潮毛片无遮挡高清免费视频 | 伊人久久大香线蕉av一区二区 | 国产性生交xxxxx无码 | 内射白嫩少妇超碰 | 亚洲综合久久一区二区 | 无码人妻av免费一区二区三区 | 国产成人无码一二三区视频 | 亚洲中文字幕无码一久久区 | 99久久精品日本一区二区免费 | 天天躁日日躁狠狠躁免费麻豆 | 免费看男女做好爽好硬视频 | 国产成人一区二区三区在线观看 | 装睡被陌生人摸出水好爽 | 久久综合九色综合97网 | 特黄特色大片免费播放器图片 | 亚洲成av人在线观看网址 | 一本久道高清无码视频 | 四虎国产精品免费久久 | 国产成人无码av在线影院 | 精品 日韩 国产 欧美 视频 | 天天燥日日燥 | 国产va免费精品观看 | 亚洲成a人片在线观看日本 | 四虎影视成人永久免费观看视频 | 亚洲性无码av中文字幕 | 国产午夜精品一区二区三区嫩草 | 疯狂三人交性欧美 | 国产成人精品一区二区在线小狼 | 伊人久久大香线蕉亚洲 | 亚洲熟熟妇xxxx | 免费看少妇作爱视频 | 久久天天躁夜夜躁狠狠 | 最新国产乱人伦偷精品免费网站 | 国产成人精品优优av | 最近免费中文字幕中文高清百度 | 中文字幕人妻丝袜二区 | 好男人社区资源 | 国产激情综合五月久久 | 国产高潮视频在线观看 | 国产人妻精品一区二区三区 | 亚洲第一网站男人都懂 | 亚洲精品一区二区三区大桥未久 | 曰本女人与公拘交酡免费视频 | 乱人伦中文视频在线观看 | 日本又色又爽又黄的a片18禁 | 激情爆乳一区二区三区 | 蜜桃视频插满18在线观看 | 999久久久国产精品消防器材 | 国产福利视频一区二区 | 久久久久久国产精品无码下载 | 六月丁香婷婷色狠狠久久 | 老熟妇仑乱视频一区二区 | 日韩少妇内射免费播放 | av无码电影一区二区三区 | 美女张开腿让人桶 | 精品国产麻豆免费人成网站 | 人人妻人人澡人人爽人人精品浪潮 | 欧美激情内射喷水高潮 | 久久综合九色综合97网 | 久久伊人色av天堂九九小黄鸭 | 久久久久免费精品国产 | 国产极品美女高潮无套在线观看 | 红桃av一区二区三区在线无码av | 丰满肥臀大屁股熟妇激情视频 | 欧美性猛交xxxx富婆 | 国内精品人妻无码久久久影院 | 久久精品女人天堂av免费观看 | 久久午夜夜伦鲁鲁片无码免费 | 久久久精品成人免费观看 | 亚洲国产av精品一区二区蜜芽 | 亚洲人成人无码网www国产 | 美女扒开屁股让男人桶 | 亚洲 高清 成人 动漫 | 中文精品久久久久人妻不卡 | 18禁止看的免费污网站 | 97精品国产97久久久久久免费 | 牲欲强的熟妇农村老妇女 | 风流少妇按摩来高潮 | 久久午夜无码鲁丝片午夜精品 | 日本熟妇大屁股人妻 | 免费无码av一区二区 | av香港经典三级级 在线 | 熟妇激情内射com | 亚欧洲精品在线视频免费观看 | 全黄性性激高免费视频 | 内射白嫩少妇超碰 | 欧美老妇交乱视频在线观看 | 男女超爽视频免费播放 | 亚洲欧洲日本综合aⅴ在线 | 久久亚洲a片com人成 | 成人综合网亚洲伊人 | 精品一区二区三区无码免费视频 | 亚洲精品一区二区三区婷婷月 | 人妻插b视频一区二区三区 | 超碰97人人射妻 | 欧美日韩在线亚洲综合国产人 | 久久午夜无码鲁丝片 | 精品无人区无码乱码毛片国产 | 伊人久久大香线蕉亚洲 | 蜜桃av抽搐高潮一区二区 | 奇米影视7777久久精品人人爽 | 日韩欧美中文字幕公布 | 国产成人无码av片在线观看不卡 | 国产又爽又猛又粗的视频a片 | 亚洲一区二区三区国产精华液 | 无码国产乱人伦偷精品视频 | 天天拍夜夜添久久精品 | 欧洲美熟女乱又伦 | 国产xxx69麻豆国语对白 | 爱做久久久久久 | 爽爽影院免费观看 | 午夜丰满少妇性开放视频 | 国产精品办公室沙发 | 国产精品亚洲综合色区韩国 | 国产精品福利视频导航 | 东京热无码av男人的天堂 | 欧美xxxx黑人又粗又长 | 丰满肥臀大屁股熟妇激情视频 | 国产在热线精品视频 | 国产高潮视频在线观看 | 亚洲成熟女人毛毛耸耸多 | 精品乱子伦一区二区三区 | 图片小说视频一区二区 | 欧美精品在线观看 | 亚洲一区av无码专区在线观看 | 国产精品.xx视频.xxtv | 国产亚洲精品久久久久久大师 | 中文字幕日产无线码一区 | 中文字幕无码免费久久9一区9 | 精品国产一区二区三区四区在线看 | a在线观看免费网站大全 | 欧美午夜特黄aaaaaa片 | 欧美乱妇无乱码大黄a片 | 天海翼激烈高潮到腰振不止 | 国产精品国产三级国产专播 | 久久 国产 尿 小便 嘘嘘 | 精品乱子伦一区二区三区 | aⅴ亚洲 日韩 色 图网站 播放 | 一本久久a久久精品vr综合 | 国产精品a成v人在线播放 | 亚洲日本一区二区三区在线 | 啦啦啦www在线观看免费视频 | 成熟人妻av无码专区 | 国产无av码在线观看 | 国产黑色丝袜在线播放 | 国内精品久久久久久中文字幕 | 水蜜桃亚洲一二三四在线 | 久久久精品欧美一区二区免费 | 东京一本一道一二三区 | 人妻有码中文字幕在线 | 中国女人内谢69xxxxxa片 | 7777奇米四色成人眼影 | 亚洲 另类 在线 欧美 制服 | 国产精品无码成人午夜电影 | 亚洲精品中文字幕久久久久 | 曰本女人与公拘交酡免费视频 | 亚洲人成影院在线观看 | 一区二区三区乱码在线 | 欧洲 | 国产香蕉尹人综合在线观看 | 久久综合九色综合97网 | 国产两女互慰高潮视频在线观看 | 精品无码国产自产拍在线观看蜜 | a片免费视频在线观看 | 国产激情一区二区三区 | 永久免费精品精品永久-夜色 | 2020最新国产自产精品 | 欧美日韩亚洲国产精品 | 国产成人人人97超碰超爽8 | 亚洲国产高清在线观看视频 | 国内老熟妇对白xxxxhd | 无码人妻丰满熟妇区五十路百度 | 中文字幕色婷婷在线视频 | 人妻无码久久精品人妻 | 亚洲 激情 小说 另类 欧美 | 男女超爽视频免费播放 | 国产成人无码区免费内射一片色欲 | 国产凸凹视频一区二区 | 精品无码国产一区二区三区av | 日本在线高清不卡免费播放 | 精品久久久中文字幕人妻 | 欧美日本免费一区二区三区 | 无码国模国产在线观看 | 国产无遮挡又黄又爽免费视频 | 天堂在线观看www | √8天堂资源地址中文在线 | 无码毛片视频一区二区本码 | 久久久久久久女国产乱让韩 | 午夜理论片yy44880影院 | 久久亚洲精品中文字幕无男同 | 日韩精品a片一区二区三区妖精 | 东京热无码av男人的天堂 | 麻豆md0077饥渴少妇 | 亚洲一区av无码专区在线观看 | 无人区乱码一区二区三区 | 亚洲精品午夜无码电影网 | 2019nv天堂香蕉在线观看 | 久久人人爽人人人人片 | 久久久亚洲欧洲日产国码αv | 亚洲色欲色欲欲www在线 | 亚洲欧美综合区丁香五月小说 | 免费人成在线视频无码 | 国产黑色丝袜在线播放 | 中文字幕+乱码+中文字幕一区 | 亚洲va中文字幕无码久久不卡 | 国内揄拍国内精品人妻 | 妺妺窝人体色www婷婷 | 天天做天天爱天天爽综合网 | 国产精品.xx视频.xxtv | 性欧美大战久久久久久久 | 亚洲国产精品成人久久蜜臀 | 中文无码成人免费视频在线观看 | 国产精品资源一区二区 | 亚洲乱亚洲乱妇50p | 欧美性生交xxxxx久久久 | 精品少妇爆乳无码av无码专区 | 国产在线精品一区二区三区直播 | 人人妻人人澡人人爽欧美一区九九 | 在线播放无码字幕亚洲 | 国产情侣作爱视频免费观看 | 国产做国产爱免费视频 | 撕开奶罩揉吮奶头视频 | 久久综合网欧美色妞网 | 全球成人中文在线 | 无码人妻精品一区二区三区不卡 | 给我免费的视频在线观看 | 久久99国产综合精品 | 精品国产成人一区二区三区 | a国产一区二区免费入口 | 99久久久无码国产aaa精品 | 夜夜夜高潮夜夜爽夜夜爰爰 | 国产情侣作爱视频免费观看 | 久久国产精品偷任你爽任你 | 亚洲精品一区二区三区婷婷月 | 亚洲中文字幕va福利 | 日韩 欧美 动漫 国产 制服 | 动漫av一区二区在线观看 | 少妇被黑人到高潮喷出白浆 | 国产精品第一国产精品 | 中文字幕无码免费久久99 | 亚洲中文字幕在线无码一区二区 | 熟女少妇人妻中文字幕 | 日日夜夜撸啊撸 | 俺去俺来也在线www色官网 | 国产午夜无码视频在线观看 | 亚洲一区二区三区四区 | 日日夜夜撸啊撸 | 无码一区二区三区在线 | 四虎国产精品免费久久 | 色老头在线一区二区三区 | 成 人 网 站国产免费观看 | 成人亚洲精品久久久久软件 | 精品久久久无码人妻字幂 | 中文字幕无码热在线视频 | 久久亚洲中文字幕无码 | 久久亚洲精品成人无码 | 动漫av一区二区在线观看 | 亚洲日韩精品欧美一区二区 | 国产亚洲精品久久久久久久久动漫 | 欧美精品在线观看 | 国产97人人超碰caoprom | 久久99精品国产麻豆 | 一本久道高清无码视频 | 久久久久久亚洲精品a片成人 | 亚洲成av人综合在线观看 | 久久人人爽人人爽人人片av高清 | 久久亚洲a片com人成 | 天海翼激烈高潮到腰振不止 | 国产午夜无码视频在线观看 | 成人免费视频视频在线观看 免费 | 国产精品无码久久av | 精品水蜜桃久久久久久久 | 亚洲狠狠色丁香婷婷综合 | 久久久国产一区二区三区 | 日韩av无码一区二区三区 | 日韩少妇内射免费播放 | 日本www一道久久久免费榴莲 | 精品国产国产综合精品 | 我要看www免费看插插视频 | 国产av无码专区亚洲awww | 丰满少妇女裸体bbw | 国产suv精品一区二区五 | 又色又爽又黄的美女裸体网站 | 国产午夜视频在线观看 | 免费人成网站视频在线观看 | 久久亚洲中文字幕无码 | 日本护士xxxxhd少妇 | 内射巨臀欧美在线视频 | 国产后入清纯学生妹 | 无码精品国产va在线观看dvd | 波多野结衣乳巨码无在线观看 | 十八禁视频网站在线观看 | 中文字幕 亚洲精品 第1页 | 日韩精品a片一区二区三区妖精 | 性欧美熟妇videofreesex | 色婷婷综合中文久久一本 | 亚洲国产欧美国产综合一区 | 亚洲国精产品一二二线 | 人妻与老人中文字幕 | 1000部夫妻午夜免费 | 131美女爱做视频 | 理论片87福利理论电影 | 久久zyz资源站无码中文动漫 | 无码人妻出轨黑人中文字幕 | 精品国产精品久久一区免费式 | 精品人妻av区 | 初尝人妻少妇中文字幕 | 丰满妇女强制高潮18xxxx | 亚洲人交乣女bbw | 在线观看国产午夜福利片 | 精品国产乱码久久久久乱码 | 国产精品无套呻吟在线 | 日本高清一区免费中文视频 | 日本精品高清一区二区 | 亚洲中文无码av永久不收费 | av人摸人人人澡人人超碰下载 | 夜夜高潮次次欢爽av女 | 久久精品无码一区二区三区 | 国产精品对白交换视频 | 麻花豆传媒剧国产免费mv在线 | 又大又硬又爽免费视频 | 一个人看的视频www在线 | 麻豆国产人妻欲求不满谁演的 | 四虎国产精品一区二区 | 国产尤物精品视频 | 欧美亚洲日韩国产人成在线播放 | 水蜜桃色314在线观看 | 亚洲爆乳精品无码一区二区三区 | 中文字幕久久久久人妻 | 在线亚洲高清揄拍自拍一品区 | 国产偷抇久久精品a片69 | 亚洲成a人片在线观看日本 | 亚洲精品欧美二区三区中文字幕 | 丰满护士巨好爽好大乳 | 我要看www免费看插插视频 | 激情综合激情五月俺也去 | 午夜精品久久久内射近拍高清 | 亚洲日韩精品欧美一区二区 | 亚洲国产精品久久久天堂 | 日本一卡二卡不卡视频查询 | 曰韩少妇内射免费播放 | 久久久国产精品无码免费专区 | 无码人中文字幕 | 无码任你躁久久久久久久 | 正在播放东北夫妻内射 | 六月丁香婷婷色狠狠久久 | 人妻夜夜爽天天爽三区 | 在线a亚洲视频播放在线观看 | 大屁股大乳丰满人妻 | 十八禁真人啪啪免费网站 | 欧美国产日韩亚洲中文 | 亚洲男人av天堂午夜在 | 国产色在线 | 国产 | 中文字幕无码av波多野吉衣 | 国产精品丝袜黑色高跟鞋 | 亚洲中文字幕无码一久久区 | 亚洲の无码国产の无码影院 | 中文亚洲成a人片在线观看 | 欧美自拍另类欧美综合图片区 | 熟女少妇在线视频播放 | 国产精品第一国产精品 | 国产精品高潮呻吟av久久 | 无码中文字幕色专区 | 天堂а√在线中文在线 | 女人被男人爽到呻吟的视频 | 久久国内精品自在自线 | 欧美日韩一区二区综合 | 国产精品人人爽人人做我的可爱 | 国产无遮挡吃胸膜奶免费看 | 无码精品国产va在线观看dvd | 国产精品久久久久影院嫩草 | 亚洲色无码一区二区三区 | 国产av剧情md精品麻豆 | 动漫av网站免费观看 | 精品日本一区二区三区在线观看 | 国产亚洲精品久久久久久久 | 日本免费一区二区三区最新 | 国产精品99爱免费视频 | 4hu四虎永久在线观看 | 性做久久久久久久久 | 国产三级精品三级男人的天堂 | 免费视频欧美无人区码 | 成人免费视频一区二区 | 日韩av无码中文无码电影 | 日日夜夜撸啊撸 | 亚洲成a人片在线观看无码3d | 丰满人妻被黑人猛烈进入 | 久久五月精品中文字幕 | 人妻与老人中文字幕 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 午夜时刻免费入口 | 亚洲综合另类小说色区 | 无码一区二区三区在线 | 日韩在线不卡免费视频一区 | 国产综合色产在线精品 | 中文字幕人妻无码一夲道 | 国产精品18久久久久久麻辣 | 久久久久久久人妻无码中文字幕爆 | 国产乱人无码伦av在线a | 久久视频在线观看精品 | 亚洲人成人无码网www国产 | 欧美午夜特黄aaaaaa片 | 国产精品第一国产精品 | 精品 日韩 国产 欧美 视频 | 亚洲国产精品毛片av不卡在线 | 人妻无码久久精品人妻 | 久久精品一区二区三区四区 | 正在播放东北夫妻内射 | 亚洲成色www久久网站 | 人妻少妇被猛烈进入中文字幕 | 中文字幕日韩精品一区二区三区 | 欧美一区二区三区视频在线观看 | 成人aaa片一区国产精品 | 亚洲一区av无码专区在线观看 | 四虎国产精品一区二区 | 爽爽影院免费观看 | 国产小呦泬泬99精品 | 国产精品毛多多水多 | 最近中文2019字幕第二页 | 亚洲乱码日产精品bd | 精品一区二区三区波多野结衣 | 国产精品二区一区二区aⅴ污介绍 | 日韩无套无码精品 | 波多野42部无码喷潮在线 | 久久精品国产一区二区三区 | 色五月五月丁香亚洲综合网 | 成人无码精品一区二区三区 | 久久精品国产亚洲精品 | 亚洲精品一区二区三区大桥未久 | 精品亚洲成av人在线观看 | 亚洲精品www久久久 | 亚洲色在线无码国产精品不卡 | 四十如虎的丰满熟妇啪啪 | 欧美日本精品一区二区三区 | 亚洲色大成网站www | 亚洲成a人片在线观看无码3d | 天海翼激烈高潮到腰振不止 | 亚洲成av人影院在线观看 | 嫩b人妻精品一区二区三区 | 国产精品va在线观看无码 | 国产无套粉嫩白浆在线 | 2019nv天堂香蕉在线观看 | 亚洲成a人片在线观看日本 | 一个人看的视频www在线 | 亚洲小说图区综合在线 | 精品成在人线av无码免费看 | 精品日本一区二区三区在线观看 | 2019nv天堂香蕉在线观看 | 国产成人精品三级麻豆 | 丰满少妇人妻久久久久久 | 狠狠色噜噜狠狠狠7777奇米 | 久久99热只有频精品8 | 亚洲成a人片在线观看无码 | 日产精品99久久久久久 | 国产偷自视频区视频 | 无码一区二区三区在线观看 | 夫妻免费无码v看片 | 强奷人妻日本中文字幕 | 久久这里只有精品视频9 | 日韩少妇内射免费播放 | 国产suv精品一区二区五 | 日本欧美一区二区三区乱码 | www国产亚洲精品久久网站 | 欧美老人巨大xxxx做受 | 97精品人妻一区二区三区香蕉 | 日本熟妇人妻xxxxx人hd | 成人性做爰aaa片免费看 | 午夜福利不卡在线视频 | 精品久久8x国产免费观看 | 中文字幕无码av波多野吉衣 | 久久久精品成人免费观看 | 亚洲色www成人永久网址 | 熟妇人妻中文av无码 | 久久 国产 尿 小便 嘘嘘 | 红桃av一区二区三区在线无码av | 亚洲国产欧美日韩精品一区二区三区 | 国产欧美精品一区二区三区 | 精品久久综合1区2区3区激情 | 国产成人久久精品流白浆 | 国产精品久久久一区二区三区 | 欧美一区二区三区视频在线观看 | 成 人 网 站国产免费观看 | 精品国产aⅴ无码一区二区 | 亚洲精品国偷拍自产在线麻豆 | 精品欧洲av无码一区二区三区 | 色 综合 欧美 亚洲 国产 | 欧美日本精品一区二区三区 | 精品久久久无码人妻字幂 | 国内老熟妇对白xxxxhd | 乱人伦中文视频在线观看 | 亚洲国产高清在线观看视频 | 日韩成人一区二区三区在线观看 | 香蕉久久久久久av成人 | 午夜精品久久久久久久久 | 国产精品亚洲五月天高清 | 久久 国产 尿 小便 嘘嘘 | 男人和女人高潮免费网站 | 国产精品亚洲五月天高清 | 亚洲の无码国产の无码影院 | 99久久人妻精品免费一区 | 在线а√天堂中文官网 | 国产人妻精品一区二区三区 | 国产成人精品无码播放 | 欧美亚洲国产一区二区三区 | 精品一区二区三区波多野结衣 | 无码国产乱人伦偷精品视频 | 男人和女人高潮免费网站 | 无套内射视频囯产 | 成人毛片一区二区 | 国产精品人人爽人人做我的可爱 | 日本va欧美va欧美va精品 | 色情久久久av熟女人妻网站 | 天海翼激烈高潮到腰振不止 | 欧美乱妇无乱码大黄a片 | 中文字幕无线码免费人妻 | 人人妻人人澡人人爽欧美精品 | 1000部夫妻午夜免费 | 色欲久久久天天天综合网精品 | 亚洲人成无码网www | 男女超爽视频免费播放 | 亚洲精品国偷拍自产在线观看蜜桃 | 帮老师解开蕾丝奶罩吸乳网站 | 综合网日日天干夜夜久久 | 国产精品亚洲一区二区三区喷水 | 天海翼激烈高潮到腰振不止 | 国产麻豆精品一区二区三区v视界 | 18禁止看的免费污网站 | 中国大陆精品视频xxxx | 色情久久久av熟女人妻网站 | 欧美一区二区三区视频在线观看 | 欧美三级不卡在线观看 | 日本欧美一区二区三区乱码 | 国产av一区二区精品久久凹凸 | 中文字幕av日韩精品一区二区 | 黑人粗大猛烈进出高潮视频 | 久久精品视频在线看15 | 精品无人国产偷自产在线 | 久久国产精品二国产精品 | 中文字幕乱码中文乱码51精品 | 男人的天堂2018无码 | 高清无码午夜福利视频 | 影音先锋中文字幕无码 | 爽爽影院免费观看 | 国产人妻人伦精品1国产丝袜 | 国产成人精品一区二区在线小狼 | 在线观看国产午夜福利片 | 亚洲国产精品毛片av不卡在线 | 亚洲日韩av片在线观看 | 无套内谢老熟女 | 无套内谢老熟女 | aⅴ在线视频男人的天堂 | 国产亚洲精品精品国产亚洲综合 | 成人一在线视频日韩国产 | 97夜夜澡人人双人人人喊 | 日本熟妇大屁股人妻 | 日日摸天天摸爽爽狠狠97 | 永久黄网站色视频免费直播 | 在线天堂新版最新版在线8 | 国产两女互慰高潮视频在线观看 | 一区二区三区高清视频一 | 亚洲va欧美va天堂v国产综合 | 曰本女人与公拘交酡免费视频 | 综合激情五月综合激情五月激情1 | 日本高清一区免费中文视频 | 亚洲国产一区二区三区在线观看 | 少女韩国电视剧在线观看完整 | 无码播放一区二区三区 | 日韩人妻系列无码专区 | 久久精品人妻少妇一区二区三区 | 国产无av码在线观看 | 国内揄拍国内精品人妻 | 未满小14洗澡无码视频网站 | 丰满护士巨好爽好大乳 | 久久久国产一区二区三区 | 成人性做爰aaa片免费看 | 色五月丁香五月综合五月 | 老熟妇乱子伦牲交视频 | 国产精品亚洲专区无码不卡 | 欧美人与禽猛交狂配 | 色欲久久久天天天综合网精品 | 天天摸天天透天天添 | 亚洲aⅴ无码成人网站国产app | 国产精品福利视频导航 | 最新国产乱人伦偷精品免费网站 | 午夜福利试看120秒体验区 | 亚洲精品久久久久avwww潮水 | 亚洲爆乳无码专区 | 成人无码精品一区二区三区 | 国产人妻久久精品二区三区老狼 | 99久久久国产精品无码免费 | 中文字幕无码免费久久99 | 99riav国产精品视频 | 欧美性生交活xxxxxdddd | 亚洲精品成a人在线观看 | 熟妇人妻激情偷爽文 | 女人被男人爽到呻吟的视频 | 日本精品久久久久中文字幕 | 日本免费一区二区三区最新 | 婷婷六月久久综合丁香 | 亚洲成色在线综合网站 | 国产成人综合在线女婷五月99播放 | 国产sm调教视频在线观看 | 亚洲自偷自偷在线制服 | 自拍偷自拍亚洲精品10p | 国产亚洲精品久久久久久久 | 国产精品99久久精品爆乳 | 天堂在线观看www | www国产亚洲精品久久网站 | 67194成是人免费无码 | 一本色道婷婷久久欧美 | 精品国产aⅴ无码一区二区 | аⅴ资源天堂资源库在线 | 欧美 日韩 亚洲 在线 | 日日躁夜夜躁狠狠躁 | 国产乱人伦偷精品视频 | 中文久久乱码一区二区 | 熟女少妇人妻中文字幕 | 波多野结衣高清一区二区三区 | 久久精品人人做人人综合试看 | 亚洲理论电影在线观看 | 大胆欧美熟妇xx | 亚洲一区二区观看播放 | 中文字幕日产无线码一区 | 国产成人精品优优av | 少妇一晚三次一区二区三区 | 日韩av无码一区二区三区不卡 | 国产口爆吞精在线视频 | 无码乱肉视频免费大全合集 | 国产香蕉97碰碰久久人人 | 亚洲综合伊人久久大杳蕉 | 亚洲中文字幕久久无码 | 一本精品99久久精品77 | 国产乱人伦偷精品视频 | 亚洲中文字幕无码中文字在线 | 久久99久久99精品中文字幕 | 成年美女黄网站色大免费全看 | 2019nv天堂香蕉在线观看 | 中文字幕av伊人av无码av | 亚洲の无码国产の无码步美 | 狠狠噜狠狠狠狠丁香五月 | 亚洲国产精品毛片av不卡在线 | 99久久精品无码一区二区毛片 | 伊人久久大香线蕉av一区二区 | 日本va欧美va欧美va精品 | 性欧美疯狂xxxxbbbb | 色五月五月丁香亚洲综合网 | 亚洲熟妇自偷自拍另类 | 色诱久久久久综合网ywww | 国产深夜福利视频在线 | 青青久在线视频免费观看 | 国产激情一区二区三区 | 欧美老熟妇乱xxxxx | 国产农村妇女高潮大叫 | 日本丰满护士爆乳xxxx | 九九综合va免费看 | 欧美日本免费一区二区三区 | 女人被男人爽到呻吟的视频 | 欧美日韩视频无码一区二区三 | 久久久中文久久久无码 | 久久久婷婷五月亚洲97号色 | 人妻插b视频一区二区三区 | 捆绑白丝粉色jk震动捧喷白浆 | 伊人久久大香线蕉av一区二区 | 国产精品二区一区二区aⅴ污介绍 | 欧美人与动性行为视频 | 国内精品人妻无码久久久影院蜜桃 | 亚洲欧美色中文字幕在线 | 蜜桃av抽搐高潮一区二区 | 午夜成人1000部免费视频 | 六十路熟妇乱子伦 | 国产极品美女高潮无套在线观看 | 午夜理论片yy44880影院 | 无码国产色欲xxxxx视频 | aⅴ亚洲 日韩 色 图网站 播放 | 无码乱肉视频免费大全合集 | 大地资源中文第3页 | 久久精品人妻少妇一区二区三区 | 精品乱码久久久久久久 | 国产成人久久精品流白浆 | 国产午夜无码视频在线观看 | 内射巨臀欧美在线视频 | 欧美放荡的少妇 | 一本大道久久东京热无码av | 一本无码人妻在中文字幕免费 | 熟妇人妻中文av无码 | 国产精品久久国产三级国 | 波多野结衣乳巨码无在线观看 | 国产亚洲精品久久久久久久 | 亚洲日本va中文字幕 | 亚洲欧洲日本无在线码 | 国产精品理论片在线观看 | 亚洲七七久久桃花影院 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲欧美中文字幕5发布 | 午夜福利一区二区三区在线观看 | 夜夜夜高潮夜夜爽夜夜爰爰 | 久久人人爽人人爽人人片av高清 | 乱人伦人妻中文字幕无码 | 欧洲熟妇精品视频 | 国产精品永久免费视频 | 日韩亚洲欧美精品综合 | 国产午夜视频在线观看 | 国内少妇偷人精品视频免费 | 中文精品无码中文字幕无码专区 | 成人欧美一区二区三区黑人 | 亚洲精品成人av在线 | 中文字幕无码人妻少妇免费 | 亚洲国产精品久久久天堂 | 亚洲s色大片在线观看 | 国产精品多人p群无码 | 毛片内射-百度 | 久久99国产综合精品 | 国产一精品一av一免费 | 国产精品久久国产三级国 | 强奷人妻日本中文字幕 | 精品久久8x国产免费观看 | 激情爆乳一区二区三区 | 色综合久久88色综合天天 | 亚洲日韩一区二区 | 熟妇人妻无乱码中文字幕 | 对白脏话肉麻粗话av | 初尝人妻少妇中文字幕 | 国产电影无码午夜在线播放 | 俺去俺来也在线www色官网 | 国产日产欧产精品精品app | 国产精品鲁鲁鲁 | 国产精品久久国产精品99 | 亚洲一区二区三区在线观看网站 | 夜夜高潮次次欢爽av女 | 国产精品办公室沙发 | 九月婷婷人人澡人人添人人爽 | 色综合久久88色综合天天 | 久久精品无码一区二区三区 | 精品成在人线av无码免费看 | 女人和拘做爰正片视频 | 国产成人午夜福利在线播放 | 人妻插b视频一区二区三区 | 国产免费观看黄av片 | 婷婷五月综合激情中文字幕 | 欧美激情综合亚洲一二区 | 东京一本一道一二三区 | 精品久久8x国产免费观看 | 黑森林福利视频导航 | 中文无码伦av中文字幕 | 在线精品国产一区二区三区 | 国产三级久久久精品麻豆三级 | 亚洲成熟女人毛毛耸耸多 | 国产热a欧美热a在线视频 | 国产成人午夜福利在线播放 | 色婷婷久久一区二区三区麻豆 | 亚洲男人av香蕉爽爽爽爽 | 一区二区传媒有限公司 | 亚洲欧美日韩综合久久久 | 色综合视频一区二区三区 | 国产精品久久福利网站 | 久久精品女人的天堂av | 在线 国产 欧美 亚洲 天堂 | 亚洲熟悉妇女xxx妇女av | 国产尤物精品视频 | 国产sm调教视频在线观看 | 国产午夜无码精品免费看 | 欧美日韩人成综合在线播放 | 中文字幕av伊人av无码av | 成人无码精品一区二区三区 | 婷婷五月综合激情中文字幕 | 麻豆av传媒蜜桃天美传媒 | 中文字幕av伊人av无码av | 国模大胆一区二区三区 | 国色天香社区在线视频 | 蜜桃臀无码内射一区二区三区 | 天天做天天爱天天爽综合网 | 免费人成网站视频在线观看 | 99久久精品无码一区二区毛片 | 国产成人精品一区二区在线小狼 | 最近的中文字幕在线看视频 | 免费观看激色视频网站 | 最新版天堂资源中文官网 | 2020最新国产自产精品 | 亚洲天堂2017无码中文 | 天天综合网天天综合色 | 国产精品亚洲五月天高清 | 2019nv天堂香蕉在线观看 | 亚洲成a人一区二区三区 | 中文无码精品a∨在线观看不卡 | 丰满妇女强制高潮18xxxx | 亚洲精品中文字幕乱码 | 精品人妻人人做人人爽夜夜爽 | 日日摸日日碰夜夜爽av | 天下第一社区视频www日本 | 在线欧美精品一区二区三区 | 四虎国产精品一区二区 | 国产成人无码a区在线观看视频app | 亚洲精品国产精品乱码不卡 | 亚洲天堂2017无码中文 | 粉嫩少妇内射浓精videos | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲欧美日韩综合久久久 | 久久国产精品二国产精品 | 国产亚洲人成在线播放 | 成人无码影片精品久久久 | 男女爱爱好爽视频免费看 | 一本久道久久综合婷婷五月 | 亚洲成色在线综合网站 | 一本大道久久东京热无码av | 中文字幕无码av激情不卡 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 蜜桃av抽搐高潮一区二区 | 国语精品一区二区三区 | 国产在热线精品视频 | 日日干夜夜干 | 狠狠cao日日穞夜夜穞av | 久久精品成人欧美大片 | 国产精品久久久久久久影院 | 色狠狠av一区二区三区 | 性色欲情网站iwww九文堂 | 青青草原综合久久大伊人精品 | 国产亚洲精品久久久久久国模美 | 午夜无码人妻av大片色欲 | 三级4级全黄60分钟 | 纯爱无遮挡h肉动漫在线播放 | 人妻互换免费中文字幕 | 欧美成人免费全部网站 | 牲欲强的熟妇农村老妇女视频 | 福利一区二区三区视频在线观看 | 国精产品一品二品国精品69xx | 欧美日韩在线亚洲综合国产人 | 精品国产精品久久一区免费式 | 麻豆国产人妻欲求不满 | 欧美日韩一区二区三区自拍 | 纯爱无遮挡h肉动漫在线播放 | 久久久久久久久888 | 国产精品久久久久久亚洲毛片 | 色 综合 欧美 亚洲 国产 | 精品偷自拍另类在线观看 | 精品厕所偷拍各类美女tp嘘嘘 | 国内精品久久毛片一区二区 | 麻豆精品国产精华精华液好用吗 | 日本www一道久久久免费榴莲 | 国产熟妇高潮叫床视频播放 | 男人扒开女人内裤强吻桶进去 | 色窝窝无码一区二区三区色欲 | √8天堂资源地址中文在线 | 夜夜影院未满十八勿进 | 奇米影视7777久久精品人人爽 | 强辱丰满人妻hd中文字幕 | 免费观看又污又黄的网站 | 无码av中文字幕免费放 | 亚洲区欧美区综合区自拍区 | 久久这里只有精品视频9 | 熟妇女人妻丰满少妇中文字幕 | 欧美激情一区二区三区成人 | 亚洲国产精品久久久天堂 | 玩弄中年熟妇正在播放 | 国产性生大片免费观看性 | 国产真实伦对白全集 | 亚洲熟妇色xxxxx亚洲 | 亚洲码国产精品高潮在线 | 国产亚洲欧美日韩亚洲中文色 | 久久亚洲精品成人无码 | 国产97人人超碰caoprom | 国产手机在线αⅴ片无码观看 | 成人免费视频视频在线观看 免费 | 国产欧美亚洲精品a | 国产精品国产三级国产专播 | 亚洲一区二区观看播放 | 全球成人中文在线 | 国产在热线精品视频 | 国产精品久久久久无码av色戒 | 少妇一晚三次一区二区三区 | 亚洲娇小与黑人巨大交 | yw尤物av无码国产在线观看 | 国产精品亚洲一区二区三区喷水 | 88国产精品欧美一区二区三区 | 色偷偷人人澡人人爽人人模 | 99久久久无码国产aaa精品 | 亚洲国产精品久久人人爱 | 国产国产精品人在线视 | 国产偷国产偷精品高清尤物 | 国产午夜亚洲精品不卡 | 黑人玩弄人妻中文在线 | 国产做国产爱免费视频 | 国内精品一区二区三区不卡 | 十八禁真人啪啪免费网站 | 日韩精品一区二区av在线 | 亚洲色欲色欲天天天www | 亚洲自偷自偷在线制服 | 国产精品永久免费视频 | 国产亚洲视频中文字幕97精品 | 亚洲精品综合一区二区三区在线 | 水蜜桃av无码 | 亚洲精品午夜无码电影网 | 中文字幕+乱码+中文字幕一区 | 人妻体内射精一区二区三四 | 国产三级久久久精品麻豆三级 | 亚洲男人av香蕉爽爽爽爽 | 麻豆国产97在线 | 欧洲 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲中文字幕成人无码 | 乱中年女人伦av三区 | 老太婆性杂交欧美肥老太 | 色综合久久久久综合一本到桃花网 | 成人无码精品1区2区3区免费看 | 人人妻人人澡人人爽欧美一区 | 亚洲欧美日韩国产精品一区二区 | 少妇无码av无码专区在线观看 | 久久 国产 尿 小便 嘘嘘 | 亚洲の无码国产の无码步美 | 97久久精品无码一区二区 | 国产性生交xxxxx无码 | 性生交大片免费看l | 国产精品丝袜黑色高跟鞋 | 人人爽人人爽人人片av亚洲 | 丰满少妇人妻久久久久久 | 国产精品无码一区二区三区不卡 | 7777奇米四色成人眼影 | 狠狠噜狠狠狠狠丁香五月 | 少妇人妻av毛片在线看 | 国产偷自视频区视频 | 久久zyz资源站无码中文动漫 | 亚洲精品久久久久久一区二区 | 日韩少妇内射免费播放 | 国产偷抇久久精品a片69 | 国产成人无码av一区二区 | 亚洲日韩av片在线观看 | aⅴ亚洲 日韩 色 图网站 播放 | 成人免费视频视频在线观看 免费 | 精品一区二区不卡无码av | 欧美一区二区三区 | 人妻无码αv中文字幕久久琪琪布 | 亚洲精品国偷拍自产在线观看蜜桃 | 青草视频在线播放 | 精品 日韩 国产 欧美 视频 | 日日摸夜夜摸狠狠摸婷婷 | 高中生自慰www网站 | 久久精品中文闷骚内射 | 国产真实乱对白精彩久久 | 久久午夜夜伦鲁鲁片无码免费 | 精品成在人线av无码免费看 | 亚洲一区二区三区在线观看网站 | 国产无套粉嫩白浆在线 | 国产精品亚洲综合色区韩国 | 亚洲精品无码人妻无码 | 久久久久免费精品国产 | 亚洲成av人片在线观看无码不卡 | 久久精品国产日本波多野结衣 | 内射爽无广熟女亚洲 | 鲁一鲁av2019在线 | 撕开奶罩揉吮奶头视频 | 东京一本一道一二三区 | 精品久久久久久人妻无码中文字幕 | 亚洲国产精品久久久天堂 | 国产麻豆精品精东影业av网站 | 国内老熟妇对白xxxxhd | 又黄又爽又色的视频 | 亚洲国产午夜精品理论片 | 双乳奶水饱满少妇呻吟 | 熟女体下毛毛黑森林 | 色妞www精品免费视频 | 国产av一区二区精品久久凹凸 | 亚洲区小说区激情区图片区 | 男人和女人高潮免费网站 | 欧美真人作爱免费视频 | 免费人成网站视频在线观看 | 福利一区二区三区视频在线观看 | 99视频精品全部免费免费观看 | 性色欲情网站iwww九文堂 | 999久久久国产精品消防器材 | 中文字幕av日韩精品一区二区 | 久久久婷婷五月亚洲97号色 | 国产精品美女久久久久av爽李琼 | 夜夜夜高潮夜夜爽夜夜爰爰 | 九一九色国产 | 日本丰满护士爆乳xxxx | 国产美女精品一区二区三区 | 国产成人综合色在线观看网站 | 久久久无码中文字幕久... | 乱码av麻豆丝袜熟女系列 | 人人爽人人爽人人片av亚洲 | 天天拍夜夜添久久精品 | 精品久久综合1区2区3区激情 | 人人妻人人澡人人爽人人精品 | 给我免费的视频在线观看 |