精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何監(jiān)聽(tīng)頁(yè)面 DOM 變動(dòng)并高效響應(yīng)

開(kāi)發(fā) 前端
最近在做 chrome 插件開(kāi)發(fā),既然是插件那就難免不對(duì)現(xiàn)有頁(yè)面做一些控制,比如事件監(jiān)聽(tīng)、調(diào)整布局、對(duì) DOM 元素的增刪改查等等。其中有一個(gè)需求比較有意思,便整理一下順便把涉及到的知識(shí)點(diǎn)復(fù)習(xí)一遍。

最近在做 chrome 插件開(kāi)發(fā),既然是插件那就難免不對(duì)現(xiàn)有頁(yè)面做一些控制,比如事件監(jiān)聽(tīng)、調(diào)整布局、對(duì) DOM 元素的增刪改查等等。其中有一個(gè)需求比較有意思,便整理一下順便把涉及到的知識(shí)點(diǎn)復(fù)習(xí)一遍。

需求是這樣的:在一個(gè)包含懶加載資源以及動(dòng)態(tài) DOM 元素生成的頁(yè)面中,需要針對(duì)頁(yè)面中存在的元素添加屬性顯示標(biāo)簽。

從 DOM 變動(dòng)事件監(jiān)聽(tīng)說(shuō)起

首先假設(shè)大家已經(jīng)知道 JavaScript 中事件的發(fā)生階段(捕獲-***-冒泡),附上一張圖帶過(guò)這個(gè)內(nèi)容,我們直接進(jìn)入尋找解決方法的過(guò)程。

 

Graphical representation of an event dispatched in a DOM tree using the DOM event flow

開(kāi)始的時(shí)候我一直在 window 狀態(tài)改變涉及到的事件中尋找,一圈搜尋下來(lái)發(fā)現(xiàn)也就 onload 事件最接近了,所以我們看看 MDN 對(duì)該事件的定義:

The load event is fired when a resource and its dependent resources have finished loading.

怎么理解資源及其依賴資源已加載完畢呢?簡(jiǎn)單來(lái)說(shuō),如果一個(gè)頁(yè)面涉及到圖片資源,那么 onload 事件會(huì)在頁(yè)面完全載入(包括圖片、css文件等等)后觸發(fā)。一個(gè)簡(jiǎn)單的監(jiān)聽(tīng)事件用 JavaScript 應(yīng)該這樣書(shū)寫(xiě)(注意不同環(huán)境下 load 和 onload 的差異):

  1. <script> 
  2.  
  3.   window.addEventListener("load"function(event) { 
  4.  
  5.     console.log("All resources finished loading!"); 
  6.  
  7.   }); 
  8.  
  9.    
  10.  
  11.   // or 
  12.  
  13.   window.onload=function(){ 
  14.  
  15.     console.log("All resources finished loading!"); 
  16.  
  17.   }; 
  18.  
  19.    
  20.  
  21.   // HTML 
  22.  
  23. < body onload="SomeJavaScriptCode"
  24.  
  25.    
  26.  
  27.   // jQuery 
  28.  
  29.   $( window ).on"load", handler ) 
  30.  
  31. </script>  

當(dāng)然,說(shuō)到 onload 事件,有一個(gè) jQuery 中相似的事件一定會(huì)被提及—— ready 事件。jQuery 中這樣定義這個(gè)事件:

Specify a function to execute when the DOM is fully loaded.

需要知道的是 jQuery 定義的 ready 事件實(shí)質(zhì)上是為 DOMContentLoaded 事件設(shè)計(jì)的,所以當(dāng)我們談?wù)摷虞d時(shí)應(yīng)該區(qū)分的事件其實(shí)是 onload(接口 UIEvent) 以及 DOMContentLoaded(接口 Event),MDN 這樣描述 DOMContentLoaded:

當(dāng)初始HTML文檔被完全加載和解析時(shí),DOMContentLoaded 事件被觸發(fā),而無(wú)需等待樣式表、圖像和子框架完成加載。另一個(gè)不同的事件 load 應(yīng)該僅用于檢測(cè)一個(gè)完全加載的頁(yè)面。

所以可以知道,當(dāng)一個(gè)頁(yè)面加載時(shí)應(yīng)先觸發(fā) DOMContentLoaded 然后才是 onload. 類似的事件及區(qū)別包括以下幾類:

  • DOMContentLoaded: 當(dāng)初始HTML文檔被完全加載和解析時(shí),DOMContentLoaded 事件被觸發(fā),而無(wú)需等待樣式表、圖像和子框架完成加載;
  • readystatechange: 一個(gè)document 的 Document.readyState 屬性描述了文檔的加載狀態(tài),當(dāng)這個(gè)狀態(tài)發(fā)生了變化,就會(huì)觸發(fā)該事件;
  • load: 當(dāng)一個(gè)資源及其依賴資源已完成加載時(shí),將觸發(fā)load事件;
  • beforeunload: 當(dāng)瀏覽器窗口,文檔或其資源將要卸載時(shí),會(huì)觸發(fā)beforeunload事件。
  • unload: 當(dāng)文檔或一個(gè)子資源正在被卸載時(shí), 觸發(fā) unload事件。

細(xì)心點(diǎn)會(huì)發(fā)現(xiàn)上面在介紹事件時(shí)提到了 UIEvent 以及 Event,這是什么呢?這些都是事件——可以被 JavaScript 偵測(cè)到的行為。其他的事件接口還包括 KeyboardEvent / VRDisplayEvent (是的,沒(méi)錯(cuò),這就是你感興趣且熟知的那個(gè) VR)等等;如果在搜索引擎中稍加搜索,你會(huì)發(fā)現(xiàn)有些資料里寫(xiě)到事件可以分為以下幾類:

  • UI事件
  • 焦點(diǎn)事件
  • 鼠標(biāo)與滾輪事件
  • 鍵盤(pán)與文本事件
  • 復(fù)合事件
  • 變動(dòng)事件
  • HTML5 事件
  • 設(shè)備事件
  • 觸摸與手勢(shì)事件

但這樣寫(xiě)實(shí)在有些凌亂,其中一些是 DOM3 定義的事件,有一些是單獨(dú)列出的事件,如果你覺(jué)得熟悉那么你會(huì)發(fā)現(xiàn)這是 JavaScript 高級(jí)程序設(shè)計(jì)里的敘述模式,在我看來(lái),理解這些事件可以按照 DOM3 事件以及其他事件來(lái)做區(qū)分:其中,DOM3 級(jí)事件規(guī)定了以下幾類事件 – UI 事件, 焦點(diǎn)事件, 鼠標(biāo)事件, 滾輪事件, 文本事件, 鍵盤(pán)事件, 合成事件, 變動(dòng)事件, 變動(dòng)名稱事件; 而剩下的例如 HTML5 事件可以單獨(dú)做了解。而剛開(kāi)始提到的 Event 作為一個(gè)主要接口,是很多事件的實(shí)現(xiàn)父類。有關(guān) Web API 接口可以在這里查到,里面可以看到有很多 Event 字眼。

好吧,事件說(shuō)了這么多,我們還是沒(méi)有解決剛開(kāi)始提出的問(wèn)題,如果監(jiān)聽(tīng)頁(yè)面中動(dòng)態(tài)生成的元素呢?想到動(dòng)態(tài)生成的元素都是需要通過(guò)網(wǎng)絡(luò)請(qǐng)求獲取資源的,那么是否可以監(jiān)聽(tīng)所有 HTTP 請(qǐng)求呢?查看 jQuery 文檔可以知道每當(dāng)一個(gè)Ajax請(qǐng)求完成,jQuery 就會(huì)觸發(fā) ajaxComplete 事件,在這個(gè)時(shí)間點(diǎn)所有處理函數(shù)會(huì)使用 .ajaxComplete() 方法注冊(cè)并執(zhí)行。但是誰(shuí)能保證所有 ajax 都從 jQuery 走呢?所以應(yīng)該在變動(dòng)事件中做出選擇,我們來(lái)看看 DOM2 定義的如下變動(dòng)事件:

  • DOMSubtreeModified: 在DOM結(jié)構(gòu)發(fā)生任何變化的時(shí)候。這個(gè)事件在其他事件觸發(fā)后都會(huì)觸發(fā);
  • DOMNodeInserted: 當(dāng)一個(gè)節(jié)點(diǎn)作為子節(jié)點(diǎn)被插入到另一個(gè)節(jié)點(diǎn)中時(shí)觸發(fā);
  • DOMNodeRemoved: 在節(jié)點(diǎn)從其父節(jié)點(diǎn)中移除時(shí)觸發(fā);
  • DOMNodeInsertedIntoDocument: 在一個(gè)節(jié)點(diǎn)被直接插入文檔或通過(guò)子樹(shù)間接插入文檔之后觸發(fā)。這個(gè)事件在 DOMNodeInserted 之后觸發(fā);
  • DOMNodeRemovedFromDocument: 在一個(gè)節(jié)點(diǎn)被直接從文檔移除或通過(guò)子樹(shù)間接從文檔移除之前觸發(fā)。這個(gè)事件在 DOMNodeRemoved 之后觸發(fā);
  • DOMAttrModified: 在特性被修改之后觸發(fā);
  • DOMCharacterDataModified: 在文本節(jié)點(diǎn)的值發(fā)生變化時(shí)觸發(fā);

所以,用 DOMSubtreeModified 好像沒(méi)錯(cuò)。師兄旁邊提醒,用 MutationObserver, 于是又搜到了一個(gè)新大陸。MDN 這樣描述 MutationObserver:

MutationObserver給開(kāi)發(fā)者們提供了一種能在某個(gè)范圍內(nèi)的DOM樹(shù)發(fā)生變化時(shí)作出適當(dāng)反應(yīng)的能力.該API設(shè)計(jì)用來(lái)替換掉在DOM3事件規(guī)范中引入的Mutation事件.

DOM3 事件規(guī)范中的 Mutation 事件可以被簡(jiǎn)單看成是 DOM2 事件規(guī)范中定義的 Mutation 事件的一個(gè)擴(kuò)展,但是這些都不重要了,因?yàn)樗麄兌家?MutationObserver 替代了。好了,那么來(lái)詳細(xì)介紹一下 MutationObserver 吧。文章《Mutation Observer API》對(duì) MutationObserver 的用法介紹的比較詳細(xì),所以我挑幾點(diǎn)能直接解決我們需求的說(shuō)一說(shuō)。

既然要監(jiān)聽(tīng) DOM 的變化,我們來(lái)看看 Observer 的作用都有哪些:

它等待所有腳本任務(wù)完成后,才會(huì)運(yùn)行,即采用異步方式。

它把 DOM 變動(dòng)記錄封裝成一個(gè)數(shù)組進(jìn)行處理,而不是一條條地個(gè)別處理 DOM 變動(dòng)。

它既可以觀察發(fā)生在 DOM 的所有類型變動(dòng),也可以觀察某一類變動(dòng)。

MutationObserver 的構(gòu)造函數(shù)比較簡(jiǎn)單,傳入一個(gè)回調(diào)函數(shù)即可(回調(diào)函數(shù)接受兩個(gè)參數(shù),***個(gè)是變動(dòng)數(shù)組,第二個(gè)是觀察器實(shí)例):

  1. let observer = new MutationObserver(callback); 

觀察器實(shí)例使用 observe 方法來(lái)監(jiān)聽(tīng), disconnect 方法停止監(jiān)聽(tīng),takeRecords 方法來(lái)清除變動(dòng)記錄。

  1. let article = document.body; 
  2.  
  3.   
  4.  
  5. let  options = { 
  6.  
  7.   'childList'true
  8.  
  9.   'attributes':true 
  10.  
  11. } ; 
  12.  
  13.   
  14.  
  15. observer.observe(article, options);  

observe 方法中***個(gè)參數(shù)是所要觀察的變動(dòng) DOM 元素,第二個(gè)參數(shù)則接收所要觀察的變動(dòng)類型(子節(jié)點(diǎn)變動(dòng)和屬性變動(dòng))。變動(dòng)類型包括以下幾種:

  • childList:子節(jié)點(diǎn)的變動(dòng)。
  • attributes:屬性的變動(dòng)。
  • characterData:節(jié)點(diǎn)內(nèi)容或節(jié)點(diǎn)文本的變動(dòng)。
  • subtree:所有后代節(jié)點(diǎn)的變動(dòng)。

想要觀察哪一種變動(dòng)類型,就在 option 對(duì)象中指定它的值為 true。需要注意的是,如果設(shè)置觀察 subtree 的變動(dòng),必須同時(shí)指定 childList、attributes 和 characterData 中的一種或多種。disconnect 方法和 takeRecords 方法則直接調(diào)用即可,無(wú)傳入?yún)?shù)。

好的,我們已經(jīng)搞定了 DOM 變動(dòng)的監(jiān)聽(tīng),將代碼刷新一下看下效果吧,因?yàn)轫?yè)面由很多動(dòng)態(tài)生成的商品組成,那么我應(yīng)該在 body 上添加變動(dòng)監(jiān)聽(tīng),所以 options 應(yīng)該這樣設(shè)置:

  1. var options = { 
  2.  
  3.   'attributes'true
  4.  
  5.   'subtree'true 
  6.  
  7.  

咦?頁(yè)面往下拉一小點(diǎn)就觸發(fā)了 observer 幾十次?這樣 DOM 哪吃得消啊,查看了頁(yè)面的變動(dòng)記錄發(fā)現(xiàn)每次新進(jìn)的資源底層都調(diào)用了 Node.insertBefore() 方法…

再聊聊 JavaScript 中的截流/節(jié)流函數(shù)

現(xiàn)在遇到的一個(gè)麻煩是, DOM 變動(dòng)太頻繁了,如果每次變動(dòng)都監(jiān)聽(tīng)那真是太耗費(fèi)資源了。一個(gè)簡(jiǎn)單的解決辦法是我就放棄監(jiān)聽(tīng)了,而采用 setInterval 方法定時(shí)執(zhí)行更新邏輯。是的,雖然方法原始了一點(diǎn),但是性能上比 Observer “改進(jìn)”了不少。

這個(gè)時(shí)候,又來(lái)了師兄的助攻:“用用截流函數(shù)”。記起之前看《JavaScript 語(yǔ)言精粹》的時(shí)候看到是用 setTimeout 方法自調(diào)用來(lái)解決 setInteval 的頻繁執(zhí)行吃資源的現(xiàn)象,不知道兩者是不是有關(guān)聯(lián)。網(wǎng)上一查發(fā)現(xiàn)有兩個(gè)“jie流函數(shù)”。需求來(lái)自于這里:

在前端開(kāi)發(fā)中,頁(yè)面有時(shí)會(huì)綁定scroll或resize事件等頻繁觸發(fā)的事件,也就意味著在正常的操作之內(nèi),會(huì)多次調(diào)用綁定的程序,然而有些時(shí)候javascript需要處理的事情特別多,頻繁出發(fā)就會(huì)導(dǎo)致性能下降、成頁(yè)面卡頓甚至是瀏覽器奔潰。

如果重復(fù)利用 setTimeout 和 clearTimeout 方法,我們好像可以解決這個(gè)頻繁觸發(fā)的執(zhí)行。每次事件觸發(fā)的時(shí)候我首先判斷一下當(dāng)前有沒(méi)有一個(gè) setTimeout 定時(shí)器,如果有的話我們先將它清除,然后再新建一個(gè) setTimeout 定時(shí)器來(lái)延遲我的響應(yīng)行為。這樣聽(tīng)上去還不錯(cuò),因?yàn)槲覀兠看味疾涣⒓磮?zhí)行我們的響應(yīng),而頻繁觸發(fā)過(guò)程我們又能保持響應(yīng)函數(shù)一直存在(且只存在一個(gè)),除了會(huì)有些延遲響應(yīng)外,沒(méi)什么不好的。是的這就是截流函數(shù)(debounce),有一篇博客用這個(gè)小故事介紹它:

形像的比喻是橡皮球。如果手指按住橡皮球不放,它就一直受力,不能反彈起來(lái),直到松手。debounce 的關(guān)注點(diǎn)是空閑的間隔時(shí)間。

在我的業(yè)務(wù)中,在 observer 實(shí)例中調(diào)用下面寫(xiě)的這個(gè)截流函數(shù)就可以啦

  1. /** 
  2.  
  3. * fn 執(zhí)行函數(shù) 
  4.  
  5. * context 綁定上下文 
  6.  
  7. * timeout 延時(shí)數(shù)值 
  8.  
  9. **/ 
  10.  
  11. let debounce = function(fn, context, timeout) { 
  12.  
  13. let timer; 
  14.  
  15.      
  16.  
  17.     // 利用閉包將內(nèi)容傳遞出去 
  18.  
  19. return function() { 
  20.  
  21.   if (timer) { 
  22.  
  23.     // 清除定時(shí)器 
  24.  
  25.     clearTimeout(timer); 
  26.  
  27.   } 
  28.  
  29.   // 設(shè)置一個(gè)新的定時(shí)器 
  30.  
  31.   timer = setTimeout(function(){ 
  32.  
  33.   fn.apply(context, arguments) 
  34.  
  35.   }, timeout); 
  36.  
  37.  } 
  38.  
  39.  

當(dāng)然,解決了自己的問(wèn)題,但還有一個(gè)概念沒(méi)有說(shuō)到——“節(jié)流函數(shù)”。同一篇博文里也使用了一個(gè)例子來(lái)說(shuō)明它:

形像的比喻是水龍頭或機(jī)槍,你可以控制它的流量或頻率。throttle 的關(guān)注點(diǎn)是連續(xù)的執(zhí)行間隔時(shí)間。

函數(shù)節(jié)流的原理也挺簡(jiǎn)單,一樣還是定時(shí)器。當(dāng)我觸發(fā)一個(gè)時(shí)間時(shí),先setTimout讓這個(gè)事件延遲一會(huì)再執(zhí)行,如果在這個(gè)時(shí)間間隔內(nèi)又觸發(fā)了事件,那我們就清除原來(lái)的定時(shí)器,再setTimeout一個(gè)新的定時(shí)器延遲一會(huì)執(zhí)行。函數(shù)節(jié)流的出發(fā)點(diǎn),就是讓一個(gè)函數(shù)不要執(zhí)行得太頻繁,減少一些過(guò)快的調(diào)用來(lái)節(jié)流。這里用 AlloyTeam 的節(jié)流代碼實(shí)現(xiàn)來(lái)解釋:

  1. // 參數(shù)同上 
  2.  
  3. var throttle = function(fn, delay, mustRunDelay){ 
  4.  
  5.  var timer = null
  6.  
  7.  var t_start; 
  8.  
  9.  return function(){ 
  10.  
  11.     var context = this, args = arguments, t_curr = +new Date(); 
  12.  
  13.      
  14.  
  15.     // 清除定時(shí)器 
  16.  
  17.     clearTimeout(timer); 
  18.  
  19.      
  20.  
  21.     // 函數(shù)初始化判斷 
  22.  
  23.     if(!t_start){ 
  24.  
  25.         t_start = t_curr; 
  26.  
  27.     } 
  28.  
  29.      
  30.  
  31.     // 超時(shí)(指定的時(shí)間間隔)判斷 
  32.  
  33.     if(t_curr - t_start >= mustRunDelay){ 
  34.  
  35.         fn.apply(context, args); 
  36.  
  37.         t_start = t_curr; 
  38.  
  39.     } 
  40.  
  41.     else { 
  42.  
  43.         timer = setTimeout(function(){ 
  44.  
  45.             fn.apply(context, args); 
  46.  
  47.         }, delay); 
  48.  
  49.     } 
  50.  
  51.  }; 
  52.  
  53. };  

當(dāng)然,AlloyTeam 那篇文章將這里所說(shuō)的截流函數(shù)作為節(jié)流函數(shù)的 V1.0 版本,你也可以這樣認(rèn)為。畢竟,設(shè)置了必然觸發(fā)執(zhí)行的時(shí)間間隔(即 mustRunDelay 函數(shù)),可以使得截流函數(shù)不會(huì)在“瘋狂事件”情況下無(wú)止境的循環(huán)下去。

Observer 和截流函數(shù)一結(jié)合,問(wèn)題解決啦嘿嘿。當(dāng)然還有很多坑,下次再開(kāi)一篇說(shuō)說(shuō)吧。

參考

  • https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
  • https://developer.mozilla.org/zh-CN/docs/Web/Events/load
  • https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener
  • http://www.cnblogs.com/fsjohnhuang/p/4147810.html
  • http://www.alloyteam.com/2012/11/javascript-throttle/
責(zé)任編輯:龐桂玉 來(lái)源: 前端大全
相關(guān)推薦

2017-10-17 15:40:25

javascript刷新頁(yè)面

2013-02-21 09:54:12

響應(yīng)式重構(gòu)Web

2022-05-16 08:09:45

前端API

2021-01-11 07:51:16

DOM對(duì)象節(jié)點(diǎn)樹(shù)

2023-11-21 16:02:56

2021-01-18 07:15:22

虛擬DOM真實(shí)DOMJavaScript

2024-01-15 09:23:16

框架方式原生

2010-09-28 14:44:56

遍歷DOM

2018-10-24 15:33:49

單屏頁(yè)面適配玩

2021-09-03 13:35:54

服務(wù)器服務(wù)器蔓延管理服務(wù)器

2012-12-27 09:49:21

Web響應(yīng)式

2023-08-31 08:28:13

Java應(yīng)用

2011-10-21 09:06:41

Better Net銳捷網(wǎng)絡(luò)

2020-10-22 10:17:27

敏捷性高級(jí)合伙人CIO

2023-08-08 13:51:13

Gherkin開(kāi)發(fā)

2021-07-14 09:45:24

設(shè)計(jì)師約束布局界面布局

2021-04-09 18:01:03

前端ReactDOM

2010-09-08 16:50:11

JavaScriptDOM操作

2025-02-08 09:02:09

2022-01-12 09:43:20

惡意軟件iPhone攻擊
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

中文字幕在线导航| 欧美私人啪啪vps| 亚洲深夜激情| 欧美午夜在线一二页| 久久精品国产久精国产一老狼 | 91精品中文字幕| 国产精品久久久久久久久久白浆 | 少妇视频在线播放| 黑人另类精品××××性爽| 久久国产精品免费精品3p| 国产视频在线观看一区二区三区| 久久久精品国产亚洲| 人妻体体内射精一区二区| 岛国在线视频免费看| 午夜久久99| 欧美三级一区二区| 国产成人在线观看免费网站| 亚洲影视在线观看| 国产日产久久高清欧美一区| 国产精品入口麻豆| caoporn国产精品免费视频| 欧美另类专区| 亚洲香蕉成视频在线观看| 国产高清www| 国产三区在线播放| 91久久国产| 欧美日韩亚洲高清一区二区| 免费看黄在线看| 色综合视频在线| 在线观看亚洲| 欧美哺乳videos| 97久久国产亚洲精品超碰热| 国产区精品在线| 老司机久久99久久精品播放免费| 亚洲国产精品字幕| 午夜精品久久久久久久无码| 亚洲第一页视频| 在线电影一区二区| 欧美sm极限捆绑bd| 一区二区三区国产好的精华液| 久久久久久久久免费视频| 久久精品999| 久久久国产影院| 一区二区三区在线观看免费视频| 97人人做人人爽香蕉精品| 日韩精品水蜜桃| 欧美激情电影| 一本久道中文字幕精品亚洲嫩| 国产精品视频最多的网站| 欧美大片免费播放器| 午夜伦理在线视频| 久久av中文字幕片| 一本色道久久88综合日韩精品 | 成人激情免费视频| 日韩欧美中文字幕在线观看| 成人h视频在线观看| 欧美成人黄色网| 成人网av.com/| 色婷婷综合久久久久中文| 日韩欧美猛交xxxxx无码| 97精品人妻一区二区三区| 久久人人97超碰国产公开结果| 九九精品在线观看| www.日本久久| 性欧美gay| 粉嫩久久99精品久久久久久夜| 欧美精品一区二区三区蜜桃| 亚洲成人精品电影在线观看| 九九热国产精品视频| 日韩欧美中文字幕一区二区三区| 一区二区三区四区蜜桃| 91国产丝袜在线放| 免费三片在线播放| 欧美1区免费| 久久国产精品久久久| 精品激情国产视频| 久草精品在线播放| 国产suv一区二区| 欧美有码视频| 久久精品国产成人精品| 欧美老熟妇一区二区三区| 99re6这里只有精品| xxx欧美精品| 深夜做爰性大片蜜桃| av毛片在线免费| 国产999精品久久| 2014国产精品| 不卡的日韩av| 久久久xxx| 中文字幕亚洲欧美日韩高清| 久久黄色免费看| eeuss影院在线观看| 26uuu国产日韩综合| 国产精品一区二区在线| 最新国产中文字幕| 亚洲精品小说| 亚洲国产另类 国产精品国产免费| 国产亚洲精品成人a| 国偷自产视频一区二区久| 精品亚洲永久免费精品| 一本岛在线视频| 欧美日韩经典丝袜| 国产精品免费免费| 亚洲一区二区三区成人在线视频精品 | 一区二区三区天堂av| 亚洲欧洲综合网| 激情久久一区二区| 这里只有精品电影| 亚洲精品无码国产| 桃色av一区二区| 日韩美女视频19| 久久综合狠狠综合久久综青草| 欧美女优在线| 久草这里只有精品视频| 97视频中文字幕| 免费毛片在线| 亚洲免费高清视频在线| 日本国产在线播放| 丁香婷婷久久| 亚洲国产日韩欧美综合久久| a天堂视频在线观看| 91视频精品| 91av视频在线免费观看| 国产又粗又猛又爽又黄视频| 亚洲一区图片| 国自产精品手机在线观看视频| 亚洲婷婷综合网| 欧美日韩国产精品一区二区亚洲| 欧美在线一区二区三区四| 一级性生活免费视频| 神马影视一区二区| 欧美人在线视频| 亚洲中文无码av在线| 国产揄拍国内精品对白| 麻豆av一区| 成人性生交大片免费看网站| 日韩高清二区| 欧美精品乱码久久久久久| 星空大象在线观看免费播放| 亚洲视频电影在线| 国产精品免费一区| 手机亚洲第一页| 亚洲日本一区二区| 亚洲乱码中文字幕久久孕妇黑人| 国产理论在线观看| 欧洲av一区二区嗯嗯嗯啊| 国产成人精品视频免费看| 爱情岛论坛亚洲品质自拍视频网站| 欧美性猛片aaaaaaa做受| xxxxxx黄色| 欧美三区在线| 亚洲一区二区三区视频播放| 国产福利在线看| 一本一道久久a久久精品 | 久草热8精品视频在线观看| 日韩精品在在线一区二区中文 | 精品夜色国产国偷在线| 久热精品在线观看| 国产精品免费看| 高清不卡日本v二区在线| 中文字幕精品在线观看| 久久综合中文字幕| 日本欧洲国产一区二区| 国产区在线视频| 欧美日韩国产精品专区| 久久这里只有精品18| 免费观看亚洲视频大全| 精品免费一区二区三区| 国产精品三区在线观看| 激情亚洲综合在线| 亚洲免费视频播放| 精品视频一区二区三区在线观看| 久久久精品2019中文字幕神马| 国产乱码精品一区二三区蜜臂 | 97久久人人超碰| 超碰97在线资源| 91麻豆免费在线视频| 欧美一区二区三区小说| 污污免费在线观看| 国产精品地址| 精品91免费| 日韩欧美亚洲系列| 久久九九全国免费| 十八禁视频网站在线观看| 久久超碰99| 国产精品综合久久久| 久草免费在线| 精品国产乱码久久久久久1区2区| 成年人午夜视频| 久久久蜜臀国产一区二区| 精品久久久噜噜噜噜久久图片 | 精品三级av在线| 久久久久久久久精| 99国产精品久久久久| 国产成人av影视| 午夜久久免费观看| 国产精品日韩一区二区免费视频| 九色porny自拍视频在线观看| 国产视频精品xxxx| 久久一区二区三区视频| 国产精品网站导航| 一级黄色免费毛片| 一本久道久久久| 亚洲午夜精品久久久久久浪潮| 黄色污污视频在线观看| 日韩av最新在线观看| 欧美日韩黄色网| 日韩亚洲国产精品| 日韩亚洲不卡在线| 精品午夜视频| 欧美亚洲成人精品| 水蜜桃亚洲精品| 久久久pmvav| 色综合一个色综合| 欧美国产日韩综合| 久久久久99精品一区| 国产乱女淫av麻豆国产| 国产精品免费大片| 性色av一区二区三区在线观看| 国产毛片毛片毛片毛片毛片| 午夜激情久久久| 国精品人伦一区二区三区蜜桃| 丁香另类激情小说| 亚洲国产精品三区| 亚洲人体大胆视频| 国产有码一区二区| 91吃瓜在线观看| 日韩日本欧美亚洲| 视频二区在线观看| 日韩精品最新网址| 久久久国产精华液| 中文字幕欧美区| 黄色性视频网站| 极品美女销魂一区二区三区| 精品人妻一区二区三区四区在线| 在线成人直播| 亚洲午夜精品国产| 国产一区网站| 91在线看网站| 国产精品国产三级在线观看| 国产成人精品在线| 亚洲精品永久免费视频| 欧美大学生性色视频| 日本中文字幕在线看| 欧美日韩一区免费| 免费无码毛片一区二区app| 国产精品黄色在线观看| 四虎国产精品成人免费入口| 99re亚洲国产精品| 亚洲成人av免费观看| 久久99久久久欧美国产| 国产麻花豆剧传媒精品mv在线| 乱人伦精品视频在线观看| 18黄暴禁片在线观看| 91精品久久久久久久久久不卡| 深田咏美在线x99av| 国产乱码精品一区二区亚洲| 久久riav二区三区| 精品综合久久88少妇激情| 91精品黄色| 日韩欧洲国产| 婷婷久久综合九色综合绿巨人| 久久精品无码中文字幕| 我不卡手机影院| 欧美爱爱视频网站| 97视频精品| 中文字幕在线观看一区二区三区| 久久社区一区| 中文字幕免费在线不卡| 91亚洲一区| 一区二区不卡在线观看| 国产精品99视频| 欧美日韩午夜爽爽| 亚洲国产1区| 少妇av一区二区三区无码| 亚洲午夜av| 国产极品粉嫩福利姬萌白酱| 国产精品久久777777毛茸茸| 国产免费黄色av| 三级欧美在线一区| 天天爽天天爽夜夜爽| 另类小说一区二区三区| 久久婷五月综合| 懂色av一区二区三区免费观看| 少妇被狂c下部羞羞漫画| 成人a免费在线看| 一色道久久88加勒比一| 欧美激情一区二区在线| 无套内谢丰满少妇中文字幕| 国产最新精品免费| 中国特级黄色片| 99精品久久免费看蜜臀剧情介绍| 人妻精品久久久久中文| 中文无字幕一区二区三区 | 中文字幕亚洲专区| 成人毛片av在线| 羞羞色国产精品| 国产精品777777在线播放| 国产精品香蕉视屏| 精品久久久久久久久久久aⅴ| 国产一区私人高清影院| 日韩激情欧美| 免费日韩av电影| 91久久久精品国产| 亚洲国产一二三| 久草综合在线视频| 亚洲国产日韩精品| 成年人免费高清视频| 欧美日韩视频在线第一区| 成人午夜免费在线观看| 亚洲人精选亚洲人成在线| av网站免费在线观看| 欧美最顶级的aⅴ艳星| 成人短视频软件网站大全app| 99久久久精品免费观看国产| 婷婷精品在线观看| 国产欧美一区二区三区四区| 日韩精品一区二区三区中文字幕| 免费在线一区二区| 欧美日本三区| 欧美一级特黄a| 99re热视频这里只精品| 国产中文av在线| 亚洲福利电影网| 国内精品久久久久久久久久| 伊人亚洲福利一区二区三区| av剧情在线观看| 91免费看片在线| 国内精品伊人久久久| 久艹在线免费观看| 老牛影视一区二区三区| 看全色黄大色黄女片18| 亚洲女同ⅹxx女同tv| www.久久久久久久| 亚洲欧美国产另类| av人人综合网| 99re视频在线| 亚洲国产精品日韩专区av有中文| 日本中文字幕高清| 26uuu久久天堂性欧美| 国产网址在线观看| 一二三四社区欧美黄| 在线观看免费国产视频| 精品成人私密视频| 在线播放蜜桃麻豆| 成人写真福利网| 色综合色综合| 亚洲国产日韩欧美在线观看| 久久久久久久综合色一本| 日韩精品无码一区二区| 91精品国产综合久久福利软件| 日韩成人影视| 成人黄色在线播放| 成人国产精品久久久网站| 国产精品你懂的| 免费黄色小视频在线观看| 色婷婷狠狠综合| 天堂视频中文在线| 久久全国免费视频| 7777精品| 日韩av片在线看| 2023国产精品| 国产午夜无码视频在线观看| 亚洲欧美精品一区| 国产精品论坛| 欧美日韩一区二区三区在线视频| 久久精品盗摄| 丰满大乳奶做爰ⅹxx视频| 欧美性极品xxxx娇小| 欧美孕妇孕交| 国产精品白丝jk喷水视频一区| 日韩av在线中文字幕| 五月天开心婷婷| 一区二区三区国产| 污视频网站免费观看| 欧美在线视频免费| 欧美限制电影| 日韩精品你懂的| 一区二区不卡在线播放| 日本免费一区视频| 亚洲欧美综合图区| 亚洲一区二区三区四区| 日韩国产精品一区二区| 久久成人免费网| 欧美黑吊大战白妞| 亚洲第一综合天堂另类专| 全球最大av网站久久| 国产麻豆电影在线观看| 成人性生交大片免费看中文| 国产成人愉拍精品久久| 一区二区三区久久精品| 成年永久一区二区三区免费视频| 国产成人精品免费视频大全最热| 精品动漫3d一区二区三区免费版| 日韩 中文字幕| 欧美另类变人与禽xxxxx| 三级网站视频在在线播放| 欧美二区在线看| 国产在线精品免费av| 岛国av中文字幕|