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

編寫高性能的JavaScript事件

開發 前端
如何能做出高效的web前端程序是我每次做前端開發都會不自覺去考慮的問題。幾年前雅虎里牛逼的前端工程師們出了一本關于提升web前端性能的書籍,轟動了整個web開發技術界,讓神秘的web前端優化問題成為了大街的白菜。

如何能做出高效的web前端程序是我每次做前端開發都會不自覺去考慮的問題。幾年前雅虎里牛逼的前端工程師們出了一本關于提升web前端性能的書籍,轟動了整個web開發技術界,讓神秘的web前端優化問題成為了大街的白菜,web前端優化變成了菜鳥和大牛都能回答的簡單問題,當整個業界都知道了驚天秘密的答案,那么現有的優化技術已經不能對你開發的網站產生的質的飛越,為了讓我們開發的網站性能比別人的網站更加優秀,我們需要更加深入的獨立思考,儲備更加優秀的技能。

Javascript里的事件系統是我想到的***個突破點。為什么會是javascript的事件系統呢?我們都知道web前端包含三個技術:html、css和javascript,html和css如何結合真是一目了然:style、class、id以及html標簽,這個沒啥好講的,但是javascript是如何切入到html和css中間,讓三者融合呢?***我發現這個切入點就是javascript的事件系統,不管我們寫多長多復雜的javascript代碼,最終都是通過事件系統體現在html和css上,因此我就在想既然事件系統是三者融合的切入點,那么一個頁面里,特別是當今越來越復雜的網頁里必然會有大量事件操作,沒有這些事件我們精心編寫的javascript代碼只有刀槍入庫,英雄無用武之地了。既然頁面會存在大量事件函數,那么我們按習慣寫事件函數,會存在影響效率的問題嗎?我研究下來的答案是真有效率問題,而且還是嚴重的效率問題。

為了說清楚我的答案,我要先詳細講解下javascript的事件系統。

事件系統是javascript和html以及css融合的切入點,這個切人點好比java里的main函數,一切神奇都是由這里開始,那么瀏覽器是如何完成這種切入呢?我研究下來一共有3種方式,它們分別是:

方式一:html事件處理

html事件處理就是將事件函數直接寫在html標簽里,因為這種寫法和html標簽緊耦合,所以稱為html事件處理。例如下面代碼:

  1. <input type="button" id="btn" name="btn" onclick="alert('Click Me!')"/> 

如果click事件函數復雜了,這么寫代碼肯定會帶來不便,因此我們常常把函數寫在外部,onclick直接調用函數名,例如:

  1. <input type="button" id="btn" name="btn" onclick="btnClk()"/> 
  2.  
  3. function btnClk(){ 
  4.  
  5.          alert("click me!");    
  6.  

上面這個寫法是一種很美的寫法,所以時下還是很多人會不自覺的使用它,但是也許很多人不知道,后一種寫法其實沒有前一種寫法健壯,這個也是我前不久在研究非阻塞加載腳本技術時候碰到的問題,因為根據前端優化的原則,javascript代碼往往是位于頁面的底部,當頁面有被腳本阻塞時候,html標簽里引用的函數可能還沒執行到,這個時候我們點擊頁面按鈕,結果會報出“XXX函數未定義的錯誤”,在javascript里這樣的錯誤是會被try,catch所捕獲,因此為了讓代碼更加健壯,我們會有如下的改寫:

  1. <input type="button" id="btn" name="btn" onclick="try{btnClk();}catch(e){}"/> 

看到上面代碼豈是一個惡心能描述的。

方式二:DOM0級事件處理

DOM0級事件處理是當今所有瀏覽器都支持的事件處理,不存在任何兼容性問題,看到這樣一句話都會讓每個做web前端的人們激動不已。DOM0事件處理的規則是:每個DOM元素都有自己的事件處理屬性,該屬性可以賦值一個函數,例如下面的代碼:

  1. var btnDOM = document.getElementById("btn"); 
  2.  
  3. btnDOM.onclick = function(){ 
  4.  
  5.          alert("click me!");             
  6.  

DOM0級事件處理的事件屬性都是采用“on+事件名稱”的方式定義,整個屬性都是小寫字母。我們知道DOM元素在javascript代碼里就是一個javascript對象,因此從javascript對象角度理解DOM0級事件處理就非常容易,例如下面代碼:

  1. btnDOM.onclick = null; 

那么按鈕的點擊事件被取消了。

再看下面的代碼:

  1. btnDOM.onclick = function(){ 
  2.  
  3.          alert("click me!");             
  4.  
  5.  
  6. btnDOM.onclick = function(){ 
  7.  
  8.          alert("click me1111!");             
  9.  

后面一個函數會將***個函數覆蓋。

方式三:DOM2事件處理和IE事件處理

DOM2事件處理是標準化的事件處理方案,但是IE瀏覽器自己搞了一套,功能和DOM2事件處理相似,但是代碼寫起來就不太一樣了。

在講解方式三之前,我必須要補充一些概念,否則是無法講清楚方式三的內涵。

***個概念是:事件流

在頁面開發里我們常常會碰到這樣的情況,一個頁面的工作區間在javascript可以用document表示,頁面里有個div,div等于是覆蓋在document元素上,div里面有個button元素,button元素是覆蓋在div上,也等于覆蓋著document上,所以問題來了,當我們點擊這個按鈕時候,這個點擊行為其實不僅僅發生在button之上,div和document都被作用了點擊操作,按邏輯這三個元素都是可以促發點擊事件的,而事件流正是描述上述場景的概念,事件流的意思是:從頁面接收事件的順序。

第二個概念:事件冒泡和事件捕獲

事件冒泡是微軟公司提出解決事件流問題的方案,而事件捕獲則是網景公司提出的事件流解決方案,它們的原理如下圖:

冒泡事件由div開始,其次是body,***是document,事件捕獲則是倒過來的先是document,其次是body,***是目標元素div,相比之下,微軟公司的方案更加人性化符合人們的操作習慣,網景的方案就很別扭了,這是瀏覽器大戰的惡果,網景慢了一步就以犧牲用戶習慣的代碼解決事件流的問題。

微軟公司結合冒泡事件設計了一套新的事件系統,業界習慣稱為ie事件處理,ie事件處理方式如下面代碼所示:

  1. var btnDOM = document.getElementById("btn"); 
  2.  
  3. btnDOM.attachEvent("onclick",function(){ 
  4.  
  5.          alert("Click Me!"); 
  6.  
  7. }); 

在ie下通過DOM元素的attachEvent方法添加事件,和DOM0事件處理相比,添加事件的方式由屬性變成了方法,所以我們添加事件就需要往方法里傳遞參數,attachEvent方法接收兩個參數,***個參數是事件類型,事件類型的命名和DOM0事件處理里的事件命名一樣,第二個參數是事件函數了,使用方法的好處就是如果我們在為同一個元素添加個點擊事件,如下所示:

  1. btnDOM.attachEvent("onclick",function(){ 
  2.  
  3.          alert("Click Me!"); 
  4.  
  5. }); 
  6.  
  7. btnDOM.attachEvent("onclick",function(){ 
  8.  
  9.          alert("Click Me,too!"); 
  10.  
  11. }); 

運行之,兩個對話框都能正常彈出來,方法讓我們可以為DOM元素添加多個不同的點擊事件。如果我們不要某個事件呢?我們該怎么做了,ie為刪除事件提供了detachEvent方法,參數列表和attachEvent一樣,如果我們要刪除某個點擊事件,只要傳遞和添加事件一樣的參數即可,如下代碼所示:

  1. btnDOM.detachEvent("onclick",function(){ 
  2.  
  3.          alert("Click Me,too!"); 
  4.  
  5. }); 

運行之,后果很嚴重,我們很迷惑,第二個click居然沒有被刪除,這是怎么回事?前面我講到刪除事件要傳入和添加事件一樣的參數,但是在javascript的匿名函數里,兩個匿名函數哪怕代碼完全一樣,javascript都會在內部使用不同變量存儲,結果就是我們看到的現象無法刪除點擊事件的,因此我們的代碼要這么寫:

  1. var ftn = function(){ 
  2.  
  3.          alert("Click Me,too!"); 
  4.  
  5. }; 
  6.  
  7. btnDOM.attachEvent("onclick",ftn); 
  8.  
  9. btnDOM.detachEvent("onclick",ftn); 

這樣添加的方法和刪除的方法就是指向了同一個對象,所以事件刪除成功了。這里的場景告訴我們寫事件要有個良好的習慣即操作函數要獨立定義,不要用匿名函數用成了習慣。

#p#

接下來就是DOM2事件處理,它的原理如下圖所示:

DOM2是標準化的事件,使用DOM2事件,事件傳遞首先從捕獲方式開始即從document開始,再到body,div是一個中介點,事件到了中介點時候事件就處于目標階段,事件進入目標階段后事件就開始冒泡處理方式,***事件在document上結束。(捕獲事件的起點以及冒泡事件的終點,我本文都是指向document,實際情況是有些瀏覽器會從window開始捕獲,window結束冒泡,不過我覺得開發時候不管瀏覽器本身怎么設定,我們關注document更具開發意義,所以我這里一律都是使用document)。人們習慣把目標階段歸為冒泡的一部分,這主要是因為開發里冒泡事件使用的更加廣泛。

DOM2事件處理很折騰,每次事件促發時候都會把所有元素遍歷兩遍,這點和ie事件相比性能就差多了,ie只有冒泡,所以ie只需要遍歷一次,不過遍歷少了并不代表ie的事件體系效率更高,從開發設計角度同時支持兩種事件系統會給我們開發帶來更大的靈活度,從這個角度而言DOM2事件還是很有可取之處。DOM2事件的代碼如下:

  1. var btnDOM = document.getElementById("btn"); 
  2.  
  3. btnDOM.addEventListener("click",function(){ 
  4.  
  5.          alert("Click Me!"); 
  6.  
  7. },false); 
  8.  
  9. var ftn = function(){ 
  10.  
  11.          alert("Click Me,too!"); 
  12.  
  13. }; 
  14.  
  15. btnDOM.addEventListener("click",ftn,false); 

DOM2事件處理里添加事件使用的是addEventListener,它接收三個參數比ie事件處理多一個,前兩個的意思和ie事件處理方法的兩個參數一樣,唯一的區別就是***個參數里要去掉on這個前綴,第三個參數是個布爾值,如果它的取值是true,那么事件就按照捕獲方式處理,取值為false,事件就是按照冒泡處理,有第三個參數我們可以理解為什么DOM2事件處理里要把事件元素跑個兩遍,目的就是為了兼容兩種事件模型,不過這里要請注意下,不管我們選擇是捕獲還是冒泡,兩遍遍歷是永遠進行,如果我們選擇一種事件處理方式,那么另外一個事件處理流程里就不會促發任何事件處理函數,這和汽車掛空擋空轉的道理一樣。通過DOM2事件方法的設計,我們知道DOM2事件在運行時候只能執行兩種事件處理方式中的一種,不可能兩個事件流體系同時促發,所以雖然元素遍歷兩遍,但是事件函數絕不可能被促發兩遍,注意我這里指不促發兩遍是指一個事件函數,其實我們可以模擬兩個事件流模型同時執行的情況,例如下面代碼:

  1. btnDOM.addEventListener("click",ftn,true); 
  2.  
  3. btnDOM.addEventListener("click",ftn,false); 

但這種寫法是多事件處理,相當于我們點擊兩次按鈕。

DOM2也提供了刪除事件的函數,這個函數就是removeEventListener,寫法如下:

  1. btnDOM.removeEventListener("click",ftn,false); 

使用和ie事件的一樣即參數要和定義事件的參數一致,不過removeEventListener使用時候,第三個參數不傳,默認是刪除冒泡事件,因為第三個參數不傳默認都是false,例如:

  1. btnDOM.addEventListener("click",ftn,true); 
  2.  
  3. btnDOM.removeEventListener("click",ftn); 

運行之,發現事件沒有被刪除成功。

***我要說的是DOM2事件處理在ie9包括ie9以上的版本都得到了很好的支持,ie8以下是不支持DOM2事件的。

下面我們對三種事件方式做個比較,比較如下:

比較一:方式一為一方和其他兩種方式比較

方式一的寫法是html和javascript結合在一起,你中有我我中有你,把這種方式深化一下就是html和javascript混合開發,用一個軟件術語表達就是代碼耦合,代碼耦合不好,而且是非常不好,這是菜鳥程序員的級別,所以方式一完敗,另外兩種方式完勝。

比較二:方式二和方式三

它們兩個寫法差不多,有時真的很難說誰好誰壞,縱觀上述內容我們發現方式二和方式三的***區別就是:使用方式二一個DOM元素某個事件有且只有一次,而方式三則可以讓DOM元素某個事件擁有多個事件處理函數,在DOM2事件處理里,方式三還能讓我們精確控制事件流的方式,因此方式三的功能比方式二更加的強大,所以相比之下方式三略勝一籌。

下面就是本文的重點:事件系統的性能問題,解決性能問題必須找到一個著力點,這里我從兩個著力點來思考事件系統的性能問題,它們分別是:減少遍歷次數和內存消耗。

首先是遍歷次數,不管是捕獲事件流還是冒泡事件流,都會遍歷元素,而是都是從最上層的window或document開始的遍歷,假如頁面DOM元素父子關系很深,那么遍歷的元素越多,像DOM2事件處理這種,遍歷危害程度就越大了,如何解決這個事件流遍歷問題了?我的回答是沒有,這里有些朋友也許會有疑問,怎么會沒有了?事件系統里有個事件對象即event,這個對象有阻止冒泡或捕獲事件的方法,我怎么說沒有呢?這位朋友的疑問很有道理,但是如果我們要使用該方法減少遍歷,那么我們代碼就要處理父子元素的關系,爺孫元素關系,如果頁面元素嵌套很多,這就是沒法完成的任務,所以我的回答是沒法改變遍歷的問題,只能去適應它。

看來減少遍歷是沒法解決事件系統性能問題了,那么現在只有從內存消耗考慮了。我常聽人說C#很好用,對于web前端開發它就更好用了,我們可以直接在C#的IDE拖一個按鈕到頁面,按鈕到了頁面之后javascript代碼會自動為該按鈕添加個事件,當然里面的事件函數是個空函數,于是我想我們可以按這種方式在頁面放置100個按鈕,一個代碼都不行就有了100個按鈕事件處理,超級方便,***我們對其中一個按鈕添加具體的按鈕事件,讓頁面跑起來,請問大家這個頁面效率會高嗎?在javascript里,每個函數都是一個對象,每個對象都會耗費內存,所以這無用的99個事件函數代碼肯定消耗了很多寶貴的瀏覽器內存。當然現實開發環境里我們不會這么干的,但是在當今ajax流行,單頁面開發瘋狂普及的時代,一個網頁上的事件都是超級多的,這就意味我們每個事件都有一個事件函數,但是我們每次操作都只會促發一個事件,此時其他事件都是躺著睡覺,起不到任何作用同時還要消耗計算機的內存。

我們需要一種方案改變這種情況,現實中的確有這種方案。為了清晰描述這個方案,我要先補充一些背景知識,在講述DOM2事件處理里我提到了目標對象這個概念,拋開DOM2事件處理方式,在捕獲事件處理和冒泡事件處理里也有目標對象的概念,目標對象就是事件具體操作的DOM元素,例如點擊按鈕操作里按鈕就是目標對象,不管哪個事件處理方式,事件函數都會包含一個event對象,event對象有個屬性target,target是永遠指向目標對象的,event對象還有個屬性就是currentTarget,這個屬性指向的是捕獲或冒泡事件流動到的DOM元素。由上文描述我們知道,不管是捕獲事件還是冒泡事件,事件流都會流動到document上,假如我們在document上添加點擊事件,頁面上的按鈕不添加點擊事件,這時候我們點擊按鈕,我們知道document上的點擊事件會促發,這里有個細節就是促發document點擊事件時候,event的target的指向是button而不是document,那么我們可以這樣寫代碼:

  1. <input type="button" id="btn" name="btn" value="BUTTON"/> 
  2.  
  3. <a href="#" id="aa">aa</a> 
  4.  
  5. document.addEventListener("click",function(evt){ 
  6.  
  7.          var target = evt.target; 
  8.  
  9.          switch(target.id){ 
  10.  
  11.                    case "btn"
  12.  
  13.                             alert("button"); 
  14.  
  15.                             break
  16.  
  17.                    case "aa"
  18.  
  19.                             alert("a"); 
  20.  
  21.                             break
  22.  
  23.          } 
  24.  
  25. },false); 

運行之,我們發現效果和我們單獨寫按鈕事件一樣。但是它的好處是不言而喻的,一個函數搞定了整個頁面的事件函數,而且沒有事件函數被空閑,簡直***,這個方案還有個專業名稱:事件委托。jQuery的delegate方法就是按這個原理做的。其實事件委托的效率不僅僅體現在事件函數的減少,它還能減少dom遍歷操作,例如上面例子里我們在document上添加函數,document是頁面里的頂層對象,讀取它的效率是很高的,到了具體的對象事件我們也沒有通過dom操作而是使用事件對象的target屬性,所有這些只能用一句話概括:真是快,沒理由的快。

事件委托還能給我們帶來一個很棒副產品,使用過jQuery的朋友都應該用過live方法,live方法特點是你可以為頁面元素添加事件操作,哪怕這個元素目前在頁面還不存在,你也可以添加它的事件,理解了事件委托機制,live的原理就很好理解了,其實jQuery的live就是通過事件委托做的,同時live還是一種高效的事件添加方式。

理解了事件委托,我們會發現jQuery的bind方法是個低效的方法,因為它使用原始的事件定義方式,所以bind我們要慎用,其實jQuery的開發者也注意到這個問題,新版的jQuery里都有一個on方法,on方法包含了bind、live和delegate方法所有功能,所以我建議看了本文的朋友要摒棄以前使用添加事件的方式,多使用on函數添加事件。

事件委托還有個好處,上文里事件委托的例子我是在document上添加事件,這里我要做個比較,在jQuery里我們習慣把DOM元素事件的定義放在ready方法里,如下所示:

  1. $(document).ready(function(){ 
  2.     XXX.bind("click",function(){}); 
  3. }); 

ready函數是在頁面DOM文檔加載完畢后執行,它比onload函數先執行,這種提前好處很多,好處之一也是帶來性能提升,jQuery這種事件定義也算是個標準做法,我相信有些朋友一定又把某些事件綁定放在ready外面,***發現按鈕會無效,這種無效場景有時一剎那,過會兒就好了,所以我們常常忽視了該問題的原理,不在ready函數綁定事件,這個操作其實是在DOM加載完畢之前綁定事件,而這個時間段下,很有可能某些元素還沒在頁面構造好,所以事件綁定會出現無效情況,因此ready定義事件的道理就是保證頁面所有元素加載完畢后在定義DOM元素的事件,但是使用事件委托時可以避免問題的發生,例如將事件綁定在document,document代表整個頁面,所以它加載完畢的時間可謂最早,所以在document上實現事件委托,就很難發生事件無效的情況,也很難發生瀏覽器報出“XXX函數未定義”的問題了。總結一下這個特點:事件委托代碼可以運行在頁面加載的任何階段,這點對提升網頁性能還是增強網頁效果上都會給開發人員提供更大自由度。

責任編輯:張偉 來源: 博客園
相關推薦

2012-12-17 13:51:22

Web前端JavaScriptJS

2009-06-24 15:00:39

Javascript代

2019-08-26 18:20:05

JavascriptWeb前端

2024-03-20 08:00:00

軟件開發Java編程語言

2017-12-07 13:40:00

JavaScript內存泄露內存管理

2014-04-25 09:02:17

LuaLua優化Lua代碼

2018-01-12 14:37:34

Java代碼實踐

2015-12-17 13:19:29

編寫高性能Swift

2024-02-01 09:21:08

RevoltPHP高性能

2022-03-22 14:06:43

Java性能技術匯編

2011-02-23 12:59:08

JSJavaScript瀏覽器

2019-03-14 15:38:19

ReactJavascript前端

2011-03-11 09:51:47

Java NIO

2025-11-05 01:11:00

PHP高性能Linux

2023-12-14 08:01:08

事件管理器Go

2014-10-10 14:00:52

JavascriptHTML

2011-04-07 09:18:59

MySQL語法

2011-04-19 11:06:03

JavaScriptweb

2024-12-02 14:28:17

JavaScriptWeb開發

2022-02-24 09:00:38

React代碼模式
點贊
收藏

51CTO技術棧公眾號

国产午夜精品久久久久久免费视| 影音先锋久久资源网| 欧美日韩国产综合久久| 在线观看一区二区三区三州| 国产手机精品视频| 最新日韩欧美| 夜夜嗨av一区二区三区四区| 一区二区免费av| 免费毛片在线看片免费丝瓜视频 | 精品国产乱码久久久| 欧美喷潮久久久xxxxx| www.国产在线播放| jizz在线免费观看| 国产a久久麻豆| 国产成人综合一区二区三区| 日本爱爱小视频| 麻豆一区二区| 欧美日韩国产综合一区二区三区| 欧美成人三级在线视频| 91精品专区| 成人aa视频在线观看| 国产伊人精品在线| 色婷婷av国产精品| 女生裸体视频一区二区三区| 亚洲网站在线看| 亚洲AV成人精品| 福利精品一区| 岛国av在线不卡| 欧洲金发美女大战黑人| 91电影在线播放| 91丨porny丨蝌蚪视频| 99精品99久久久久久宅男| 免费黄色av片| 国产欧美日本| 欧美高清在线视频观看不卡| 黄色精品视频在线观看| 国产真实有声精品录音| 日韩成人在线免费观看| 欧美激情第四页| 欧美一级做a| 色视频成人在线观看免| 国产原创中文在线观看| 日本一本在线免费福利| 亚洲免费资源在线播放| 中文字幕久久综合| 一本一道波多野毛片中文在线| 91丨porny丨首页| 精品日韩美女| 亚洲av成人无码久久精品老人| 精品综合免费视频观看| 国产成人+综合亚洲+天堂| 国产精品国产三级国产专区52| 好吊日精品视频| 欧美国产视频日韩| 欧美人妻精品一区二区三区| 亚洲一区二区| 久久福利视频导航| 国产97免费视频| 精品久久不卡| 一区二区三区四区精品| 亚洲女优在线观看| 日韩av密桃| 中文字幕久热精品视频在线| 日本美女xxx| 日韩中文欧美| 日韩视频免费看| 国产精品嫩草影院俄罗斯| 久久精品亚洲人成影院| 欧美精品在线播放| 久久久久久久久艹| 国产亚洲亚洲| 国产精品第三页| 亚洲无码精品在线播放| 精品制服美女丁香| 99c视频在线| 亚洲av成人精品日韩在线播放| 久久你懂得1024| 亚洲高清123| av毛片在线看| 天天综合日日夜夜精品| 成人精品小视频| 欧美亚洲福利| 日韩免费福利电影在线观看| xxxx黄色片| 国产成人黄色| 麻豆成人在线看| 日韩精品一区二区三| 久久蜜桃精品| 亚洲一区二区三区在线免费观看| 国产成人三级在线观看视频| 久久综合资源网| 亚洲午夜精品一区二区| 日本高清在线观看视频| 日韩欧美黄色动漫| www.51色.com| 色愁久久久久久| 中文字幕日韩电影| 日韩成人一区二区三区| 日本中文字幕不卡| 懂色一区二区三区av片 | 色婷婷综合成人| 欧美精品xxxxx| 丝袜美腿亚洲综合| av日韩免费电影| 国产高清一区在线观看| 一区二区三区精品| 尤蜜粉嫩av国产一区二区三区| 久久在线观看| 在线观看中文字幕亚洲| 国产午夜视频在线| 九九视频精品免费| 日本一区二区久久精品| 国精一区二区三区| 欧美日韩黄色一区二区| 在线免费观看黄色小视频| 婷婷亚洲图片| 国产成人一区二区三区小说| 亚洲国产剧情在线观看| 国产精品久久免费看| 每日在线更新av| 欧美电影院免费观看| 永久免费看mv网站入口亚洲| 日韩成人免费在线视频| 国产成人a级片| 一级特黄录像免费播放全99| 不卡一二三区| 亚洲高清久久网| 全程偷拍露脸中年夫妇| 久热成人在线视频| 日韩伦理一区二区三区av在线| av日韩国产| 日韩欧美一二区| 久艹在线观看视频| 免费成人在线影院| 涩涩涩999| 久久uomeier| 日韩av中文在线| 男人天堂中文字幕| 国产成人精品综合在线观看 | 国产三区在线观看| 欧美视频三区在线播放| 亚洲人成人无码网www国产 | 亚洲日本一区二区三区| 欧美女同在线观看| 成人情趣视频| 国产精品国产三级国产aⅴ浪潮 | 久久九九国产精品怡红院 | 69av视频在线| 国产精品一区二区无线| 日本黄xxxxxxxxx100| 青青草国产一区二区三区| 影音先锋欧美精品| 伊人久久成人网| 国产精品亲子伦对白| 日日噜噜夜夜狠狠| 日韩精品诱惑一区?区三区| 国产精品久久久久久亚洲影视| 久久久久久久影视| 在线国产亚洲欧美| 青青草华人在线视频| 蜜桃在线一区二区三区| 亚洲图片小说在线| 亚洲久草在线| 久久91亚洲精品中文字幕| 午夜精品久久久久久久99热黄桃 | 69堂免费视频| 欧美猛男同性videos| 国产成人久久久| 77导航福利在线| 欧美一区二区在线免费播放| 九九热只有精品| 不卡av电影在线播放| 国产福利视频在线播放| 成人在线免费视频观看| 成人激情视频在线| 丁香花在线电影小说观看 | 久操视频在线播放| 日韩欧美国产综合一区| 日本熟妇成熟毛茸茸| 久久久综合精品| 日本三级黄色网址| 精品91在线| 欧美日韩在线精品一区二区三区| 丁香婷婷久久| 欧美激情在线观看| 欧美日韩伦理片| 91.成人天堂一区| 日本一区二区网站| 国产精品网站导航| 亚洲乱妇老熟女爽到高潮的片 | 69精品小视频| 成人18在线| 欧美成人一区二区三区| 中文字幕在线播| 亚洲美女视频在线| 欧美多人猛交狂配| 国产成人综合精品三级| 免费日韩视频在线观看| 久久久久久久久久久久久久| 国产亚洲精品自在久久| 国产精品亲子伦av一区二区三区| 欧美日本黄视频| 丁香婷婷在线| 亚洲成人亚洲激情| 一级黄色大片免费| 欧美特级www| 国精产品视频一二二区| 99精品久久只有精品| 天天操天天干天天做| 免费日韩av片| 黄色网在线视频| 青青草国产成人a∨下载安卓| 高清不卡日本v二区在线| 国产精品久久久久久吹潮| 97精品免费视频| www.在线视频| 自拍视频国产精品| 欧美女优在线| 亚洲国产99精品国自产| av免费观看在线| 欧美日韩在线免费视频| 国产精品免费精品一区| 亚洲国产毛片aaaaa无费看| 欧美日韩生活片| 久久美女艺术照精彩视频福利播放| 亚洲成a人片在线www| 极品美女销魂一区二区三区免费| 丰满人妻中伦妇伦精品app| 亚洲国产午夜| 精品一区二区三区无码视频| 亚洲男女av一区二区| 亚洲国产精品日韩| 国际精品欧美精品| 欧美日韩国产免费一区二区三区 | 久久国产日韩欧美精品| 国产成人久久777777| 一区二区黄色| 国产欧美日韩网站| 亚洲毛片一区| 2019日韩中文字幕mv| 午夜日本精品| 久久久99精品视频| 欧美激情四色| 国产制服91一区二区三区制服| 91精品国产麻豆国产在线观看| 亚洲欧美在线网| 日韩精品免费| 在线国产99| 亚洲经典一区| 影音先锋成人资源网站| 亚洲欧美日韩高清在线| 五月天av影院| 欧美日本久久| av女优在线播放| 99视频精品免费观看| 男人用嘴添女人下身免费视频| 亚洲激情精品| 日日碰狠狠添天天爽超碰97| 亚洲一级在线| 免费在线观看的毛片| 免费黄网站欧美| 国产精品99久久免费黑人人妻| 亚洲欧美日韩一区在线观看| 干日本少妇首页| 日韩高清欧美激情| 一级做a免费视频| 国产成人av电影免费在线观看| 9191在线视频| 91日韩在线专区| www久久久久久久| 亚洲三级在线看| 日本五十熟hd丰满| 91久久香蕉国产日韩欧美9色| 国产一级片一区二区| 3d动漫精品啪啪| 欧美 日韩 国产 在线| 亚洲人成网7777777国产| 在线播放日本| 欧美激情精品久久久久久免费印度 | 日本免费一区二区视频| 精品久久蜜桃| 不卡中文一二三区| 在线观看av的网址| 性xx色xx综合久久久xx| 日韩av.com| 成人av在线一区二区三区| 亚洲精品国产一区黑色丝袜| 亚洲色图在线看| 国产尤物在线视频| 欧美日本一区二区三区四区| 粉嫩小泬无遮挡久久久久久| 亚洲精品乱码久久久久久金桔影视| 国产在线三区| 欧美多人乱p欧美4p久久| 欧美gay视频| 99在线观看视频网站| 国产一区日韩| 青青在线视频免费观看| 石原莉奈在线亚洲二区| 久久久国产精品久久久| 国产肉丝袜一区二区| 久久黄色小视频| 欧美少妇bbb| 天堂av在线播放| 欧美另类99xxxxx| 成人精品动漫| 鲁丝片一区二区三区| 欧美激情五月| 高清一区在线观看| 99视频在线观看一区三区| 欧美精品久久久久久久久46p| 色94色欧美sute亚洲线路二| 黄频网站在线观看| 久久综合网hezyo| 欧美日韩精品一区二区三区视频| 高清国产在线一区| 欧美在线二区| www.com黄色片| 久久精品一级爱片| 国产精品视频久久久久久久| 日韩片之四级片| 欧美激情午夜| 国产精品日韩在线一区| 思热99re视热频这里只精品| 日韩激情视频一区二区| 国产自产视频一区二区三区| 少妇无套高潮一二三区| 欧美日韩亚洲国产一区| 姝姝窝人体www聚色窝| 欧美高清视频一区二区| 日本免费一区二区视频| 欧美日韩亚洲国产成人| 免费观看成人av| 欧美激情视频二区| 在线免费观看一区| 九色蝌蚪在线| 国产成人精品久久| 伊人久久大香线蕉| 丰满人妻中伦妇伦精品app| 99国产一区二区三精品乱码| 国产一级做a爱免费视频| 日韩免费高清av| 丁香花高清在线观看完整版| 91九色极品视频| 欧美视频官网| 欧美激情一区二区三区p站| 亚洲一二三四区| 无码国精品一区二区免费蜜桃| 97精品视频在线观看| 日韩极品在线| 日韩中文字幕免费在线| 久久久久久黄色| 国产精品尤物视频| 最近2019免费中文字幕视频三| 伊人久久大香伊蕉在人线观看热v| 影音先锋欧美资源| 国产九色精品成人porny| 国产精品九九九九九九| 精品人伦一区二区色婷婷| av在线私库| 日本欧美精品久久久| 美国毛片一区二区| 亚洲av鲁丝一区二区三区| 精品捆绑美女sm三区| 国产亚洲成av人片在线观看| 欧美日韩大片一区二区三区| 日本美女一区二区| 久久国产精品国语对白| 日韩女优电影在线观看| sm在线播放| 亚洲 日韩 国产第一区| 激情五月婷婷综合| 国产极品美女高潮无套嗷嗷叫酒店| 日韩成人在线观看| 久久国产三级| 久久久久久久久久伊人| av亚洲产国偷v产偷v自拍| 日本久久综合网| 精品国产一区二区三区四区在线观看| 国产精久久一区二区| www.99热这里只有精品| 国产精品免费av| 亚洲经典一区二区三区| 欧美中文在线免费| 国产精品久久久久久久| 中文字幕精品久久久| 欧美日韩中文字幕一区| 欧美草逼视频| 亚洲第一综合| 成人av午夜电影| 在线观看视频二区| 午夜免费日韩视频| 日本电影一区二区| japanese在线观看| 欧美精品粉嫩高潮一区二区| 国产在线精彩视频| 黄色一级片网址| 国产亚洲成年网址在线观看| 超碰在线人人干| 国产精品久久久久久久7电影|