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

jQuery最核心基礎設施:數據緩存模塊進化史

開發 前端
數據緩存系統最早應該是jQuery1.2引入的,那時它的事件系統完成照搬DE大神的addEvent.js,而addEvent在實現有個缺憾,它把事件的回調都放到EventTarget之上,這會引發循環引用,如果EventTarget是window對象,又會引發全局污染。有了數據緩存系統,除了規避這兩個風險外,我們還可以有效地保存不同方法產生的中間變量,而這些變量會對另一個模塊的方法有用,解耦方法間的依賴。對于jQuery來說,它的事件克隆乃至后來的列隊實現都是離不開緩存系統。

jQuery1.2 在core模塊新增了兩個靜態方法, data與removeData。data不用說,與jQuery其他方法一樣,讀寫結合。jQuery的緩存系統是把所有數據都放$.cache之上,然后為每個要使用緩存系統的元素節點,文檔對象與window對象分配一個UUID。UUID的屬性名為一個隨機的自定義屬性,"jQuery" + (new Date()).getTime(), 值為整數,從零遞增。但UUID總要附于一個對象上,如果那個對象是window,豈不是全局污染嗎,因此jQuery內部判定它是window對象時,映射為一個叫windowData的空對象,然后UUID加在它之上。有了UUID,我們在首次訪問緩存系統時,會在$.cache對象開辟一個空對象(緩存體),用于放置與目標對象有關的東西。這有點像銀行開戶了,UUID的值就是存折。removeData則會刪掉不再需要保存數據,如果到最后,數據刪清光了,它也沒有任何鍵值對,成為空對象,jQuery就會從$.cache中刪掉此對象,并從目標對象移除UUID。

  1. //jQuery1.2.3 
  2. var expando = "jQuery" + (new Date()).getTime(), uuid = 0, windowData = {}; 
  3. jQuery.extend({ 
  4.     cache: {}, 
  5.     data: function( elem, name, data ) { 
  6.         elem = elem == window ? windowData :   elem;//對window對象做特別處理 
  7.         var id = elem[ expando ]; 
  8.         if ( !id ) //如果沒有UUID則新設一個 
  9.             id = elem[ expando ] = ++uuid; 
  10.         //如果沒有在$.cache中開戶,則先開戶 
  11.         if ( name && !jQuery.cache[ id ] ) 
  12.             jQuery.cache[ id ] = {}; 
  13.   
  14.         // 第三個參數不為undefined時,為寫操作 
  15.         if ( data != undefined ) 
  16.             jQuery.cache[ id ][ name ] = data; 
  17.         //如果只有一個參數,則返回緩存對象,兩個參數則返回目標數據 
  18.         return name ?  jQuery.cache[ id ][ name ] :   id; 
  19.     }, 
  20.   
  21.     removeData: function( elem, name ) { 
  22.         elem = elem == window ? windowData :   elem; 
  23.         var id = elem[ expando ]; 
  24.         if ( name ) {//移除目標數據 
  25.             if ( jQuery.cache[ id ] ) { 
  26.                 delete jQuery.cache[ id ][ name ]; 
  27.                 name = ""
  28.   
  29.                 for ( name in jQuery.cache[ id ] ) 
  30.                     break
  31.                 //遍歷緩存體,如果不為空,那name會被改寫,如果沒有被改寫,則!name 為true, 
  32.                 //從而引發再次調用此方法,但這次是只傳一個參數,移除緩存體, 
  33.                 if ( !name ) 
  34.                     jQuery.removeData( elem ); 
  35.             } 
  36.         } else { 
  37.             //移除UUID,但IE下對元素使用delete會拋錯 
  38.             try { 
  39.                 delete elem[ expando ]; 
  40.             } catch(e){ 
  41.                 if ( elem.removeAttribute ) 
  42.                     elem.removeAttribute( expando ); 
  43.             }//注銷賬戶 
  44.             delete jQuery.cache[ id ]; 
  45.         } 
  46.     } 
  47. }) 

jQuery在1.2.3中添加了兩個同名的原型方法data與removeData,目的是方便鏈式操作與集化操作。并在data中添加getData, setData的自定義事件的觸發邏輯。

1.3中,數據緩存系統終于獨立成一個模塊data.js(內部開發時的劃分),并添加了兩組方法,命名空間上的queue與dequeue,原型上的queue與dequeue。queue的目的很明顯,就是緩存一組數據,為動畫模塊服務。dequeue是從一組數據中刪掉一個。

  1. //jQuery1.3 
  2. jQuery.extend({ 
  3.     queue: function( elem, type, data ) { 
  4.         if ( elem ){ 
  5.             type = (type || "fx") + "queue"
  6.             var q = jQuery.data( elem, type ); 
  7.             if ( !q || jQuery.isArray(data) )//確保儲存的是一個數組 
  8.                 q = jQuery.data( elem, type, jQuery.makeArray(data) ); 
  9.             else if( data )//然后往這個數據加東西 
  10.                 q.push( data ); 
  11.         } 
  12.         return q; 
  13.     }, 
  14.     dequeue: function( elem, type ){ 
  15.         var queue = jQuery.queue( elem, type ), 
  16.         fn = queue.shift();//然后刪掉一個,早期它是放置動畫的回調,刪掉它就call一下, 
  17.         // 但沒有做是否為函數的判定,估計也沒有寫到文檔中,為內部使用 
  18.         if( !type || type === "fx" ) 
  19.             fn = queue[0]; 
  20.         if( fn !== undefined ) 
  21.             fn.call(elem); 
  22.     } 
  23. }) 

fx模塊animate方法的調用示例:

  1. //each是并行處理多個動畫,queue是一個接一個處理多個動畫 
  2. this[ optall.queue === false ? "each" : "queue" ](function(){ /*略*/}) 

在元素上添加自定義屬性,還會引發一個問題。如果我們對這個元素進行拷貝,就會將此屬性也會復制過去,導致兩個元素都有相同的UUID值,出現數據被錯誤操作的情況。jQuery早期的復制節點實現非常簡單,如果元素的cloneNode方法不會復制事件就使用cloneNode,否則使用元素的outerHTML,或父節點的innerHTML,用clean方法解析一個新元素出來。但outerHTML與innerHTML都會顯式屬性寫在里面,因此需要用正則把它們清除掉。

  1. //jQuery1.3.2 core.js clone方法 
  2. var ret = this.map(function(){ 
  3.     if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { 
  4.         var html = this.outerHTML; 
  5.         if ( !html ) { 
  6.             var div = this.ownerDocument.createElement("div"); 
  7.             div.appendChild( this.cloneNode(true) ); 
  8.             html = div.innerHTML; 
  9.         } 
  10.   
  11.         return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0]; 
  12.     } else 
  13.         return this.cloneNode(true); 
  14. }); 

jQuery1.4發現IE如果對于object, ember, applet這三個古老的用于接入外部資源的標簽可能會拋錯。由于舊式IE的元素節點只是COM的包裝,一旦引入資源后,它就會變成那種資源的實例,而它們會有嚴格的訪問控制,不能像普通的JS對象那樣隨意添加成員。于是jQuery便一刀換,但凡是這三種標簽,就不為它緩存數據。jQuery弄了一個叫noData的hash,用于檢測元素節點的標簽。

  1. noData: { 
  2.     "embed"true
  3.     "object"true
  4.     "applet"true 
  5. }, 
  6. //代碼防御        
  7. if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) { 
  8.     return

jQuery1.4還對$.data進行改進,允許第二個參數為對象,方便儲存多個數據。UUID對應的自定義屬性expando 也放進命名空間之下了。queue與dequeue方法被剝離成一個新模塊。

jQuery1.43帶來三項改進。

首先是添加changeData自定義方法。不過這套方法沒有什么銷量,只是產品經理的自戀吧。

檢測元素節點是否支持添加自定義屬性的邏輯被獨立成一個叫acceptData的方法。因為jQuery團隊發現當object標簽加載的flash資源,它還是可以添加自定義屬性的,于是決定對這種情況網開一面。IE在加載flash時,需要對object指定一個叫classId的屬性,值為clsid:D27CDB6E-AE6D-11cf-96B8-444553540000,因此檢測邏輯就變得非常復雜,由于data, removeData都要用到,獨立出來有效節省比特。

HTML5對人們隨便添加自定義屬性的行為做出回應,新增一種叫"data-*"的緩存機制。當用戶設置的屬性以"data-"開頭,它們會被保存到元素節點的dataset對象上。這就導致人們可能用HTML5方便緩存數據,也可能用jQuery的緩存系統保存數據,那么data方法就變得有點不中用了。于是jQuery在原型上的data做了增強,當用戶第一次訪問此元素節點,會遍歷它所有"data-"開頭的自定義屬性(為了照顧舊式IE,不能直接遍歷dataset),把它們放到jQuery的緩存體中。那么當用戶取數據時,會先從緩存系統中,沒有再使用setAttribute訪問"data-"自定義屬性。但HTML5的緩存系統非常弱,只能保存字符串(這當然是出于循環引用的考量),于是jQuery會將它們還原為各種數據類型,如"null",, "false", "true"變成null, false, true, 符合數字格式的字符串會轉換成數字,如果它是以"{"開頭"}"結尾則嘗試轉成一個對象。

 

  1. //jQuery1.43 $.fn.data 
  2. rbrace = /^(?:\{.*\}|\[.*\])$/; 
  3. if ( data === undefined && this.length ) { 
  4.     data = jQuery.data( this[0], key ); 
  5.     if ( data === undefined && this[0].nodeType === 1 ) { 
  6.         data = this[0].getAttribute( "data-" + key ); 
  7.   
  8.         if ( typeof data === "string" ) { 
  9.             try { 
  10.                 data = data === "true" ? true : 
  11.                     data === "false" ? false : 
  12.                     data === "null" ? null : 
  13.                     !jQuery.isNaN( data ) ? parseFloat( data ) : 
  14.                     rbrace.test( data ) ? jQuery.parseJSON( data ) : 
  15.                     data; 
  16.             } catch( e ) {} 
  17.   
  18.         } else { 
  19.             data = undefined; 
  20.         } 
  21.     } 

jQuery1.5也帶來三項改進。當時jQuery已經在1.42打敗Prototype.js,如日中天,馬太效應,用戶量暴增。它的重點改為提升性能,進入fix bug階段(用戶多,相當于免費的測試員就越多,測試覆蓋面就越大)。

改進expando,原來是基于時間截,現在是版本號加隨機數。因此用戶可能在一個頁面引入多個版本的jQuery。

是否有此數據的邏輯被抽出成一個hasData方法,處理HTML5的"data-*"屬性也被抽出成一個私有方法dataAttr。它們都是為了邏輯顯得更清晰。dataAttr使用JSON.parse,由于這個JSON可能是JSON2.js引入的,而JSON2.js有個非常糟糕的地方,就是為一系列原生類型添加了toJSON方法,導致for in 循環判定是否為空對象出錯。jQuery被逼搞了個isEmptyDataObject方法做處理。

jQuery的數據緩存系統本來就是為事件系統服務而分化出來的,到后來,它是內部眾多模塊的基礎設施。換言之,它內部會儲存許多框架用戶的變量(系統數據),但一旦它公開到文檔中,用戶也會使用data保存他們務業中使用的數據(用戶數據)。以前,用戶小,變量名沖突的可能性比較少,加之jQuery為這些系統數據精挑了一些不常用的名字,__class__, __change__或加個后綴什么的,沒有收到什么投訴。當jQuery成為世界級的著名框架后,用戶數據名干掉系統數據名,導致事件系統或其他什么模塊癱瘓就時有發生。jQuery開始對緩存體進行改造,原來就是一個對象,什么數據都往里面拋。現在它就這個緩存體內開辟一個子對象,鍵名為隨機的jQuery.expando值,如果是系統數據就存到里面去。但events系統數據為了向前兼容起見,還是直接放到緩存體之上。至于,如何區分是系統數據,非常簡單,直接在data方法添加第四個參數,真值時為系統數據。removeData時也相應提供第三個參數,用于刪除系統數據。還新設了一個_data方法,專門用于操作系統數據。下面就是緩存體的結構圖:

  1.  var cache = { 
  2.      jQuery14312343254:{/*放置系統數據*/
  3.      events: {/"放置事件名與它對應的回調列表"/} 
  4.      /*這里放置用戶數據*/ 
  5. jQuery1.7對緩存體做了改進,系統變量變放置data對象中,為此判定緩存體為空也要做相應的改進,現在要跳過toJSON與data。新結構如下: 
  6.  
  7. var cache = { 
  8.      data:{/*放置用戶數據*/
  9.      /*這里放置系統數據*/ 

jQuery1.8曾添加一個叫deleteIds的數組,用于重用UUID,但曇花一現。UUID的值從1.8起不用jQuery.uuid的了,改用jQuery.guid遞增生成。重大的改進在jQuery1.83后,操作數據的實現被抽出為私有方法,命名空間與原型上的方法只是一個代理,并分成兩組方法,操作用戶數據的data, removeData,操作系統數據的_data,_removeData。現在光是緩存系統就是一個龐大家族了。

說到底,數據緩存就是在目標對象與緩存體間建立一對一的關系,然后在緩存體上操作數據,復雜度都集在前者。而在一個普通JS對象進行增刪改查某屬性從來沒有難度,用戶怎么也玩不出花招。從軟件設計原則上看,這也是最好的結果(吻合KISS原則與職責單一則)。

原文鏈接:http://www.cnblogs.com/rubylouvre/archive/2012/11/19/2776286.html

【編輯推薦】

責任編輯:彭凡 來源: 博客園
相關推薦

2019-06-19 15:54:12

Redis緩存內存

2018-08-23 09:33:12

2011-12-21 16:44:00

信息圖手機進化史

2018-03-23 12:20:25

數據中心網絡數據

2024-09-21 10:43:15

數據技術信息

2014-09-01 16:29:34

2011-11-03 15:25:07

Android

2011-11-29 09:54:20

Google進化史

2010-07-27 14:04:52

2011-09-01 09:34:21

架構

2023-05-12 15:15:23

數字化轉型大數據

2018-08-22 17:58:01

數據平臺數據倉庫架構

2010-04-07 14:54:20

Unix操作系統

2010-01-21 16:08:26

C++語言

2010-10-09 14:46:20

2018-12-21 11:01:05

存儲大數據RAID

2013-06-24 09:18:05

2014-08-13 10:31:26

Windows操作系統

2011-11-04 15:58:52

手機操作系統進化史

2022-03-25 14:01:20

元宇宙虛擬世界進化
點贊
收藏

51CTO技術棧公眾號

91精品国产综合久久精品麻豆| 成人av网站大全| 日韩在线视频播放| 性生活一级大片| 一二三四视频在线中文| 国产精品丝袜在线| 国产不卡一区二区在线观看 | 亚洲特黄一级片| 国产精成人品localhost| 中文字幕第四页| 久久久久亚洲| 亚洲欧美国产制服动漫| 污污视频在线免费| 欧美大胆性生话| 一区二区成人在线| 视频一区不卡| 亚欧在线观看视频| 国产麻豆视频精品| 日韩av片永久免费网站| 青青草原国产视频| 人人狠狠综合久久亚洲婷婷| 亚洲国产女人aaa毛片在线| 中文字幕亚洲欧洲| 成人美女黄网站| 亚洲一级二级三级在线免费观看| 视频一区视频二区视频| 天天摸夜夜添狠狠添婷婷| 久久91精品久久久久久秒播| 5252色成人免费视频| 欧美精品videos极品| 大片网站久久| 亚洲精品综合久久中文字幕| 影音先锋资源av| 国产电影一区| 欧美色倩网站大全免费| 国产亚洲天堂网| av成人影院在线| 亚洲欧美国产77777| 日本一区二区三区视频免费看| 黄色成人一级片| 国产久卡久卡久卡久卡视频精品| 国产精品入口尤物| 久久久精品毛片| 噜噜噜在线观看免费视频日韩| 性欧美激情精品| 国产污视频在线看| 国内精品久久久久久久97牛牛| 欧美乱大交做爰xxxⅹ性3| 免费精品在线视频| 国产精品久久久久久久| 日韩中文字幕在线免费观看| 1024手机在线观看你懂的| 欧美人与物videos另类xxxxx| 亚洲精品美女在线观看| 亚洲国产精品自拍视频| 欧美色资源站| 亚洲欧美国产一区二区三区| 日韩乱码人妻无码中文字幕久久| 香蕉久久99| 亚洲欧美日韩中文在线制服| 男人操女人动态图| 国产乱码精品一区二区亚洲| 国产亚洲视频在线| 欧美精品日韩在线| 99久久www免费| 欧美成人激情视频| 国产精品suv一区二区| 99香蕉国产精品偷在线观看| 欧美在线视频在线播放完整版免费观看 | 久久伊人精品一区二区三区| 特一级黄色录像| 欧美激情无毛| 午夜精品福利视频| 久久精品视频5| 乱一区二区av| 亚洲综合色av| 天堂在线中文网| 国产日韩在线不卡| 黄频视频在线观看| 麻豆福利在线观看| 日韩欧美成人精品| 在线观看av网页| 亚洲精品福利| 亚洲摸下面视频| 亚洲人做受高潮| 亚洲激情偷拍| 国产精品福利片| 国产乱淫a∨片免费观看| 国产99久久久国产精品免费看| 精品日产一区2区三区黄免费| 国产黄色片在线播放| 亚洲视频一区二区在线| 老太脱裤让老头玩ⅹxxxx| 我爱我色成人网| 欧美一级在线免费| 国产艳俗歌舞表演hd| 97精品国产| 69精品小视频| 国产精品一品二区三区的使用体验| 成人一区二区在线观看| 日本在线观看一区二区| 色呦呦在线资源| 欧美在线999| 亚洲色偷偷色噜噜狠狠99网| 欧美丰满老妇| 91av在线免费观看| 国产手机视频在线| 国产视频一区在线播放| 97免费视频观看| 欧美日韩女优| 日韩电影中文字幕在线观看| 永久免费看mv网站入口| 小嫩嫩精品导航| 国产高清自拍一区| 乱人伦中文视频在线| 色婷婷综合久久久中文字幕| 成年人小视频在线观看| 91精品国产视频| 国产精品国模在线| 天天色综合久久| 亚洲一区二区三区四区在线 | 996久久国产精品线观看| 日韩黄色高清视频| 久久久99精品| 国产在线一区二区综合免费视频| 欧美亚州在线观看| 蜜桃视频m3u8在线观看| 精品久久国产字幕高潮| 日本中文字幕免费在线观看| 免费亚洲电影在线| 欧美精品一区在线发布| 久久影院午夜精品| 欧美精品一区二区三| www.色小姐com| 激情六月婷婷综合| 亚洲一区二区三区色| 羞羞影院欧美| 国产一区二区三区毛片| 男人天堂视频网| 久久亚洲综合色一区二区三区 | 欧美a级一区二区| 免费久久99精品国产自| 久草免费在线视频| 亚洲精品乱码久久久久久按摩观| 久久人人爽人人爽人人| 国产成人在线视频免费播放| 毛片av在线播放| 一区二区三区视频播放| 欧美日韩福利在线观看| 国产成人免费看一级大黄| 亚洲免费观看在线观看| 少妇欧美激情一区二区三区| 狠狠干成人综合网| 精品一区二区三区免费毛片| 91精品论坛| 伊人久久综合97精品| 伊人成人在线观看| 亚洲欧美日韩一区| 三上悠亚 电影| 雨宫琴音一区二区在线| 精品久久久久久一区二区里番| 欧美aa在线| 国产亚洲成精品久久| 一级黄色小视频| 亚洲少妇屁股交4| 国产精品91av| 国产精品嫩草99av在线| 日韩片电影在线免费观看| 青青青国产精品| 欧美巨乳美女视频| 无码精品人妻一区二区| 日韩欧美精品在线观看| 欧美人与禽zoz0善交| 国内精品免费**视频| 少妇一晚三次一区二区三区| 麻豆成人入口| 国产精品视频xxxx| 色呦呦网站在线观看| 亚洲国产天堂网精品网站| 日韩精品一区二区亚洲av| 欧美国产1区2区| 免费黄视频在线观看| 国产亚洲一级| 在线一区亚洲| 国产精品videossex| 国产精品mp4| 成人短视频在线| 亚洲精品大尺度| 中文字幕一区二区在线视频| 一区二区在线电影| 日韩在线免费观看av| 麻豆freexxxx性91精品| 免费在线观看视频a| 成人久久电影| 国产伦精品一区二区三区照片91| 性欧美freehd18| 欧美激情第三页| 91在线不卡| 亚洲国产天堂网精品网站| 一级全黄少妇性色生活片| 亚洲影视在线观看| a级黄色免费视频| 成年人国产精品| 少妇黄色一级片| 亚洲巨乳在线| 好色先生视频污| 国产剧情在线观看一区| 国产激情一区二区三区在线观看 | 91精品国产综合久久精品app| 日韩在线观看第一页| 亚洲欧美视频在线观看视频| 久久中文字幕人妻| 高清国产午夜精品久久久久久| 三级a三级三级三级a十八发禁止| 99视频精品| www成人免费| 国产精品精品| 亚洲国产欧洲综合997久久| 任你躁在线精品免费| 97视频资源在线观看| 亚洲老司机网| 国产精品一区电影| 婷婷六月国产精品久久不卡| 国内精品久久久久久| a黄色片在线观看| 中文在线资源观看视频网站免费不卡| 五月婷婷深深爱| 精品国产免费一区二区三区四区 | 成人免费黄色| 日韩暖暖在线视频| 日韩精品av| 97在线视频免费观看| 美足av综合网| 久99久在线视频| 成人在线app| 久久成人国产精品| 成人无遮挡免费网站视频在线观看| 在线观看久久久久久| 激情在线视频| 亚洲男人的天堂在线| 亚洲 欧美 自拍偷拍| 亚洲国产精品99| 人妻无码中文字幕免费视频蜜桃| 精品日韩欧美一区二区| 性猛交富婆╳xxx乱大交天津| 日韩亚洲欧美一区二区三区| av中文字幕免费| 欧美一区二区大片| 精品毛片在线观看| 日韩女优电影在线观看| 亚洲免费黄色片| 亚洲第一视频网| 手机看片福利在线| 日韩激情片免费| 国产精品二线| 久久精品影视伊人网| 成人黄色网址| 欧美精品一区二区三区国产精品 | 亚洲妇熟xx妇色黄| 日韩精品一区二区不卡| 欧美日韩国产区| 97人妻一区二区精品视频| 在线观看国产一区二区| 在线观看中文字幕网站| 欧美一区二区三区四区视频| 亚洲av无码专区在线| 亚洲精品福利在线观看| 久久精品国产亚洲a∨麻豆| 这里只有精品丝袜| 精品美女在线观看视频在线观看| 九色精品免费永久在线| 中文字幕在线视频久| 国产精品日韩精品| 免费一级欧美片在线观看网站| 国产一区二区三区无遮挡| 国产日产一区| 米仓穗香在线观看| 9色精品在线| 9久久婷婷国产综合精品性色| 国模一区二区三区白浆 | 久久免费精品国产久精品久久久久| 中文字幕第20页| 亚洲精品中文在线| 一区二区三区福利视频| 欧美精品欧美精品系列| 欧美一级特黄aaaaaa| 亚洲一区二区国产| 三级资源在线| 国产精品69av| 久久在线观看| 欧美一区二区视频17c| 久久精品国内一区二区三区水蜜桃| av日韩一区二区三区| 蜜桃视频在线一区| 污污污www精品国产网站| 国产精品美女一区二区在线观看| 国产在线观看免费视频今夜| 在线观看一区二区视频| 亚洲AV无码精品自拍| 综合国产在线视频| 欧美sm一区| 97人人模人人爽人人少妇| 久久91麻豆精品一区| 欧美a级免费视频| 美日韩一区二区三区| 亚洲一级av无码毛片精品| 日韩一区中文字幕| youjizz在线视频| 日韩网站在线看片你懂的| 国产精品秘入口| 欧美有码在线观看| 66精品视频在线观看| 一区二区三区四区五区视频| 国产日韩欧美一区| 天堂va欧美va亚洲va老司机| 中文一区二区在线观看| 日本中文字幕在线| 亚洲精品一区二区三区99| fc2ppv国产精品久久| 国产精品久久久久久婷婷天堂 | 国产69精品久久久久毛片| 九九热免费在线| 欧美午夜激情小视频| 刘亦菲久久免费一区二区| 欧美成人免费视频| 欧美电影在线观看网站| 日本在线播放一区| 久久高清一区| 亚洲欧美色图视频| 欧美日韩黄色大片| 日本人妻丰满熟妇久久久久久| 久久在线视频在线| 97久久中文字幕| 中文字幕久久一区| 麻豆成人91精品二区三区| 亚洲女优在线观看| 色999日韩国产欧美一区二区| 日色在线视频| 2020国产精品视频| 日韩人体视频| 91av资源网| www成人在线观看| 日韩精品一区二区亚洲av| 亚洲毛片在线免费观看| 唐人社导航福利精品| 日韩欧美一区二区在线观看| 免费在线观看不卡| 精品女人久久久| 欧美精品一二三区| 性欧美videoshd高清| 亚洲最大福利网站| 欧美日一区二区在线观看 | 国产性xxxx18免费观看视频| 99精品一区二区| 精品人妻一区二区三区免费看| 精品视频久久久| 精品123区| 99精品一区二区三区的区别| 激情综合五月天| 黄色一级视频免费| 亚洲精品一区二区三区影院| sm性调教片在线观看| 裸模一区二区三区免费| 视频一区二区三区在线| 911国产在线| 精品国产乱码久久久久久蜜臀| 麻豆视频在线看| 神马影院我不卡午夜| 国模少妇一区二区三区| 国产在线视频二区| 亚洲精品一区二区三区不| 成人免费黄色| 国产精品一色哟哟| 久久麻豆一区二区| 91久久精品无码一区二区| 色综合久久中文字幕综合网小说| 国产精品xxx在线观看| 国产精品亚洲αv天堂无码| 国产精品护士白丝一区av| 草逼视频免费看| 日韩av不卡电影| 亚洲国产老妈| 偷拍女澡堂一区二区三区| 欧美日韩www| 国产精品电影| 一区二区精品视频| 成人的网站免费观看| 中文字幕一二区| 午夜精品在线观看| 日韩在线观看一区 | 欧美黄色一级片视频| 日韩久久一区二区| 午夜av免费在线观看| 成人精品一区二区三区| 亚洲综合三区| 国产一区二区视频在线观看免费| 亚洲成人999| 欧美亚洲福利| 99精品视频在线看| 亚洲精品高清在线观看|