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

JavaScript 的性能優化:加載和執行

開發 前端
無論當前 JavaScript 代碼是內嵌還是在外鏈文件中,頁面的下載和渲染都必須停下來等待腳本執行完成。JavaScript 執行過程耗時越久,瀏覽器等待響應用戶輸入的時間就越長。瀏覽器在下載和執行腳本時出現阻塞的原因在于,腳本可能會改變頁面或 JavaScript 的命名空間,它們對后面頁面內容造成影響。

 無論當前 JavaScript 代碼是內嵌還是在外鏈文件中,頁面的下載和渲染都必須停下來等待腳本執行完成。JavaScript 執行過程耗時越久,瀏覽器等待響應用戶輸入的時間就越長。瀏覽器在下載和執行腳本時出現阻塞的原因在于,腳本可能會改變頁面或 JavaScript 的命名空間,它們對后面頁面內容造成影響。一個典型的例子就是在頁面中使用document.write()。例如清單 1
清單 1 JavaScript 代碼內嵌示例

  1. <html> 
  2. <head> 
  3.     <title>Source Example</title> 
  4. </head> 
  5. <body> 
  6.     <p> 
  7.     <script type="text/javascript"> 
  8.         document.write("Today is " + (new Date()).toDateString()); 
  9.     </script> 
  10.     </p> 
  11. </body> 
  12. </html> 

當瀏覽器遇到<script>標簽時,當前 HTML 頁面無從獲知 JavaScript 是否會向<p> 標簽添加內容,或引入其他元素,或甚至移除該標簽。因此,這時瀏覽器會停止處理頁面,先執行 JavaScript代碼,然后再繼續解析和渲染頁面。同樣的情況也發生在使用 src 屬性加載 JavaScript的過程中,瀏覽器必須先花時間下載外鏈文件中的代碼,然后解析并執行它。在這個過程中,頁面渲染和用戶交互完全被阻塞了。

腳本位置

HTML 4 規范指出 <script> 標簽可以放在 HTML 文檔的<head><body>中,并允許出現多次。Web 開發人員一般習慣在 <head> 中加載外鏈的 JavaScript,接著用 <link> 標簽用來加載外鏈的 CSS 文件或者其他頁面信息。例如清單 2

清單 2 低效率腳本位置示例

  1. <html> 
  2. <head> 
  3.     <title>Source Example</title> 
  4.     <script type="text/javascript" src="script1.js"></script> 
  5.     <script type="text/javascript" src="script2.js"></script> 
  6.     <script type="text/javascript" src="script3.js"></script> 
  7.     <link rel="stylesheet" type="text/css" href="styles.css"
  8. </head> 
  9. <body> 
  10.     <p>Hello world!</p> 
  11. </body> 
  12. </html> 

然而這種常規的做法卻隱藏著嚴重的性能問題。在清單 2 的示例中,當瀏覽器解析到 <script> 標簽(第 4 行)時,瀏覽器會停止解析其后的內容,而優先下載腳本文件,并執行其中的代碼,這意味著,其后的 styles.css 樣式文件和<body>標簽都無法被加載,由于<body>標簽無法被加載,那么頁面自然就無法渲染了。因此在該 JavaScript 代碼完全執行完之前,頁面都是一片空白。圖 1 描述了頁面加載過程中腳本和樣式文件的下載過程。

圖 1 JavaScript 文件的加載和執行阻塞其他文件的下載

 

我們可以發現一個有趣的現象:***個 JavaScript 文件開始下載,與此同時阻塞了頁面其他文件的下載。此外,從 script1.js 下載完成到 script2.js 開始下載前存在一個延時,這段時間正好是 script1.js 文件的執行過程。每個文件必須等到前一個文件下載并執行完成才會開始下載。在這些文件逐個下載過程中,用戶看到的是一片空白的頁面。

從 IE 8、Firefox 3.5、Safari 4 和 Chrome 2 開始都允許并行下載 JavaScript 文件。這是個好消息,因為<script>標簽在下載外部資源時不會阻塞其他<script>標簽。遺憾的是,JavaScript 下載過程仍然會阻塞其他資源的下載,比如樣式文件和圖片。盡管腳本的下載過程不會互相影響,但頁面仍然必須等待所有 JavaScript 代碼下載并執行完成才能繼續。因此,盡管***的瀏覽器通過允許并行下載提高了性能,但問題尚未完全解決,腳本阻塞仍然是一個問題。

由于腳本會阻塞頁面其他資源的下載,因此推薦將所有<script>標簽盡可能放到<body>標簽的底部,以盡量減少對整個頁面下載的影響。例如清單 3

清單 3 推薦的代碼放置位置示例

  1. <html> 
  2. <head> 
  3.     <title>Source Example</title> 
  4.     <link rel="stylesheet" type="text/css" href="styles.css"
  5. </head> 
  6. <body> 
  7.     <p>Hello world!</p> 
  8.   
  9.     <!-- Example of efficient script positioning --> 
  10.     <script type="text/javascript" src="script1.js"></script> 
  11.     <script type="text/javascript" src="script2.js"></script> 
  12.     <script type="text/javascript" src="script3.js"></script> 
  13. </body> 
  14. </html> 

這段代碼展示了在 HTML 文檔中放置<script>標簽的推薦位置。盡管腳本下載會阻塞另一個腳本,但是頁面的大部分內容都已經下載完成并顯示給了用戶,因此頁面下載不會顯得太慢。這是優化 JavaScript 的首要規則:將腳本放在底部。

組織腳本

由于每個<script>標簽初始下載時都會阻塞頁面渲染,所以減少頁面包含的<script>標簽數量有助于改善這一情況。這不僅針對外鏈腳本,內嵌腳本的數量同樣也要限制。瀏覽器在解析 HTML 頁面的過程中每遇到一個<script>標簽,都會因執行腳本而導致一定的延時,因此最小化延遲時間將會明顯改善頁面的總體性能。

這個問題在處理外鏈 JavaScript 文件時略有不同。考慮到 HTTP 請求會帶來額外的性能開銷,因此下載單個 100Kb 的文件將比下載 5 個 20Kb 的文件更快。也就是說,減少頁面中外鏈腳本的數量將會改善性能。

通常一個大型網站或應用需要依賴數個 JavaScript 文件。您可以把多個文件合并成一個,這樣只需要引用一個<script>標簽,就可以減少性能消耗。文件合并的工作可通過離線的打包工具或者一些實時的在線服務來實現。

需要特別提醒的是,把一段內嵌腳本放在引用外鏈樣式表的<link>之后會導致頁面阻塞去等待樣式表的下載。這樣做是為了確保內嵌腳本在執行時能獲得最精確的樣式信息。因此,建議不要把內嵌腳本緊跟在<link>標簽后面。

無阻塞的腳本

減少 JavaScript 文件大小并限制 HTTP 請求數在功能豐富的 Web 應用或大型網站上并不總是可行。Web 應用的功能越豐富,所需要的 JavaScript 代碼就越多,盡管下載單個較大的 JavaScript 文件只產生一次 HTTP 請求,卻會鎖死瀏覽器的一大段時間。為避免這種情況,需要通過一些特定的技術向頁面中逐步加載 JavaScript 文件,這樣做在某種程度上來說不會阻塞瀏覽器。

無阻塞腳本的秘訣在于,在頁面加載完成后才加載 JavaScript 代碼。這就意味著在 window 對象的 onload事件觸發后再下載腳本。有多種方式可以實現這一效果。

延遲加載腳本

HTML 4 為<script>標簽定義了一個擴展屬性:deferDefer 屬性指明本元素所含的腳本不會修改 DOM,因此代碼能安全地延遲執行。defer 屬性只被 IE 4 和 Firefox 3.5 更高版本的瀏覽器所支持,所以它不是一個理想的跨瀏覽器解決方案。在其他瀏覽器中,defer 屬性會被直接忽略,因此<script>標簽會以默認的方式處理,也就是說會造成阻塞。然而,如果您的目標瀏覽器支持的話,這仍然是個有用的解決方案。清單 4 是一個例子

#p#

清單 4 defer 屬性使用方法示例

  1. <script type="text/javascript" src="script1.js" defer></script> 

帶有 defer 屬性的<script>標簽可以放置在文檔的任何位置。對應的 JavaScript 文件將在頁面解析到<script>標簽時開始下載,但不會執行,直到 DOM 加載完成,即onload事件觸發前才會被執行。當一個帶有 defer 屬性的 JavaScript 文件下載時,它不會阻塞瀏覽器的其他進程,因此這類文件可以與其他資源文件一起并行下載。

任何帶有 defer 屬性的<script>元素在 DOM 完成加載之前都不會被執行,無論內嵌或者是外鏈腳本都是如此。清單 5 的例子展示了defer屬性如何影響腳本行為:

清單 5 defer 屬性對腳本行為的影響

  1. <html> 
  2. <head> 
  3.     <title>Script Defer Example</title> 
  4. </head> 
  5. <body> 
  6.     <script type="text/javascript" defer> 
  7.         alert("defer"); 
  8.     </script> 
  9.     <script type="text/javascript"
  10.         alert("script"); 
  11.     </script> 
  12.     <script type="text/javascript"
  13.         window.onload = function(){ 
  14.             alert("load"); 
  15.         }; 
  16.     </script> 
  17. </body> 
  18. </html> 

 

這段代碼在頁面處理過程中彈出三次對話框。不支持 defer 屬性的瀏覽器的彈出順序是:“defer”、“script”、“load”。而在支持 defer屬性的瀏覽器上,彈出的順序則是:“script”、“defer”、“load”。請注意,帶有 defer 屬性的<script>元素不是跟在第二個后面執行,而是在 onload 事件被觸發前被調用。

如果您的目標瀏覽器只包括 Internet Explorer 和 Firefox 3.5,那么 defer 腳本確實有用。如果您需要支持跨領域的多種瀏覽器,那么還有更一致的實現方式。

HTML 5 為<script>標簽定義了一個新的擴展屬性:async。它的作用和 defer 一樣,能夠異步地加載和執行腳本,不因為加載腳本而阻塞頁面的加載。但是有一點需要注意,在有 async 的情況下,JavaScript 腳本一旦下載好了就會執行,所以很有可能不是按照原本的順序來執行的。如果 JavaScript 腳本前后有依賴性,使用 async 就很有可能出現錯誤。

動態腳本元素

文檔對象模型(DOM)允許您使用 JavaScript 動態創建 HTML 的幾乎全部文檔內容。<script>元素與頁面其他元素一樣,可以非常容易地通過標準 DOM 函數創建:

清單 6 通過標準 DOM 函數創建<script>元素

  1. var script = document.createElement ("script"); 
  2.    script.type = "text/javascript"
  3.    script.src = "script1.js"
  4.    document.getElementsByTagName("head")[0].appendChild(script); 

 

 新的<script>元素加載 script1.js 源文件。此文件當元素添加到頁面之后立刻開始下載。此技術的重點在于:無論在何處啟動下載,文件的下載和運行都不會阻塞其他頁面處理過程。您甚至可以將這些代碼放在<head>部分而不會對其余部分的頁面代碼造成影響(除了用于下載文件的 HTTP 連接)。

當文件使用動態腳本節點下載時,返回的代碼通常立即執行(除了 Firefox 和 Opera,他們將等待此前的所有動態腳本節點執行完畢)。當腳本是“自運行”類型時,這一機制運行正常,但是如果腳本只包含供頁面其他腳本調用調用的接口,則會帶來問題。這種情況下,您需要跟蹤腳本下載完成并是否準備妥善。可以使用動態 <script> 節點發出事件得到相關信息。

Firefox、Opera, Chorme 和 Safari 3+會在<script>節點接收完成之后發出一個 onload 事件。您可以監聽這一事件,以得到腳本準備好的通知:

清單 7 通過監聽 onload 事件加載 JavaScript 腳本

  1. var script = document.createElement ("script"
  2. script.type = "text/javascript"
  3.   
  4. //Firefox, Opera, Chrome, Safari 3+ 
  5. script.onload = function(){ 
  6.     alert("Script loaded!"); 
  7. }; 
  8.   
  9. script.src = "script1.js"
  10. document.getElementsByTagName("head")[0].appendChild(script); 

 Internet Explorer 支持另一種實現方式,它發出一個 readystatechange 事件。<script>元素有一個 readyState 屬性,它的值隨著下載外部文件的過程而改變。readyState 有五種取值:

  • “uninitialized”:默認狀態
  • “loading”:下載開始
  • “loaded”:下載完成
  • “interactive”:下載完成但尚不可用
  • “complete”:所有數據已經準備好

微軟文檔上說,在<script>元素的生命周期中,readyState 的這些取值不一定全部出現,但并沒有指出哪些取值總會被用到。實踐中,我們最感興趣的是“loaded”和“complete”狀態。Internet Explorer 對這兩個 readyState 值所表示的最終狀態并不一致,有時<script>元素會得到“loader”卻從不出現“complete”,但另外一些情況下出現“complete”而用不到“loaded”。最安全的辦法就是在readystatechange 事件中檢查這兩種狀態,并且當其中一種狀態出現時,刪除 readystatechange 事件句柄(保證事件不會被處理兩次):

清單 8 通過檢查 readyState 狀態加載 JavaScript 腳本

  1. var script = document.createElement("script"
  2. script.type = "text/javascript"
  3.   
  4. //Internet Explorer 
  5. script.onreadystatechange = function(){ 
  6.      if (script.readyState == "loaded" || script.readyState == "complete"){ 
  7.            script.onreadystatechange = null
  8.            alert("Script loaded."); 
  9.      } 
  10. }; 
  11.   
  12. script.src = "script1.js"
  13. document.getElementsByTagName("head")[0].appendChild(script); 

大多數情況下,您希望調用一個函數就可以實現 JavaScript 文件的動態加載。下面的函數封裝了標準實現和 IE 實現所需的功能:

清單 9 通過函數進行封裝

  1. function loadScript(url, callback){ 
  2.     var script = document.createElement ("script"
  3.     script.type = "text/javascript"
  4.     if (script.readyState){ //IE 
  5.         script.onreadystatechange = function(){ 
  6.             if (script.readyState == "loaded" || script.readyState == "complete"){ 
  7.                 script.onreadystatechange = null
  8.                 callback(); 
  9.             } 
  10.         }; 
  11.     } else { //Others 
  12.         script.onload = function(){ 
  13.             callback(); 
  14.         }; 
  15.     } 
  16.     script.src = url; 
  17.     document.getElementsByTagName("head")[0].appendChild(script); 

此函數接收兩個參數:JavaScript 文件的 URL,和一個當 JavaScript 接收完成時觸發的回調函數。屬性檢查用于決定監視哪種事件。***一步,設置 src 屬性,并將<script>元素添加至頁面。此 loadScript() 函數使用方法如下:

清單 10 loadScript()函數使用方法

  1. loadScript("script1.js"function(){ 
  2.     alert("File is loaded!"); 
  3. }); 

您可以在頁面中動態加載很多 JavaScript 文件,但要注意,瀏覽器不保證文件加載的順序。所有主流瀏覽器之中,只有 Firefox 和 Opera 保證腳本按照您指定的順序執行。其他瀏覽器將按照服務器返回它們的次序下載并運行不同的代碼文件。您可以將下載操作串聯在一起以保證他們的次序,如下:

清單 11 通過 loadScript()函數加載多個 JavaScript 腳本

  1. loadScript("script1.js"function(){ 
  2.     loadScript("script2.js"function(){ 
  3.         loadScript("script3.js"function(){ 
  4.             alert("All files are loaded!"); 
  5.         }); 
  6.     }); 
  7. }); 

 

此代碼等待 script1.js 可用之后才開始加載 script2.js,等 script2.js 可用之后才開始加載 script3.js。雖然此方法可行,但如果要下載和執行的文件很多,還是有些麻煩。如果多個文件的次序十分重要,更好的辦法是將這些文件按照正確的次序連接成一個文件。獨立文件可以一次性下載所有代碼(由于這是異步進行的,使用一個大文件并沒有什么損失)。

動態腳本加載是非阻塞 JavaScript 下載中最常用的模式,因為它可以跨瀏覽器,而且簡單易用。

使用 XMLHttpRequest(XHR)對象

此技術首先創建一個 XHR 對象,然后下載 JavaScript 文件,接著用一個動態 <script> 元素將 JavaScript 代碼注入頁面。清單 12 是一個簡單的例子:

清單 12 通過 XHR 對象加載 JavaScript 腳本

  1. var xhr = new XMLHttpRequest(); 
  2. xhr.open("get""script1.js"true); 
  3. xhr.onreadystatechange = function(){ 
  4.     if (xhr.readyState == 4){ 
  5.         if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){ 
  6.             var script = document.createElement ("script"); 
  7.             script.type = "text/javascript"
  8.             script.text = xhr.responseText; 
  9.             document.body.appendChild(script); 
  10.         } 
  11.     } 
  12. }; 
  13. xhr.send(null); 

 

此代碼向服務器發送一個獲取 script1.js 文件的 GET 請求。onreadystatechange 事件處理函數檢查 readyState 是不是 4,然后檢查 HTTP 狀態碼是不是有效(2XX 表示有效的回應,304 表示一個緩存響應)。如果收到了一個有效的響應,那么就創建一個新的<script>元素,將它的文本屬性設置為從服務器接收到的 responseText 字符串。這樣做實際上會創建一個帶有內聯代碼的<script>元素。一旦新<script>元素被添加到文檔,代碼將被執行,并準備使用。

這種方法的主要優點是,您可以下載不立即執行的 JavaScript 代碼。由于代碼返回在<script>標簽之外(換句話說不受<script>標簽約束),它下載后不會自動執行,這使得您可以推遲執行,直到一切都準備好了。另一個優點是,同樣的代碼在所有現代瀏覽器中都不會引發異常。

此方法最主要的限制是:JavaScript 文件必須與頁面放置在同一個域內,不能從 CDN 下載(CDN 指”內容投遞網絡(Content Delivery Network)”,所以大型網頁通常不采用 XHR 腳本注入技術。

總結

減少 JavaScript 對性能的影響有以下幾種方法:

  • 將所有的<script>標簽放到頁面底部,也就是</body>閉合標簽之前,這能確保在腳本執行前頁面已經完成了渲染。
  • 盡可能地合并腳本。頁面中的<script>標簽越少,加載也就越快,響應也越迅速。無論是外鏈腳本還是內嵌腳本都是如此。
  • 采用無阻塞下載 JavaScript 腳本的方法:
    • 使用<script>標簽的 defer 屬性(僅適用于 IE 和 Firefox 3.5 以上版本);
    • 使用動態創建的<script>元素來下載并執行代碼;
    • 使用 XHR 對象下載 JavaScript 代碼并注入頁面中。

通過以上策略,可以在很大程度上提高那些需要使用大量 JavaScript 的 Web 網站和應用的實際性能。

 

 

原文鏈接:http://www.ibm.com/developerworks/cn/web/1308_caiys_jsload/index.html

 

 

 

責任編輯:陳四芳 來源: ibm.com
相關推薦

2011-02-23 12:59:08

JSJavaScript瀏覽器

2014-10-09 09:48:14

JavaScript

2012-03-12 09:33:04

JavaScript

2024-09-26 08:36:11

JavaScript性能優化

2025-01-20 09:09:59

2009-06-11 17:15:23

JavaScript性

2009-06-10 22:00:57

JavaScript腳

2017-12-04 12:29:15

前端JavaScript性能優化

2022-02-25 23:46:54

JavaScript網站開發

2019-01-14 08:06:37

JavaScript

2014-10-10 14:00:52

JavascriptHTML

2013-06-06 10:53:39

Javascript裝載

2018-09-11 08:40:00

前端JavaScriptt性能優化

2010-05-28 10:23:59

JavaScriptWeb

2018-06-07 08:54:01

MySQL性能優化索引

2011-04-19 11:06:03

JavaScriptweb

2013-08-27 13:13:29

移動網站性能優化移動web

2019-03-22 09:50:52

WebJavaScript前端

2011-09-29 09:50:44

JavaScript

2023-06-06 15:31:13

JavaScript開發
點贊
收藏

51CTO技術棧公眾號

男人添女人荫蒂免费视频| 国产在线久久久| 国产精品一区二区入口九绯色| 欧美xx视频| 自拍偷拍亚洲综合| 久99久视频| 一本到在线视频| 亚洲人成免费| 精品国产一区二区三区在线观看| 欧美丰满熟妇bbb久久久| 亚洲精品永久免费视频| 亚洲视频一区二区免费在线观看| 精品一区2区三区| 亚洲午夜激情视频| 性欧美精品高清| 欧美激情国产高清| 国产白丝一区二区三区| 人人精品视频| 日韩精品一区二区三区老鸭窝| 熟女少妇精品一区二区| 国内在线免费视频| 亚洲欧洲一区二区在线播放| 欧美极品视频一区二区三区| 99热这里精品| 开心九九激情九九欧美日韩精美视频电影 | 老熟妇高潮一区二区高清视频| 日本美女视频一区二区| 91sa在线看| 久久综合综合久久| 四季av一区二区凹凸精品| 亚洲精品中文字幕女同| 日韩av无码一区二区三区不卡| 粉嫩一区二区三区在线观看| 在线免费观看日本一区| 国产精品宾馆在线精品酒店| 欧美大片黄色| 一区二区三区免费| 992tv成人免费观看| 最近高清中文在线字幕在线观看| 2024国产精品视频| 国产乱码精品一区二区三区不卡| 亚洲va天堂va欧美ⅴa在线| 久久99国产精品尤物| 国产精品国模在线| 免费观看成人毛片| 国产亚洲在线观看| 欧美一级淫片播放口| 久草精品视频在线观看| 影音先锋中文字幕一区二区| 欧美日本亚洲视频| 久久久久久福利| 欧美日韩国产色综合一二三四| 久久天天躁狠狠躁夜夜av| 最新中文字幕av| 超碰成人久久| xvideos亚洲| 久草综合在线视频| 国产精品av一区二区| 欧美激情精品久久久久久大尺度| 久久精品一级片| 亚洲国产成人精品女人| 欧美成人性生活| 久久综合综合久久| 西西裸体人体做爰大胆久久久| 欧美夜福利tv在线| 免费看av在线| 久久99国产精品成人| 亚洲字幕在线观看| 免费的黄色av| 久久理论电影网| 亚洲欧洲精品一区二区| 18在线观看的| 午夜精品视频一区| 国产一级片黄色| 免费一级欧美在线观看视频| 欧美一区二区视频免费观看| 91九色蝌蚪porny| 久久成人av| 久久成人精品视频| 男人的天堂一区二区| 日产国产欧美视频一区精品| 成人精品一区二区三区电影黑人| 国产成人手机在线| 国产亚洲人成网站| 精品视频在线观看一区二区| 欧美私密网站| 69p69国产精品| 在线观看国产三级| 日韩欧美国产精品综合嫩v| 欧美日韩国产第一页| 成人午夜淫片100集| 男人操女人的视频在线观看欧美| 91九色对白| 九色国产在线观看| 一区二区在线看| 国产精品视频黄色| 91麻豆精品激情在线观看最新 | 91精品国产91久久久久久一区二区 | 久久久一区二区三区捆绑**| 一级全黄肉体裸体全过程| 欧美aa免费在线| 在线播放国产精品二区一二区四区 | 欧美黄网在线观看| 欧美日韩尤物久久| 亚洲第一区中文字幕| 色婷婷粉嫩av| 亚洲欧美春色| 成人在线视频电影| 日本在线免费中文字幕| 懂色aⅴ精品一区二区三区蜜月| 蜜臀一区二区三区精品免费视频| 欧美自拍一区| 欧美大片在线看| ,亚洲人成毛片在线播放| 99国产精品久久久| 丁香婷婷综合激情| 91精品国产一区二区在线观看| 亚洲毛片在线看| 免费在线观看黄色av| 卡一卡二国产精品| 日韩欧美一区二区三区四区| 韩国精品一区| 精品久久久久久亚洲综合网 | 男生和女生一起差差差视频| 欧美精品一区二区久久| 日本中文字幕成人| 香港三日本三级少妇66| 亚洲妇女屁股眼交7| 久久久九九九热| 久久国产成人精品| 国产精品久久久久不卡| 男女网站在线观看| 疯狂欧美牲乱大交777| 午夜视频在线观| 五月天久久777| 国产欧美日韩视频| 欧美极品视频| 欧美精品三级日韩久久| 亚洲图片第一页| 日韩成人av影视| 性欧美.com| 成人国产精品入口免费视频| 亚洲人永久免费| 无码人妻精品一区二区50| 久久婷婷一区二区三区| 色综合av综合无码综合网站| 亚洲成在人线免费观看| 日本欧美精品在线| 欧美91精品久久久久国产性生爱| 欧美日韩国产页| 日韩 中文字幕| 久久综合图片| 亚洲一区三区电影在线观看| 欧美日韩视频免费看| 久久精品91久久香蕉加勒比| 国产三级三级在线观看| 夜夜夜精品看看| 中文视频在线观看| 美女爽到呻吟久久久久| 香蕉久久夜色| 日本久久伊人| 91高清免费在线观看| 美女做暖暖视频免费在线观看全部网址91 | 久久久99久久精品女同性| 97人妻精品一区二区三区软件 | 亚洲性生活大片| 一区二区三区四区视频精品免费| 精品人妻伦一二三区久| 久久婷婷一区| 在线观看欧美激情| 伊色综合久久之综合久久| 久久免费观看视频| 国产精品一级伦理| 91麻豆精品久久久久蜜臀| 国产在线免费视频| 久久久777精品电影网影网| 伊人影院综合在线| 国产精品av久久久久久麻豆网| 九九九九精品| 日韩黄色碟片| 91黑丝高跟在线| 北岛玲日韩精品一区二区三区| 欧美一区二区三区在线看| 日日夜夜综合网| 国产精品久久久久久久久免费丝袜 | 日本一区二区三区视频在线| 欧美成人午夜激情| 国产一区二区影视| 日韩三级免费观看| 色老头一区二区| 一区二区理论电影在线观看| 国产 欧美 在线| 国产成人三级在线观看| 成年人视频在线免费| 欧美freesex交免费视频| 蜜桃av久久久亚洲精品| 成人在线日韩| 国产成人av网| 国模雨婷捆绑高清在线| 色偷偷av一区二区三区| 天天舔天天干天天操| 3d动漫精品啪啪| 69国产精品视频免费观看| 亚洲精品中文在线影院| 三年中国中文观看免费播放| 丰满少妇久久久久久久| av噜噜在线观看| 视频精品一区二区| 日韩小视频在线播放| 亚洲国产一区二区三区在线播放| 欧美日本亚洲| 久久国产精品免费精品3p| 成人信息集中地欧美| 欧美一级二级视频| 欧美中文字幕视频在线观看| 性欧美ⅴideo另类hd| 色偷偷888欧美精品久久久| 激情综合闲人网| 日韩av网站在线| 日韩一区二区三区不卡| 日韩午夜小视频| 国产又大又黄的视频| 欧美亚洲综合久久| 中文字幕免费在线观看视频| 性做久久久久久免费观看| 免费在线观看av网址| 亚洲人被黑人高潮完整版| 日本美女bbw| 久久久久久久久久电影| 熟女人妻在线视频| 成人精品在线视频观看| 在线观看欧美成人| 久久精品国亚洲| 国产精品sm调教免费专区| 高跟丝袜欧美一区| 日韩欧美高清在线观看| 亚洲自拍偷拍av| 永久免费看黄网站| 亚洲男人的天堂一区二区| 国产尤物在线播放| 国产精品国产三级国产普通话99 | 在线免费黄色小视频| 黄一区二区三区| 特级西西444www| 国产精品乡下勾搭老头1| 国产xxxxhd| 国产传媒日韩欧美成人| 一二三区视频在线观看| 成人妖精视频yjsp地址| 稀缺呦国内精品呦| 91在线免费视频观看| 亚洲av片不卡无码久久| 国产亚洲一区二区三区在线观看| 一级肉体全黄裸片| 国产精品色噜噜| 久久久久亚洲av片无码| 亚洲精选视频在线| 一级片免费网址| 色偷偷88欧美精品久久久| 免费黄色一级大片| 欧美猛男男办公室激情| 国产不卡精品视频| 精品久久五月天| 青青草手机在线| 国产亚洲欧洲黄色| 成视频免费观看在线看| 欧美成人激情图片网| 绿色成人影院| 国产精品久久久久91| 国产精品免费精品自在线观看| av激情久久| 蜜桃tv一区二区三区| 亚洲欧洲另类精品久久综合| 亚洲天堂一区二区三区四区| 丰满的少妇愉情hd高清果冻传媒 | 亚洲精品成人天堂一二三| 久久精品国产av一区二区三区| 色一区在线观看| 国产免费久久久| 国产婷婷97碰碰久久人人蜜臀| 日本激情在线观看| 91大神在线播放精品| 国产成+人+综合+亚洲欧美| 91手机在线观看| 免费观看久久av| 四虎4hu永久免费入口| 亚洲一区一卡| 91热视频在线观看| 久久一区二区视频| 国产女片a归国片aa| 日韩欧美国产成人| www.色视频| 国产亚洲福利一区| 超碰在线公开| 91免费高清视频| 中文精品一区二区| 91嫩草国产丨精品入口麻豆| 水蜜桃久久夜色精品一区的特点| 欧美专区第二页| 欧美激情一区二区三区| 日本三级片在线观看| 欧美卡1卡2卡| 美女欧美视频在线观看免费| 欧美极度另类性三渗透| 国内欧美日韩| 麻豆av一区二区| 国产一区二区三区四区老人| 亚洲 欧美 日韩系列| 99精品在线观看视频| 无码人妻精品一区二区三区夜夜嗨| 色成人在线视频| 人妻少妇精品无码专区| 久久偷看各类女兵18女厕嘘嘘| 欧美日韩成人影院| 免费国产一区| 亚洲激情国产| 师生出轨h灌满了1v1| 中文字幕在线不卡视频| 中国一级片黄色一级片黄| 亚洲欧美国产日韩中文字幕| 国产高清在线a视频大全| 91在线免费视频| 97精品国产福利一区二区三区| 成人免费无码av| 26uuu精品一区二区在线观看| 久久黄色小视频| 欧美成人aa大片| 性网站在线观看| 亚洲一区二区三区视频播放| 欧美国产偷国产精品三区| 免费看黄色一级大片| 久久综合狠狠综合久久综合88 | 国产资源在线观看入口av| 国产精品初高中精品久久| 欧美精品色网| 中国老熟女重囗味hdxx| 亚洲视频香蕉人妖| 国产喷水福利在线视频| 久久亚洲精品一区| 精品国产伦一区二区三区观看说明 | 国产精品激情av电影在线观看 | 久久偷看各类女兵18女厕嘘嘘| 欧美日韩视频免费看| 中文字幕免费在线不卡| 韩国av一区二区三区四区| 麻豆网址在线观看| 欧美一区二区三区在线观看| 国产激情视频在线| 亚洲最大av网站| 精品电影一区| 醉酒壮男gay强迫野外xx| 日韩欧美一区视频| 国产区在线视频| 国产精品吴梦梦| 99精品网站| 色哟哟免费视频| 亚洲国产cao| 欧美色综合一区二区三区| 国产精品wwww| 国产精品成人a在线观看| 亚洲欧美日韩一二三区| 亚洲成av人片一区二区梦乃| 三级av在线| 国产精品夜色7777狼人| 在线中文字幕亚洲| 99热超碰在线| 色婷婷综合久久久中文字幕| 在线看的av网站| 99国产超薄丝袜足j在线观看| 亚洲麻豆一区| 天天操天天舔天天射| 日韩一级片在线播放| 美女的胸无遮挡在线观看| 日韩理论片在线观看| 国产麻豆精品在线| 在线观看中文字幕视频| 一区二区三区国产视频| 日韩精品一区二区三区中文字幕 | 神马影院我不卡| 国产乱码一区二区三区| 日韩在线视频免费播放| 少妇激情综合网| 豆花视频一区二区| 91激情视频在线| 亚洲尤物视频在线| 浮生影视网在线观看免费| 亚洲va男人天堂| 性色一区二区| 青青草精品在线视频| 亚洲免费精彩视频| 欧美h版在线观看| 免费激情视频在线观看| 依依成人精品视频| 国产乱视频在线观看| caoporn国产精品免费公开| 丝袜a∨在线一区二区三区不卡| 九九热最新地址| 亚洲日本中文字幕| 动漫av一区| 日本成人xxx|