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

寫一個更好的Javascript DOM庫

開發 前端
目前,jQuery是事實上的操作文檔對象模型(DOM)的庫。它可以與流行的客戶端MV*框架結合使用,并且擁有大量的插件與大型的社區。開發者 對于Javascript的興趣與日俱增的同時,很多人開始好奇,原生的API是如何工作的,以及我們何時應該直接使用它們而不是引用一個額外的庫。

目前,jQuery是事實上的操作文檔對象模型(DOM)的庫。它可以與流行的客戶端MV*框架結合使用,并且擁有大量的插件與大型的社區。開發者 對于Javascript的興趣與日俱增的同時,很多人開始好奇,原生的API是如何工作的,以及我們何時應該直接使用它們而不是引用一個額外的庫。

最近,我開始發現越來越多的jQuery的問題,至少是在我的使用中是這樣的。其中的絕大多數涉及到jQuery的核心,在不取消向后兼容的情況下無法解決——而向后兼容又非常重要。與很多人一樣,我繼續使用了它一段時間,每天瀏覽所有討厭的瀏覽器怪異模式。

后來, Daniel Buchner創造了SelectorListener,于是有了“live擴展(live extensions)”的概念。我開始考慮創造一系列的函數,使得我們可以使用比迄今為止用過的方法都更好的方式來創建非干擾性的DOM組件。目標是回顧已有的API與解決方案,并創造一個更干凈、可測試且輕量級的庫。

向庫添加有用的特性

是live擴展的想法鼓勵我開發了better-dom項目,不過,還有一些其他的有趣的特性使得它成為一個獨特的庫。我們快速地看一下:

  • live擴展
  • 原生的動畫
  • 內置的微模板
  • 國際化的支持

live擴展

jQuery有一個叫做“live事件(live events)”的概念。借助事件代理,它使得開發者可以處理現有的以及未來的元素。但是許多情況會要求更大的靈活度。比如為了初始化一個部件而需要對DOM進行轉換,事件代理就會力不從心。故而,live擴展。

目標是,只需定義一次擴展并使得所有未來的元素快速略過初始化函數,而無論部件的復雜度。這個很重要,因為它使得我們可以聲明式地開發web頁面,從而在AJAX應用中表現優異。

[[108606]]

Live擴展使得你無需調用初始化方法就可以操作未來的元素

我們來看一個簡單的例子。假設我們的任務是實現一個完全自定義的提示框。:hover 偽類選擇器并無幫助,因為提示框的位置隨著鼠標移動而變化。事件代理也不是很合適;監聽文檔樹中所有元素的mouseover 及mouseleave 事件代價很大。live擴展將拯救你!

  1. DOM.extend("[title]", { 
  2.   constructor: function() { 
  3.     var tooltip = DOM.create("span.custom-title"); 
  4.   
  5.     // set the title's textContent and hide it initially 
  6.     tooltip.set("textContent"this.get("title")).hide(); 
  7.   
  8.     this 
  9.       // remove legacy title 
  10.       .set("title"null
  11.       // store reference for quicker access 
  12.       .data("tooltip", tooltip) 
  13.       // register event handlers 
  14.       .on("mouseenter"this.onMouseEnter, ["clientX""clientY"]) 
  15.       .on("mouseleave"this.onMouseLeave) 
  16.       // insert the title element into DOM 
  17.       .append(tooltip); 
  18.   }, 
  19.   onMouseEnter: function(x, y) { 
  20.     this.data("tooltip").style({left: x, top: y}).show(); 
  21.   }, 
  22.   onMouseLeave: function() { 
  23.     this.data("tooltip").hide(); 
  24.   } 
  25. }); 

我們可以在CSS中定義 .custom-title 元素的樣式:

  1. .custom-title { 
  2.   position: fixed; /* required */ 
  3.   border: 1px solid #faebcc; 
  4.   background: #faf8f0; 

當你向頁面中插入一個帶title 屬性的新元素時,最有趣的部分發生了。自定義的提示框無需調用任何初始化方法即可生效。

live擴展是獨立的;這樣它們并不需要為了使得未來的內容生效去調用一個初始化方法。因此它們可以與任何DOM庫結合使用,將UI代碼分割成許多小的獨立的塊,從而簡化應用的邏輯。

***,同樣很重要的,一些關于Web組件的內容。規范的一部分,“裝飾器” ,意在解決類似的問題。目前,它使用了一種基于標記的實現,通過特殊的語法,將事件監聽者綁定到子元素上。但它仍只是早期的草案:

“裝飾器,與Web組件的其它部分不同的是,它還沒有一個規范。”

#p#

原生動畫

多虧了 Apple, CSS現在擁有了對動畫的良好支持。過去動畫通常使用Javascript的setInterval 及setTimeout實現。這曾經是很酷的特性——但是現在看來,它更像是壞的實踐。原生的動畫總是更平滑:常常更快,開銷更小,并且在瀏覽器不支持的情況下可以很好地降級。

better-dom中,沒有animate方法:只有show, hide 以及toggle。庫使用基于標準的aria-hidden屬性來在CSS中獲取一個隱藏元素的狀態。

為了說明它是如何工作的,我們來為先前介紹的提示框添加一個簡單的動畫效果:

  1. .custom-title { 
  2.   position: fixed; /* required */ 
  3.   border: 1px solid #faebcc; 
  4.   background: #faf8f0; 
  5.   /* animation code */ 
  6.   opacity: 1; 
  7.   -webkit-transition: opacity 0.5s; 
  8.   transition: opacity 0.5s; 
  9.   
  10. .custom-title[aria-hidden=true] { 
  11.   opacity: 0; 

show() 以及hide() 在內部將 aria-hidden 屬性值設置為false或true。這使得CSS可以處理動畫與轉換。

你可以在這個demo中看到更多使用了better-dom的動畫。

內置的微模板

HTML字符串冗長而繁瑣。尋找替代的過程中我發現了超棒的Emmet。如今Emmet已經是一個非常流行的文本編輯器插件,它擁有漂亮而簡潔的語法。比如這段HTML:

  1. body.append("<ul><li class='list-item'></li><li class='list-item'></li><li class='list-item'></li></ul>"); 

與對應的微模板比較:

  1. body.append("ul>li.list-item*3"); 

在better-dom中,任何接受HTML的方法同樣接受Emmet表達式。縮寫解析器很快,所以不用擔心付出性能代價。如果需要,還有一個模板預編譯函數可用。

國際化支持

開發一個UI組件經常會需要本地化——這并不輕松。多年來,很多人使用不同的方法解決這個問題。在better-dom中,我相信改變CSS選擇器的狀態,就如同轉換語言。

從概念上說,轉換語言正是改變內容的“表現”。在CSS2中,有幾個偽類選擇器可用于描述這樣一個模型::lang 以及:before。我們來看下邊的代碼:

  1. [data-i18n="hello"]:before { 
  2.   content: "Hello Maksim!"
  3.   
  4. [data-i18n="hello"]:lang(ru):before { 
  5.   content: "Привет Максим!"

這是個很簡單的把戲:html 元素的lang 屬性控制當前語言,而content 屬性值根據當前的語言變化。通過使用如data-i18n這樣的屬性,我們可以在HTML中維護文本內容。

  1. [data-i18n]:before { 
  2.   content: attr(data-i18n); 
  3.   
  4. [data-i18n="Hello Maksim!"]:lang(ru):before { 
  5.   content: "Привет Максим!"

當然,這樣的CSS并不吸引人,所以better-com提供了兩個幫助方法:i18n 及DOM.importStrings。前者用于更新 data-i18n 屬性為合適的值,后者為特定的語言本地化字符串。

  1. label.i18n("Hello Maksim!"); 
  2. // the label displays "Hello Maksim!" 
  3. DOM.importStrings("ru",  "Hello Maksim!""Привет Максим!"); 
  4. // now if the page is set to ru language, 
  5. // the label will display "Привет Максим!" 
  6. label.set("lang""ru"); 
  7. // now the label will display "Привет Максим!" 
  8. // despite the web page's language 

還可以使用參數化的字符串。直接向關鍵字符串中添加${param} 變量:

  1. label.i18n("Hello ${user}!", {user: "Maksim"}); 
  2. // the label will display "Hello Maksim!" 

讓原生的APIs 更加優雅

通常我們都希望遵從標準。但是有時候標準對用戶并不友好。DOM就是一團糟 ,為了將其變得好用,我們不得不把它包裝到一個方便的API中。盡管開源的庫已經作了很多改進,仍有一些部分可以做得更好:

  • getter 及setter
  • 事件處理
  • 功能性的方法支持

GETTER 及SETTER

原生的 DOM 元素有attributes 及properties的概念,但他們的行為并不完全一致。假設我們在一個web頁面中有如下的標記:

  1. <a href="/chemerisuk/better-dom" id="foo" data-test="test">better-dom</a> 

為了解釋為什么“DOM就是一團糟”,我們來看這:

  1. var link = document.getElementById("foo"); 
  2.   
  3. link.href; // => "https://github.com/chemerisuk/better-dom" 
  4. link.getAttribute("href"); // => "/chemerisuk/better-dom" 
  5. link["data-test"]; // => undefined 
  6. link.getAttribute("data-test"); // => "test" 
  7.   
  8. link.href = "abc"
  9. link.href; // => "https://github.com/abc" 
  10. link.getAttribute("href"); // => "abc" 

一個attribute與其在HTML中對應的字符串相等,但元素的同名property可能會有一些奇怪的行為,比如在上邊列出來的,生成完全合格的URL。這些區別有時會導致混淆。

在實際使用中,很難想像一個這樣的區別有用的場景。除此之外,開發者必須總是牢記哪些值(attribute 或property)被使用了,這會引入沒必要的復雜度。

在better-dom中,事情要清楚得多。每個元素都只有智能的getter與setter。

  1. var link = DOM.find("#foo"); 
  2.   
  3. link.get("href"); // => "https://github.com/chemerisuk/better-dom" 
  4. link.set("href""abc"); 
  5. link.get("href"); // => "https://github.com/abc" 
  6. link.get("data-attr"); // => "test" 

首先,它做一次屬性(property)查找,如果是已定義的,則返回供操作。不然,getter 及setter 作用于對應的元素屬性(attribute)。對于boolean值(checked, selected, 這些), 可以直接使用 true 或 false 來更新值:改變元素的該屬性(property)將觸發對應的attibute(原生行為)的更新。

#p#

改良的事件處理

事件處理是DOM中很重要的一部分,然而,我發現一個根本性的問題:將event對象傳入元素監聽者的行為導致關心可測試性的開發者不得不偽造***個參數(事件對象),或是創建一個額外的函數來傳入事件處理函數僅需的事件屬性。

  1. var button = document.getElementById("foo"); 
  2.   
  3. button.addEventListener("click"function(e) { 
  4.   handleButtonClick(e.button); 
  5. }, false); 

這很煩人。不過如果我們將可變部分抽象為一個參數,我們就可以擺脫額外的函數:

  1. var button = DOM.find("#foo"); 
  2.   
  3. button.on("click", handleButtonClick, ["button"]); 

默認地,事件處理函數會被傳入["target", "defaultPrevented"] 數組,所以不用為了獲得這些屬性添加***一個參數。

  1. button.on("click"function(target, canceled) { 
  2.     // handle button click here 
  3.  }); 

延時綁定也得到了支持(我建議讀一下Peter Michaux關于這個主題的回顧)。它是W3C的標準中常規事件綁定的更加靈活的替換物。它在你需要頻繁進行啟用和關閉方法調用時非常有用。

  1. button._handleButtonClick = function() { alert("click!"); }; 
  2.   
  3. button.on("click""_handleButtonClick"); 
  4. button.fire("click"); // shows "clicked" message 
  5. button._handleButtonClick = null
  6. button.fire("click"); // shows nothing 

***,同樣很重要的,better-dom不提供任何對于遺留的或不同瀏覽器中表現不一致的API的調用,比如click(), focus() 和submit()。 調用他們的唯一方式是使用fire 方法,它在沒有監聽者返回false的情況下執行默認行為:

  1. link.fire("click"); // clicks on the link 
  2. link.on("click"function() { return false; }); 
  3. link.fire("click"); // triggers the handler above but doesn't do a click 

功能性方法的支持

ES5規范了一些的有用的數組方法,包括 map, filter 以及some。它們允許我們以符合標準的方式使用通用的集合操作。因此現在我們有了諸如Underscore 和Lo-Dash這樣的項目,它們在老的瀏覽器上實現這些方法。

better-dom中的每個元素(或集合)都內置了如下的方法:

each (它與 forEach 的區別在于返回this 而不是 undefined)

some

every

map

filter

reduce[Right]

  1. var urls, activeLi, linkText; 
  2.   
  3. urls = menu.findAll("a").map(function(el) { 
  4.   return el.get("href"); 
  5. }); 
  6. activeLi = menu.children().filter(function(el) { 
  7.   return el.hasClass("active"); 
  8. }); 
  9. linkText = menu.children().reduce(function(memo, el) { 
  10.   return memo || el.hasClass("active") && el.find("a").get() 
  11. }, false); 

避免jQuery的問題

在不放棄向后兼容的情況下,以下的絕大多數問題無法在jQuery中得到解決。這是為什么創造一個新的庫看起來是合乎邏輯的解決途徑。

  • “神奇的” $ 函數
  • [] 操作符的值
  • 關于 return false的問題
  • find 以及findAll

“神奇的” $ 函數

每個人都或多或少聽說過$ (美元) 函數的神奇。一個單字符的名字并不具有描述性,所以它看起來像是一個內置的語言操作符。這也正是缺乏經驗的開發者的代碼中$的調用隨處可見的原因。

在背后的實現中,$是個極其復雜的函數。經常地執行,尤其是 mousemove 、scroll這樣的頻繁事件中,會導致較差的UI性能。

盡管有很多文章建議將jQuery對象緩存下來,開發者依舊在將$大量嵌入在代碼中,因為jQuery庫的語法鼓勵了這樣的代碼風格。

$函數的另一個問題是,它可以被用來做完全不同的兩件事。人們已經喜歡了這樣的語法,但通常來說,這是一個失敗的函數設計:

  1. $("a"); // => searches all elements that match “a” selector 
  2. $("<a>"); // => creates a <a> element with jQuery wrapper 

better-dom 使用了幾個函數來承擔jQuery中$函數的職責:find[All] 以及DOM.create。find[All] 被用來依據CSS選擇器來獲取元素。 DOM.create 在內存中創建一個新的節點樹。它們的名字就可以清晰地表明它們的職責。

#p#

[]操作符的值

導致$函數被頻繁調用的另一個原因正是方括號操作符。當一個新的jQuery對象被創建的時候,所有相關的節點都被存儲在數值型屬性中。但是請注意,這樣一個數值屬性的值包含了一個原生的元素實例(而非經jQuery包裝過的對象):

  1. var links = $("a"); 
  2.   
  3. links[0].on("click"function() { ... }); // throws an error 
  4. $(links[0]).on("click"function() { ... }); // works fine 

正因為這樣的特性,jQuery或是其它庫(比如Underscore)中的每一個功能方法都要求當前元素在回調函數中使用$() 包起來。因此,開發者必須時刻牢記他們正在操作的對象類型——一個原生元素或是一個包裝過的對象——盡管事實上他們正在使用一個操作DOM的庫。

在better-dom中,方括號操作符返回一個庫對象,所以開發者可以忘記原生元素。只有一種可接受的方式來獲取原生元素:使用一個特別的 legacy方法。

  1. var foo = DOM.find("#foo"); 
  2.   
  3. foo.legacy(function(node) { 
  4.   // use Hammer library to bind a swipe listener 
  5.   Hammer(node).on("swipe"function(e) { 
  6.     // handle swipe gesture here 
  7.   }); 
  8. }); 

事實上,只有非常少見的情況會需要這個方法,比如兼容一個原生的方法,或是另一個DOM庫(比如上邊例子中的Hammer)。

關于RETURN FALSE的問題

jQuery事件處理函數中返回false后的奇怪的攔截行為讓我一直很糾結。依據W3C的標準,它應該在大多數情況下取消默認行為。在jQuery中,return false 還會阻止事件代理。

這樣的捕獲會導致問題:

1 自行調用stopPropagation() 可能導致兼容性問題,因為它阻止了其他任務相關的監聽者的執行。

2 大部分開發者(即使是一些有經驗的)并沒有意識到這樣的行為

尚不清楚為什么jQuery社區決定不遵循標準。但better-dom并不會重蹈覆轍。 所以,正如每個人所預期的,事件句柄中的return false 只會阻止瀏覽器默認行為,而不會干擾事件冒泡。

FIND 以及FINDALL

元素查找是在瀏覽器中代價***的操作之一。兩個原生的方法可以用來實現它:querySelector以及querySelectorAll。區別在于前者在匹配到***個結果后即停止查找。

這個特性使得我們可以顯著減少特定情形下的迭代次數。在我的測試中,速度提升到了二十倍!而且,可以預見,依據文檔樹的規模,提升可能達到更多。

jQuery提供了一個find 方法,使用querySelectorAll ,用于一般的情形。目前還沒有函數使用querySelector 來只獲取***個匹配的元素。

better-dom 庫有兩個單獨的方法:find 及findAll。它們允許我們使用querySelector 優化。為了評估潛在的性能提升,我在我上一個商業項目的所有源代碼中搜索了這些方法的使用:

find
在11個文件中匹配103次
findAll
在4個文件中匹配14次

很明顯find 方法要受歡迎得多。這說明querySelector 優化在大多數情況下是有意義的,并能推動相當的性能提升。

結論

live擴展確實使得解決前端問題簡單不少。將UI分割為許多小塊可以帶來更加獨立、可維護的解決方案。不過正如我們所展示的,一個框架不僅僅是關于這些(盡管這是主要目標)。

我在開發過程中學習到的一件事是,如果你不喜歡某個標準,或者你對該如何做某件事情有自己不同看法,那么就去實現它,證明你的方法可行。這也很有趣!

更多關于better-dom 項目的信息可以在GitHub找到。

原文鏈接:http://coding.smashingmagazine.com/2014/01/13/better-javascript-library-for-the-dom/

譯文鏈接:http://blog.jobbole.com/58169/

責任編輯:陳四芳 來源: 伯樂在線
相關推薦

2023-04-11 16:58:35

embark視頻

2021-05-19 22:23:56

PythonJavaScript數據

2015-06-29 11:30:07

JavaScript小烏龜推箱子

2012-01-04 13:55:23

Canvas

2012-07-17 17:05:55

JavaScript

2012-12-12 09:47:56

JavaScript

2017-08-11 17:55:48

前端JavaScript模板引擎

2016-11-29 13:31:52

JavaScriptsetTimeout定時執行

2017-05-18 12:16:03

LinuxPythonNoSql

2021-05-14 10:45:21

PythonNoSQL數據庫

2021-06-08 07:48:26

iOS 15 Linux 操作系統

2015-05-08 12:41:36

C++序列化反序列化庫Kapok

2021-01-28 07:21:13

算法虛擬DOM前端

2022-02-10 07:41:02

JavaScriponce函數

2017-07-10 14:18:34

微服務架構可視化

2023-04-07 15:45:13

Emojicode開源編碼語言

2010-04-19 17:21:36

Oracle寫文件

2019-06-12 08:23:21

數據庫時間序列開源

2021-06-10 13:50:55

代碼開發數據庫

2025-03-26 05:00:00

前端開發者DOM
點贊
收藏

51CTO技術棧公眾號

日韩欧美成人精品| 日韩高清在线观看| 亚洲福利在线观看| 成人一级片网站| 国产youjizz在线| 国产一区二区三区黄视频 | 色国产精品一区在线观看| 亚洲va久久久噜噜噜久久狠狠| 国产精品国产av| 99在线热播精品免费99热| 中文字幕亚洲综合| 欧美激情 亚洲| 天然素人一区二区视频| 夜夜嗨av一区二区三区网页 | 国产精品久久久久久久久久ktv| 久久久久久久久久97| 国产区精品视频在线观看豆花| 91成人免费在线视频| 国产 欧美 日本| 成人三级黄色免费网站| 不卡的av在线播放| 国产日韩欧美中文| 一级片视频在线观看| 永久亚洲成a人片777777| 亚洲欧美在线x视频| 老女人性生活视频| se01亚洲视频| 激情成人在线视频| www国产无套内射com| 成人好色电影| 91麻豆国产精品久久| yellow视频在线观看一区二区| 中文字幕精品一区二区精| 日韩午夜高潮| 欧美极品少妇全裸体| 久久成人小视频| 精品一级毛片| 亚洲精品小视频| 国产毛片毛片毛片毛片毛片毛片| 色播一区二区| 91精品国产综合久久久蜜臀粉嫩 | 久久精品免费av| 婷婷激情综合| 日韩中文字幕网| 1024手机在线观看你懂的| 免费毛片在线不卡| 亚洲免费影视第一页| 亚洲最大的黄色网| 日韩av不卡一区| 精品噜噜噜噜久久久久久久久试看| 污网站在线免费| 国精品产品一区| 欧美性生活久久| 五月婷婷深爱五月| 精品九九久久| 欧美精品欧美精品系列| 日韩va在线观看| 亚洲精品69| 日韩欧美中文字幕公布| 奇米777在线| 精品久久国产一区| 日韩欧美成人一区| 午夜剧场免费看| 欧美亚洲色图校园春色| 亚洲精品一二区| 一区二区三区伦理片| 欧美在线色图| 理论片在线不卡免费观看| 欧美成人三级在线观看| 亚洲激情综合| 国产97在线播放| 91丨porny丨在线中文 | 最新国产乱人伦偷精品免费网站| 久久久久久亚洲精品不卡| 国产乡下妇女做爰| 久久精品综合| 国产一区二区香蕉| 国产xxxx孕妇| 久久综合色婷婷| 亚洲美女搞黄| 日本无删减在线| 好吊成人免视频| 亚洲一级免费在线观看| 清纯唯美激情亚洲| 日韩黄色在线免费观看| 91麻豆制片厂| 狠狠综合久久av一区二区老牛| 91国产美女视频| 在线观看国产小视频| 国产成a人无v码亚洲福利| 久久人人九九| 欧美一区二区三区在线观看免费| 亚洲一区成人在线| 北条麻妃在线视频| 亚洲日本va| 国产亚洲精品美女久久久| 国产日韩欧美在线观看视频| 国产精品毛片在线看| 国产在线观看91精品一区| 天天综合网在线| 国产精品免费久久| 国产69精品久久久久久久| 日韩五码电影| 亚洲毛片在线免费观看| 538精品在线视频| 午夜影院日韩| 波多野结衣成人在线| 国产在线自天天| 亚洲一区二区视频在线观看| www.涩涩涩| 日韩中出av| 欧美理论电影在线播放| 中文有码在线播放| 26uuu另类欧美亚洲曰本| 中国 免费 av| av亚洲一区二区三区| 精品国产百合女同互慰| 日韩在线视频免费看| 久久婷婷久久| 国产一区二区免费电影| 黄色av电影在线观看| 色一情一伦一子一伦一区| 免费不卡的av| 欧美阿v一级看视频| 国产免费一区视频观看免费| 天堂v视频永久在线播放| 亚洲一二三区视频在线观看| 三区视频在线观看| 成人毛片在线| 国产精品都在这里| 欧美女优在线观看| 日韩欧美综合在线视频| 午夜视频在线观看国产| 黑人一区二区| 成人在线观看av| 中文字幕免费高清电视剧网站在线观看| 欧美在线你懂的| a天堂中文字幕| 欧美一级二区| 久久久综合香蕉尹人综合网| av剧情在线观看| 亚洲国产小视频在线观看| 久草视频中文在线| 顶级嫩模精品视频在线看| 超薄肉色丝袜足j调教99| 国产aa精品| 久久成人亚洲精品| www.麻豆av| 亚洲综合色婷婷| 伊人久久一区二区三区| 亚洲成人原创| 国产在线一区二| 第84页国产精品| 亚洲社区在线观看| 波多野结衣视频网址| 国产日本一区二区| 婷婷丁香激情网| 日韩大片在线播放| 成人有码视频在线播放| 午夜av在线播放| 亚洲成人久久久| 亚洲乱码国产乱码精品| 欧美国产丝袜视频| 欧美污在线观看| 亚洲精品男同| 日本免费一区二区三区| 日本成人一区二区| 色综合久久中文字幕综合网小说| 精品人妻一区二区三区日产乱码| 亚洲一区二区三区国产| 日韩综合第一页| 天堂资源在线中文精品| 伊人色综合影院| 亚洲精品在线播放| 日本91av在线播放| 伊人在线视频| 亚洲成年网站在线观看| 久久久久久久久久久影院| 亚洲国产电影在线观看| 国产调教打屁股xxxx网站| 99pao成人国产永久免费视频| 欧洲国产精品| 精品三级国产| 欧洲成人午夜免费大片| 麻豆免费在线视频| 欧美电视剧在线看免费| 影音先锋在线国产| 中文字幕一区二区在线观看| 日本精品一二三区| 日韩精品一区第一页| 大陆极品少妇内射aaaaaa| 神马日本精品| 91免费在线视频| 狠狠操一区二区三区| 色噜噜亚洲精品中文字幕| 精品国产免费无码久久久| 日本韩国精品在线| 免费网站看av| 国产精品私人影院| 日本少妇xxxx| 久久av老司机精品网站导航| 免费无码不卡视频在线观看| 国产精品x453.com| 久久久久网址| 视频国产精品| 国产精品网站大全| 在线观看网站免费入口在线观看国内| 大胆人体色综合| 国产一级片在线| 亚洲第一天堂av| 国产精品欧美综合亚洲| 日本韩国欧美在线| 91国产丝袜播放在线| 亚洲视频一区在线| 欧美三级视频网站| 91美女蜜桃在线| 人妻巨大乳一二三区| 日本不卡在线视频| 久草资源站在线观看| 欧美三级在线| 久久精品国产精品亚洲精品色| 国产成人影院| 久久99精品久久久久久水蜜桃| 国内不卡的一区二区三区中文字幕| 日本免费久久高清视频| heyzo高清国产精品| 欧美精品在线网站| 国产在线看片| 中文字幕日韩在线播放| 国产69久久| 亚洲欧洲日产国码av系列天堂| 五月婷婷六月激情| 亚洲成年人在线| 国产成人无码www免费视频播放| 6080国产精品一区二区| 亚洲视频一区在线播放| 欧美亚洲高清一区| 中文字幕在线天堂| 色丁香久综合在线久综合在线观看 | 日本在线成人| 亚洲最大成人在线| 我要色综合中文字幕| 99国产高清| 草草视频在线一区二区| 国产精品一区二区三区免费观看 | 51午夜精品国产| 国产精品乱码久久久| 欧美剧在线免费观看网站| 91在线你懂的| 欧美一区二区在线视频| 99视频免费看| 精品国产123| 天堂av资源在线| 亚洲精品一区二区三区婷婷月| 暖暖视频在线免费观看| 国产亚洲欧美日韩美女| 欧美极品视频| 欧美成人精品一区| wwww在线观看免费视频| 69久久夜色精品国产7777| 亚洲精品日产| 国产精品扒开腿做爽爽爽的视频| 成人性片免费| 成人性教育视频在线观看| 7m精品国产导航在线| 看高清中日韩色视频| 国产午夜一区| 三级在线免费观看| 亚洲日本黄色| 日本久久精品一区二区| 韩国三级电影一区二区| 美女扒开腿免费视频| 久久久久国产一区二区三区四区 | 一区二区三区四区在线播放| 五月天婷婷丁香| 欧洲生活片亚洲生活在线观看| 一区二区三区免费观看视频| 欧美成人三级在线| 欧美女优在线| 欧美美女18p| 波多野结衣亚洲| 成人国产精品日本在线| 国产精品久av福利在线观看| 日本一区视频在线观看免费| 欧美/亚洲一区| 久久精品一区二| 国产自产高清不卡| 18禁裸乳无遮挡啪啪无码免费| 一色屋精品亚洲香蕉网站| 国产无套在线观看| 欧美日韩一区二区三区高清 | 亚洲日本成人女熟在线观看| 黄色在线免费| 91a在线视频| 国产精品久一| 日韩精品久久久| 在线欧美日韩| 亚洲无在线观看| 久久人人爽爽爽人久久久| 成年人av电影| 欧美三级中文字幕在线观看| 三级网站免费观看| 久久婷婷国产麻豆91天堂| 亚洲天堂手机| 成人性色av| **女人18毛片一区二区| 无码人妻h动漫| 风流少妇一区二区| 国产三级精品三级观看| 色狠狠色噜噜噜综合网| 色噜噜一区二区三区| xvideos亚洲人网站| 欧美xxxx做受欧美护士| 国模一区二区三区私拍视频| 99国产精品一区二区| 亚欧在线免费观看| 97久久超碰国产精品| 九九热国产精品视频| 欧美日韩夫妻久久| 国产综合在线观看| 26uuu另类亚洲欧美日本一| 亚洲2区在线| 国产911在线观看| 久久爱另类一区二区小说| 国产高清一区二区三区四区| 精品久久久久久久久中文字幕| www.com在线观看| 久久精品一区中文字幕| 自拍偷自拍亚洲精品被多人伦好爽 | 972aa.com艺术欧美| 欧美成人精品欧美一| 欧美精选一区二区| 亚洲欧美视频一区二区| 国产精品盗摄久久久| 同性恋视频一区| 日韩av在线第一页| 99久久久精品| 天堂在线免费观看视频| 亚洲国产三级网| 欧美激情网站| 久久久com| 美女国产精品| 三级网站在线免费观看| 欧美性生交xxxxx久久久| 欧美精品少妇| 国产精品福利网站| 日本女优一区| www.久久久精品| 一区在线观看免费| 国产男男gay体育生白袜| 欧美xxxx14xxxxx性爽| 亚洲欧美日本国产| 黄色一级片在线看| 97久久超碰国产精品| 欧美人一级淫片a免费播放| 国产亚洲欧洲黄色| 欧美伊人亚洲伊人色综合动图| 国产四区在线观看| 国产不卡视频在线播放| 日韩成人在线免费视频| 亚洲精品丝袜日韩| 六九午夜精品视频| 久久免费一级片| 不卡的av网站| 亚洲中文字幕无码爆乳av| 爽爽爽爽爽爽爽成人免费观看| 日本午夜免费一区二区| 青青草综合在线| 成人免费高清在线| 波多野结衣黄色| 欧美成在线视频| 亚洲bt欧美bt精品777| 手机在线看福利| 亚洲少妇30p| 亚洲成人精品女人久久久| 8x海外华人永久免费日韩内陆视频| 欧美先锋资源| 亚洲一二区在线观看| 精品国产乱码久久久久久婷婷 | 中文字幕精品一区二区三区精品| 国产精品伦理一区| 91精品91久久久久久| 成人羞羞动漫| 伊人av在线播放| 精品久久久一区二区| √天堂资源地址在线官网| 不卡一区二区三区视频| 日韩主播视频在线| 久草免费新视频| 在线一区二区日韩| 精品欧美午夜寂寞影院| 五月婷婷丁香综合网| 亚洲高清免费视频| 香蕉视频免费在线播放| 国产伦精品一区二区三区视频黑人 | 欧美一级bbbbb性bbbb喷潮片| 欧美丰满日韩| 三叶草欧洲码在线| 日韩视频一区二区在线观看| 日韩欧美一区二区三区在线观看|