超碰91资源站-超碰97豆花-超碰97人妻-超碰97人人干-超碰97人人香蕉-超碰97天天操-超碰97在线资源站-超碰97资源站共享-超碰97资源站总站-超碰aa在线91-超碰av操-超碰爱爱

半岛外围网上直营

javascript打造跨瀏覽器事件處理機制

轉帖|其它|編輯:郝浩|2010-07-16 09:58:19.000|閱讀 660 次

概述:由于瀏覽器兼容的復雜性.打造一個較優的跨瀏覽器事件處理函數.不是件容易的事情.各大類庫也都通過了種種方案去抽象一個龐大的事件機制.使用類庫可以比較容易的解決兼容性問題.但這背后的機理又是如何呢? 下面我們就一點點鋪開來講.

# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>

  由于瀏覽器兼容的復雜性.打造一個較優的跨瀏覽器事件處理函數.不是件容易的事情.各大類庫也都通過了種種方案去抽象一個龐大的事件機制.

  使用類庫可以比較容易的解決兼容性問題.但這背后的機理又是如何呢? 下面我們就一點點鋪開來講.

  首先,DOM Level2為事件處理定義了兩個函數addEventListener和removeEventListener, 這兩個函數都來自于EventTarget接口. 

  element.addEventListener(eventName, listener, useCapture);
   element.removeEventListener(eventName, listener, useCapture);

  EventTarget接口通常實現自Node或Window接口.也就是所謂的DOM元素.

  那么比如window也就可以通過addEventListener來添加監聽.

  function loadHandler() {
  console.log('the page is loaded!');
  }
   window.addEventListener('load',  loadHandler, false);

  移除監聽通過removeEventListener同樣很容易做到, 只要注意移除的句柄和添加的句柄引用自一個函數就可以了.

  window.removeEventListener('load',  loadHandler, false);

  如果我們活在完美世界.那么估計事件函數就此結束了. 

  但情況并非如此.由于IE獨樹一幟.通過MSDHTML DOM定義了attachEvent和detachEvent兩個函數取代了addEventListener和removeEventListener.

  恰恰函數間又存在著很多的差異性,使整個事件機制變得異常復雜. 

  所以我們要做的事情其實就轉移成了.處理IE瀏覽器和w3c標準之間對于事件處理的差異性.

  在IE下添加監聽和移除監聽可以這樣寫

  function loadHandler() {
  alert('the page is loaded!');
  }
  window.attachEvent('onload',  loadHandler); // 添加監聽
   window.detachEvent('onload',  loadHandler); // 移除監聽

  從表象看來,我們可以看出IE與w3c的兩處差異:

  1. 事件前面多了個"on"前綴. 

  2. 去除了useCapture第三個參數. 

  其實真正的差異遠遠不止這些.等我們后面會繼續分析.那么對于現在這兩處差異我們很容易就可以抽象出一個公用的函數

  function addListener(element, eventName, handler) {
  if (element.addEventListener) {
  element.addEventListener(eventName, handler, false);
  }
  else if (element.attachEvent) {
  element.attachEvent('on' + eventName, handler);
  }
  else {
  element['on' + eventName] = handler;
  }
  }
  function removeListener(element, eventName, handler) {
  if (element.addEventListener) {
  element.removeEventListener(eventName, handler, false);
  }
  else if (element.detachEvent) {
  element.detachEvent('on' + eventName, handler);
  }
  else {
  element['on' + eventName] = null;
  }
  }

  上面函數有兩處需要注意一下就是:

  1. 第一個分支最好先測定w3c標準. 因為IE也漸漸向標準靠近. 第二個分支監測IE.

  2. 第三個分支是留給既不支持(add/remove)EventListener也不支持(attach/detach)Event的瀏覽器. 

  性能優化 

  對于上面的函數我們是運用"運行時"監測的.也就是每次綁定事件都需要進行分支監測.我們可以將其改為"運行前"就確定兼容函數.而不需要每次監測. 

  這樣我們就需要用一個DOM元素提前進行探測. 這里我們選用了document.documentElement. 為什么不用document.body呢? 因為document.documentElement在document沒有ready的時候就已經存在. 而document.body沒ready前是不存在的.

  這樣函數就優化成

  var addListener, removeListener,
  /* test element */
  docEl = document.documentElement;
  // addListener
  if (docEl.addEventListener) {
  /* if `addEventListener` exists on test element, define function to use `addEventListener` */
  addListener = function (element, eventName, handler) {
  element.addEventListener(eventName, handler, false);
  };
  }
  else if (docEl.attachEvent) {
  /* if `attachEvent` exists on test element, define function to use `attachEvent` */
  addListener = function (element, eventName, handler) {
  element.attachEvent('on' + eventName, handler);
  };
  }
  else {
  /* if neither methods exists on test element, define function to fallback strategy */
  addListener = function (element, eventName, handler) {
  element['on' + eventName] = handler;
  };
  }
  // removeListener
  if (docEl.removeEventListener) {
  removeListener = function (element, eventName, handler) {
  element.removeEventListener(eventName, handler, false);
  };
  }
  else if (docEl.detachEvent) {
  removeListener = function (element, eventName, handler) {
  element.detachEvent('on' + eventName, handler);
  };
  }
  else {
  removeListener = function (element, eventName, handler) {
  element['on' + eventName] = null;
  };
  }

  這樣就避免了每次綁定都需要判斷. 

  值得一提的是.上面的代碼其實也是有兩處硬傷. 除了代碼量增多外, 還有一點就是使用了硬性編碼推測.上面代碼我們基本的意思就是斷定.如果document.documentElement具備了add/remove方法.那么element就一定具備(雖然大多數情況如此).但這顯然是不夠安全.

  不安全的檢測 

  下面兩個例子說明.在某些情況下這種檢測不是足夠安全的. 

  // In Internet Explorer
  var xhr = new ActiveXObject('Microsoft.XMLHTTP');
  if (xhr.open) { } // Error

  var element = document.createElement('p');
  if (element.offsetParent) { } // Error

  如: 在IE7下 typeof xhr.open === 'unknown'. 詳細可參考feature-detection

  所以我們提倡的檢測方式是

  var isHostMethod = function (object, methodName) {
  var t = typeof object[methodName];
  return ((t === 'function' || t === 'object') && !!object[methodName]) || t === 'unknown';
  };

  這樣我們上面的優化函數.再次改進成這樣

  var addListener, docEl = document.documentElement; 
  if (isHostMethod(docEl, 'addEventListener')) {
  /* ... */
  }
  else if (isHostMethod(docEl, 'attachEvent')) {
  /* ... */
  }
  else {
  /* ... */
  }

  丟失的this指針 

  this指針的處理.IE與w3c又出現了差異.在w3c下函數的指針是指向綁定該句柄的DOM元素. 而IE下卻總是指向window.

  // IE
  document.body.attachEvent('onclick', function () {
  alert(this === window); // true
  alert(this === document.body); // false
  });
  // W3C
  document.body.addEventListener('onclick', function () {
  alert(this === window); // false
  alert(this === document.body); // true
  });

  這個問題修正起來也不算麻煩

  if (isHostMethod(docEl, 'addEventListener')) {
  /* ... */
  }
  else if (isHostMethod(docEl, 'attachEvent')) {
  addListener = function (element, eventName, handler) {
  element.attachEvent('on' + eventName, function () {
  handler.call(element, window.event);
  });
  };
  }
  else {
  /* ... */
  }

  我們只需要用一個包裝函數.然后在內部將handler用call重新修正指針.其實大伙應該也看出了,這里還偷偷的修正了一個問題就是.IE下 event不是通過第一個函數傳遞,而是遺留在全局.所以我們經常會寫event = event || window.event這樣的代碼. 這里也一并做了修正. 

  修正了這幾個主要的問題.我們這個函數看起來似乎健壯了很多.我們可以暫停一下做下簡單的測試, 測試三點

  1. 各瀏覽器兼容                

     2. this指針指向兼容                

     3. event參數傳遞兼容. 

  點擊測試文本

  測試代碼如下:

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  <html xmlns="//www.w3.org/1999/xhtml">
  <head>
  <title> Event Test UseCase </title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
  <div id="odiv" style="width:200px;height:100px;background-color:red; text-align:center">測試文本</div>
  </body>
  <script>
  var isHostMethod = function (object, methodName) {
  var t = typeof object[methodName];
  return ((t === 'function' || t === 'object') && !!object[methodName]) || t === 'unknown';
  };
  var addListener, removeListener,
  /* test element */
  docEl = document.documentElement;
  if (isHostMethod(docEl, 'addEventListener')) {
  addListener = function (element, eventName, handler) {
  element.addEventListener(eventName, handler, false);
  };
  }
  else if (isHostMethod(docEl, 'attachEvent')) {
  addListener = function (element, eventName, handler) {
  element.attachEvent('on' + eventName, function () {
  handler.call(element, window.event);
  });
  };
  }
  else {
  addListener = function (element, eventName, handler) {
  element['on' + eventName] = handler;
  };
  }
  if (isHostMethod(docEl, 'removeEventListener')) {
  removeListener = function (element, eventName, handler) {
  element.removeEventListener(eventName, handler, false);
  };
  }
  else if (isHostMethod(docEl, 'detachEvent')) {
  removeListener = function (element, eventName, handler) {
  element.detachEvent('on' + eventName, handler);
  };
  }
  else {
  removeListener = function (element, eventName, handler) {
  element['on' + eventName] = null;
  };
  }

  // Test UseCase
  var o = document.getElementById('odiv');
  addListener(o, 'click', function(event) {
  this.style.backgroundColor = 'blue';
  alert((event.target || event.srcElement).innerHTML);
  });
  </script>
  </html>

  我們只需這樣調用方法:

  addListener(o, 'click', function(event) {
  this.style.backgroundColor = 'blue';
  alert((event.target || event.srcElement).innerHTML);
  });

  可見'click' , this, event 都做到了瀏覽器一致性. 這樣是不是我們就萬事大吉了?

  其實這只是萬里長征的第一步.由于IE瀏覽器下和諧的內存泄露,使我們的事件機制要考慮的比上面復雜的多.

  看下我們上面的一處修正this指針的代碼

  element.attachEvent('on' + eventName, function () {
  handler.call(element, window.event);
  });

   element --> handler --> element 很容易的形成了個循環引用. 在IE下就內存泄露了.

  解除循環引用 

  解決內存泄露的方法就是切斷循環引用. 也就是將handler --> element這段引用給切斷. 很容易想到的方法,也是至今還有很多類庫在使用的方法.就是在window窗體unload的時候將所有handler指向null .

  基本代碼如下

  function wrapHandler(element, handler) {
  return function (e) {
  return handler.call(element, e || window.event);
  };
  }

  function createListener(element, eventName, handler) {
  return {
  element: element,
  eventName: eventName,
  handler: wrapHandler(element, handler)
  };
  }

  function cleanupListeners() {
  for (var i = listenersToCleanup.length; i--; ) {
  var listener = listenersToCleanup[i];
  litener.element.detachEvent(listener.eventName, listener.handler);
  listenersToCleanup[i] = null;
  }
  window.detachEvent('onunload', cleanupListeners);
  }

  var listenersToCleanup = [ ];

  if (isHostMethod(docEl, 'addEventListener')) {
  /* ... */
  }
  else if (isHostMethod(docEl, 'attachEvent')) {
  addListener = function (element, eventName, handler) {
  var listener = createListener(element, eventName, handler);
  element.attachEvent('on' + eventName, listener.handler);
  listenersToCleanup.push(listener);
  };
  window.attachEvent('onunload', cleanupListeners);
  }
  else {
  /* ... */
  }

  也就是將listener用數組保存起來.在window.unload的時候循環一次全部指向為null.從此切斷引用. 

  這看起來是個很不錯的方法.很好的解決了內存泄露問題.

  避免內存泄露 

  在我們剛剛要松口氣的時候.又一個令人咂舌的事情發生了.bfcache這個被大多主流瀏覽器實現的頁面緩存機制.介紹上赫然寫了幾條會導致緩存失效的幾個條款

  the page uses an unload or beforeunload handler

  the page sets "cache-control: no-store"

  the page sets "cache-control: no-cache" and the site is HTTPS.

  the page is not completely loaded when the user navigates away from it

  the top-level page contains frames that are not cacheable

  the page is in a frame and the user loads a new page within that frame (in this case, when the user navigates away from the page, the content that was last loaded into the frames is what is cached)

  第一條就是說我們偉大的unload會殺掉頁面緩存.頁面緩存的作用就是.我們每次點前進后退按鈕都會從緩存讀取而不需每次都去請求服務器.這樣一來就矛盾了...

  我們既想要頁面緩存.但又得切斷內存泄露的循環引用.但卻又不能使用unload事件...

  最后只能使用終極方案.就是禁止循環引用 

  這個方案仔細介紹起來也很麻煩.但如果見過DE大神最早的事件函數.應該理解起來就不難了. 總結起來需要做以下工作.

  1. 為每個element指定一個唯一的uniqueID.

  2. 用一個獨立的函數來創建監聽. 但這個函數不直接引用element, 避免循環引用.

  3. 創建的監聽與獨立的uid和eventName相結合

  4. 通過attachEvent去觸發包裝的事件句柄.

  經過上面的一系列分析.我們得到了最終的這個相對最完美的事件函數

  (function(global) {
  // 判斷是否具有宿主屬性
  function areHostMethods(object) {
  var methodNames = Array.prototype.slice.call(arguments, 1),
  t, i, len = methodNames.length;
  for (i = 0; i < len; i++) {
  t = typeof object[methodNames[i]];
  if (!(/^(?:function|object|unknown)$/).test(t)) return false; 
  }
  return true;
  }
  // 獲取唯一ID
  var getUniqueId = (function() {
  if (typeof document.documentElement.uniqueID !== 'undefined') {
  return function(element) {
  return element.uniqueID;
  };
  } 
  var uid = 0;
  return function(element) {
  return element.__uniqueID || (element.__uniqueID = 'uniqueID__' + uid++);
  };
  })();
  // 獲取/設置元素標志
  var getElement, setElement;
  (function() {
  var elements = {};
  getElement = function(uid) {
  return elements[uid];
  };
  setElement = function(uid, element) {
  elements[uid] = element;
  };
  })();
  // 獨立創建監聽
  function createListener(uid, handler) {
  return {
  handler: handler,
  wrappedHandler: createWrappedHandler(uid, handler)
  };
  }
  // 事件句柄包裝函數
  function createWrappedHandler(uid, handler) {
  return function(e) {
  handler.call(getElement(uid), e || window.event);
  };
  }
  // 分發事件
  function createDispatcher(uid, eventName) {
  return function(e) {
  if (handlers[uid] && handlers[uid][eventName]) {
  var handlersForEvent = handlers[uid][eventName];
  for (var i = 0, len = handlersForEvent.length; i < len; i++) {
  handlersForEvent[i].call(this, e || window.event);
  }
  } 
  }
  }
  // 主函數體
  var addListener, removeListener,
  shouldUseAddListenerRemoveListener = (
  areHostMethods(document.documentElement, 'addEventListener', 'removeEventListener') &&
  areHostMethods(window, 'addEventListener', 'removeEventListener')),
  shouldUseAttachEventDetachEvent = (
  areHostMethods(document.documentElement, 'attachEvent', 'detachEvent') &&
  areHostMethods(window, 'attachEvent', 'detachEvent')),
  // IE branch
  listeners = {},
  // DOM L0 branch
  handlers = {};

  if (shouldUseAddListenerRemoveListener) {
  addListener = function(element, eventName, handler) {
  element.addEventListener(eventName, handler, false);
  };
  removeListener = function(element, eventName, handler) {
  element.removeEventListener(eventName, handler, false);
  };
  } 
  else if (shouldUseAttachEventDetachEvent) {
  addListener = function(element, eventName, handler) {
  var uid = getUniqueId(element);
  setElement(uid, element);
  if (!listeners[uid]) {
  listeners[uid] = {};
  } 
  if (!listeners[uid][eventName]) {
  listeners[uid][eventName] = [];
  } 
  var listener = createListener(uid, handler);
  listeners[uid][eventName].push(listener);
  element.attachEvent('on' + eventName, listener.wrappedHandler);
  };
  removeListener = function(element, eventName, handler) {
  var uid = getUniqueId(element), listener;
  if (listeners[uid] && listeners[uid][eventName]) {
  for (var i = 0, len = listeners[uid][eventName].length; i < len; i++) {
  listener = listeners[uid][eventName][i];
  if (listener && listener.handler === handler) {
  element.detachEvent('on' + eventName, listener.wrappedHandler);
  listeners[uid][eventName][i] = null;
  } 
  }
  } 
  };
  }
  else {
  addListener = function(element, eventName, handler) {
  var uid = getUniqueId(element);
  if (!handlers[uid]) {
  handlers[uid] = {}; 
  } 
  if (!handlers[uid][eventName]) {
  handlers[uid][eventName] = [];
  var existingHandler = element['on' + eventName];
  if (existingHandler) {
  handlers[uid][eventName].push(existingHandler);
  }
  element['on' + eventName] = createDispatcher(uid, eventName);
  } 
  handlers[uid][eventName].push(handler);
  };
  removeListener = function(element, eventName, handler) {
  var uid = getUniqueId(element);
  if (handlers[uid] && handlers[uid][eventName]) {
  var handlersForEvent = handlers[uid][eventName];
  for (var i = 0, len = handlersForEvent.length; i < len; i++) {
  if (handlersForEvent[i] === handler){
  handlersForEvent.splice(i, 1);
  } 
  }
  } 
  };
  }
  global.addListener = addListener;
  global.removeListener = removeListener;
  })(this); 

  至此.我們的整個事件函數算是發展到了比較完美的地步.但總歸還是有我們沒照顧到的地方.只能驚嘆IE和w3c對于事件的處理相差太大了.

  遺漏的細節 

  盡管我們洋洋灑灑的上百行代碼修正了一個兼容的事件機制.但仍然有需要完善的地方.

  1. 由于MSHTML DOM不支持事件機制不支持捕獲階段.所以第三個參數就讓他缺失去吧.

  2. 事件句柄觸發順序.大多數瀏覽器都是FIFO(先進先出).而IE偏偏就要來個LIFO(后進先出).其實DOM3草案已經說明了specifies the order as FIFO.


標簽:

本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@ke049m.cn

文章轉載自:網絡轉載

為你推薦

  • 推薦視頻
  • 推薦活動
  • 推薦產品
  • 推薦文章
  • 慧都慧問
掃碼咨詢


添加微信 立即咨詢

電話咨詢

客服熱線
023-68661681

TOP
利記足球官網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 真人boyu·博魚滾球網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 最大網上PM娛樂城盤口(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 正規雷火競技官方買球(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 雷火競技權威十大網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) boyu·博魚信譽足球官網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 權威188BET足球網(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 正規188BET足球大全(官方)網站/網頁版登錄入口/手機版登錄入口-最新版(已更新) 国产拍偷自偷在线精品 | 2025国产在线 | 18禁动漫美女禁处被爆桶出水 | 精品国产999久久久免费 | 韩国日本免费高清观看 | 国产精品熟女乱 | av人妻精品 | 国产色妞妞在线视频免费播放 | 高清a无码在线观看 | 国产亚洲日韩网曝欧美精品 | 国产毛片久久久久久国产毛片 | 成人免费的性色视频 | 国产午夜激情视频免费 | 国产精品制服丝袜清纯唯美 | 国产高清福利91成人 | 国产成人久久精品一区二区三区 | 国产不卡理论片在线观看 | 91亚洲自偷观看高清 | 2025国产麻豆剧果冻传媒免费 | 东京热无码中文字幕av专区 | 99久久精品美女高潮喷水 | 91精品无码国产在线观看一区 | 18禁黄网站禁片免费观看 | 国产在线精品国自产拍影院 | 2025最新亚洲中文字幕在线 | av在线播放黄片 | 精品无人区乱码一区2区3区 | 国产精品一区二区99久久精品 | 国产精品丝袜在线观看 | 国产成人久久av一区二区 | 国产精品福利在线观电影看 | 国产一区国产二区国产三区国产欧美 | 精品三级亚洲免费 | 国产成人亚洲欧美综合 | 国产一区二区三区视频 | 国产三香港三韩国三级 | 丰满人妻一区二区三区视频 | 99精品国产色综合久久不卡 | 国产成人精选在线观看不卡 | 国产激情视频一区二区三区 | 高潮喷水波多野结衣在线观看 | 国产精品女同一区二区免费站 | 国产一区二区精品久久不卡 | 成人国内免费精品视频在线观看 | 911午夜福利精品 | 国产+欧美日韩+一区二区三区 | 国产午夜免费视频片夜色 | 国产情趣一区二区三区 | 国产精品毛片高清在线完整版 | 成人午夜看片 | 国产av无码精 | 国产午夜理论线观看 | 国产美女精品久久久久中文 | 国产女人喷潮免费视频 | 高清无码午夜福利视频 | 国产一区二区av在线播放 | 国产精品系列一区二区三区 | 国产二区三区毛片 | 国产偷伦视频中文精品免费 | av中文字幕精品一区二区久久久 | 精品国产午夜免费看福利 | 国产在线观看一区二区三区 | 加勒比综合精品视频在线 | av免费 | 国产末成年毛片aⅴ在线 | 91精品福利自产拍在线观看 | 国产精品伦 | 国产精品原创av片国产日韩 | 国产成人亚洲精品无码 | 国产超碰人人爽人人做 | 成人69视频在线观看免费 | 国产成人久久精品一区二区三区 | 国产精品无码素人福利免费 | 2025最新手机在线 | 国产桃色精品无码视频 | 高清日韩精品一区二区三区 | 国产一区二区av | 国产一区二区三区色婬影院 | 国产精品丝袜在线 | 国产精品欧美91成人在线 | 国产一级性爱高清视频 | 91在线国产一区二区 | 2025国内精品久久久久精品k8 | 国产区第一页 | 国产在在线免费观看 | 97午夜国产亚洲精品 | 91精品国产麻豆国产在线 | 99久久九九社区精品 | 国产精品免费观看在线观看 | 高清日韩精品一区二区三区 | 国产二级一片内射视频插放 | 国产白嫩美女 | 国产成人精品麻豆免费网站 | 国产精品无码翘臀在线观看 | 国产美女久久精品香蕉欧美 | 国自产拍视频在线网站 | 精品国产片自在线拍免费看 | 国产成人精品无码区电影 | 国产激情久久久久成人影院 | 91在线亚洲精品专区 | 国产精品丝袜综合区丝袜 | 精品一区二区三区高清免费观看 | 2025麻豆福利午夜久久 | 丰满多毛的大隂户毛茸茸 | 丰满大乳奶水在线播放 | 国产成人涩涩涩视频在线观看 | 国产一区二区三区精品在线观看 | 国产a一级无码毛片一区二区三区 | 韩国三级日本三级在线观看 | 国产成人av在线免播放观看新 | 91亚洲精华国产精华精华液 | 国产午夜福利在线 | 成人在线看片 | 国产一区二区三区影视 | 国产在线一二三精品观看 | 91精品国产高清久久久久久9 | 国产精品福利网站导航伊人网 | 国产麻豆一精品一av一免费 | 国产午夜精品一区二区三区极品 | 国99精品无码一区二区三区 | 国产盗摄一区二区欧美精品 | 国产精品白丝av | 精品无码人妻被多人侵犯av | 国产依人在线观看视频 | 变态sm天堂无码专区 | 国产真实露脸多p视频播放 国产真实露脸精彩对白91 | 91高清国产 | 国产最爽的乱婬视频国语对白 | 国产精品一区第二页尤自在拍 | 99久久精品一区二区 | 国产成在线观看免费视频成本人 | 国产福利私拍在线播放 | 朝桐光亚洲专区在线中文字幕 | 国产精品国三级国产av视色 | 国产精品视频大陆免费播放 | 精品国产一区二区三区2025 | 99亚洲中文字幕精品一区二区 | 国产精品福利成人午夜精品视频 | av片在线观看免费 | 精品久久无码人妻影院 | 97人妻超级碰碰碰 | 国产精品白丝久久av情趣网站 | 国产一区二区三精品久久久无广告 | 国产日韩美国成人 | 国产午夜精品理论片小yo奈 | 韩国午夜理论a三级在线观看 | 国产综合精品女同 | 国产免费无码网站在线观看 | 国产99久久久欧美黑人 | 激情婬乱a片无码一二三区下 | 国产精品另类 | 国产一区精品视频区 | 精品日韩亚洲欧美高清a | 91精品国产免费久久久久久 | 国产精品国语 | 国产精品乱码一 | 国产精品区一区第一页 | 国产成人毛片一区二区 | 国产精品无码高 | 国产毛片在线看线看 | 国产视频一区二区在线播放观看 | 99久久精品国产免费男女 | 国产精品午夜在线 | 国产成人一区二区三区影院动漫 | 丰满少妇爆乳无码专区 | 国产精品三级在线观看 | 国产亚洲欧美日韩亚洲中文 | 大尺码无码小黄片在线免费观看 | 国产亚洲欧美精品久久久 | 国产免费人成视频 | 国产精彩对白在线91 | 国产精品嫩草影院一二三区 | 国产91精品对白露脸 | 国产在线拍揄自揄视精品性色av | 国产精品国一 | 国产精品乱码久久久 | 国产v亚洲v天堂无码流 | 精品国产a毛片久久久av蜜桃 | 国产欧美熟妇另类久久久 | 国产观看精品一区二区三区 | 91麻豆精品国产专区在线观看 | 国产亚洲日韩欧美一区 | 国产激情视频在线观看免费播放 | 国产真人无码作爱视频网站 | 国产精品天干天干在线观看澳门 | 国产精品一区二区免费影院 | 国产a级片免费观看 | 国产精品制服丝袜清纯唯美 | 国产午夜福利免费不卡在线观看 | 国产精品黄色大 | 成人欧美日韩高清不卡 | 国产午夜精品一区二区不卡 | 国产女人十八毛片a级毛片 国产女人视频一区二区 | 国产成人咱精品视频免费网站 | 国产黄色网站免费 | 国产精品国产精品国产专区不卡 | 国产色又爽视频免费播放 | 国产精品二区在线观看 | 成人免费一区二区三区视频 | 国产爆乳美女娇喘呻吟 | 91久久综合精品国产丝袜长腿 | 国产日韩久久久精品影院首页 | 国产91丝袜在线播放动漫蜜月 | 国产高清在线精品一区二区 | 国产成人av在线线奂播 | a片人人澡c片人人人妻蜜臀 | 国产精品无码电影在线观看 | 国产野外强奷系列在线播放 | 国产一区二区在线播放 | 国产三级精品三级在线播放 | 99久久人人爽亚洲 | av网站在线观看 | 国产成人免费永久播放视频平台 | 国产高潮 | 91精品丝袜国产在线一区 | 国产黑色丝袜在线看片不卡顿 | 国产一本到高清视频在 | 国产成人精品系列在线观看 | 国产精品福利网站导航 | 国产一区二区三区免费在线视频 | 国产三级片在线91 | 国产aⅴ激情无码久久久无码 | 91人妻一区二区三区久久 | 国产成人无码a区在线观看视 | 国产成人福利美女观看视频 | 97人妻精品全国免费视频 | 99久久精品免费观看区一 | 国产做a爰片久久毛片a片白丝 | 国产精品日韩av在线播放 | 国产做a爱免费视频在线观看 | 国产成人无码精品久久二区三区 | 国产无码成本人电影 | 国产成人免费视频在线网站 | 国产熟女一区 | 国精品人妻无码一区二 | 国产精品猎奇另类视频 | 精品无码免费视频 | 东京热一区二区三区 | 国产一区内射最近更新 | 国产精品日韩精品久久密挑 | 国产精品白浆流出在线观看 | 国产精品一区二区av | 97色综合亚洲影院 | 69国产成人精品午夜福中文 | 国产真实露脸在线观看 | 国产精品自拍欧美日韩 | 91久久国产成人免费观看资源 | 国产精品亚洲无码在线 | 2025日本三级理论影院 | 精品日韩欧美一区传媒精品网站 | 精品国产免费人成在线观看 | 爆乳熟妇一区二区三区爆乳视 | 国产成人一区二区三区在线 | 国产91热爆ts人妖在线 | 国产成人精品视频免费网站 | 国产麻豆误入av拍摄现场 | av无码中文一区二区三区四区 | 国产精品国三级国产aⅴ | 成人精品无码片区在线观看 | 99久久精品亚洲国产 | 丰满饥渴老女 | av中文字幕综合 | 韩国久久三级电影 | 91亚洲自偷在线观看 | 国产成人丝袜视频在线观看 | 国产午夜影视大全免费观看 | 国产91免费在线观看 | 高清偷自拍亚洲精品三区 | 国产黃片在线观看 | 91网站永久免费看nba视频 | 国产成人四虎在线观看 | 国产精品视频一区二区三区不 | 精品国产91av自在自线麻豆 | 国产精品香蕉在线 | 国产成人无码精品一区不卡 | 国产对白精品刺激一区二区 | 国产成人精品女 | 国产精品无码麻豆放荡av | 国产交换配乱婬视频 | 91国自产精品一区二区三区 | 成人无码免费午夜福利在线看片 | 国产美女视频免费观看的网站 | 18禁美女黄网站色大片免费看下 | 国产精品99无码一区二区 | 国产无码影视 | 成人区人妻精品一区二区不卡 | 国产aⅴ无码精品一品二区 国产aⅴ无码精品一区二区 | 国产福利一区二区三区视频在线 | 国产欧美视频一区二区三区 | 动漫精品专区一区二区三区不 | 精品久久久无码中文字幕av | 国产精品冒白 | 国产激情一区二区三区app | 超大乳首授乳一区二区 | 91在线国产手机在线 | 高清日韩精品一区二区三区 | 国产成人精品免费视频软件 | 精品日韩国产欧美在线观看 | 国产成人午夜无码电影在线观看 | 国产办公室无码视频在线观看 | 国产一级毛片视频 | 91亚洲欧美一区二区三区 | 国产一区二区精品高清 | 国产一区二三区精华视频 | 国产av国片精品一区二区 | 国产户外一区二区三区在线 | 国产精品一级av在线播放 | 国产三级片久久久久久水户香奈 | 国产欧美精品一区二区三区四区 | 国产精品秘麻豆果冻传媒在线 | 国产精品v毛片免费视频 | 丰满肥臀大屁股熟妇激情视频 | 国产一区二区三区内射 | 国产三级一区二区三区 | av在线亚洲男 | 国产精品伦 | 国产囗交口爆吞精在线视频 | 国产午夜亚洲精品理论片不卡 | 国产亚洲中文久久网久久综合 | 国产成人18黄网站在线观看软件 | 成人拍拍拍免费视频网站 | 成人在线观看影院 | 国产精品午夜寂寞视频 | 国产三级av在线播放 | 国产桃色无码视频在线观看 | 国产91丝袜在线播放九色 | 国产国语精彩对白在线观看 | 成在人av抽搐高潮喷水流白浆 | 丰满的少妇 | 国产高清精品入口91 | 国产精品专区在线免费观看 | 国产成人精品久久免费 | 91精品在线播放 | 国产亚洲欧美看国产 | 国产精品秘一区二区三区高潮 | 国产成人毛片精品不卡在线 | 国产尤物福利在线不卡 | 国产精品白浆无码流出在线观看 | 99久久国产综合导航电影 | 91免费无码视频 | 国产精品麻豆视频 | 精品成人免费一区二区不卡 | 国产三香港三韩国三级 | 超薄肉色丝袜一区二区 | 国产美女久久久久久久久久久 | 韩国福利影视一区二区三区 | 国产麻豆精品入口在线观看 | 精品国产午夜理论片不卡 | 国产视频一区欧美二区日本三区动 | av无码久久久久不卡网站毛 | 风韵丰满熟妇啪啪区老熟 | 国产精品偷伦免费视频 | 海角社区视频免费高清点播 | 国产成人av一区二区三区无码 | 成年人樱桃app下载安装 | 国产日韩欧美一区二区东京热 | 2025最新国产自产精品 | 精品亚洲v乱码一区二区 | 精品亚洲日韩国产成人av在线 | 国产美女爽到喷水视频 | 国产一区二区三区精品网站 | 国产黄色视频在线观看免费 | 国产盗摄91精品一区二区三区 | 国产欧美精品综合日韩 | 国产欧美久久精品不戴乳罩 | 国产精品亚洲国产三区 | 国产午夜不卡av高清 | 国产人妻精品区一区二区三区 | 91欧美| 国产精品一区在线观看你懂的 | 精品精品国产三级a∨在线 精品精品国产自在97香蕉 | 国产欧美一二三区男女交配 | 国产成人精品无码青草 | 国产成人精品一区二区不卡 | 精品无人区乱码一区二区三区手机 | 91精品久久久久久人妻无码 | 国产尤物无码一区二区 | 国产欧美日韩亚洲精品区 | 18精品久久久无码午夜福利 | 国产偷窥真人视频在线观看 | 国产主播资源在线播放 | 国产对白精品刺激一区二区 | 国产精品视频一区日韩丝袜 | 91免费电影 | 风流老熟女一区二区三区l 风流少妇按摩来高潮 | 精品高清免费网站 | 东京热亚洲精品中文一区 | 99久久九九爱精品69堂 | 国产三级农村妇女在线看系列 | 国产孕妇故爱级高清片免费看 | 国产精品高清系列在线观看 | 国产高清精品一区二区三区 | 国产一区二区三区精品99久久 | 精品日本一区二区三区在 | 国产欧美日韩a片免费软件 国产欧美日韩va另类 | 东京热加勒比 | 高清无码午夜福利在线观看 | 99精品亚洲一区二区三区 | 91夜色精品国产 | 成人精品福利 | 成人精品毛片免费视频 | 成人毛片视频在线观看免费 | 国产91高潮流白浆在线播放un | 国产精品二区在线 | 黑人巨茎美女高潮视频 | 国产欧美视频在线 | 国产福利电影在线观看 | 东京热一区二区沙河无 | 成人区免费aⅴ片在线观看 成人区人妻 | 国产一区二区三区乱码 | h无码精品动漫在线观看 | 国产成人免费高 | 2025自拍偷区亚洲综合第一页 | 国产精品三级a三级三级午夜 | 国产一区二区精品尤物 | 国产精品户外野外 | 精品国产福利尤物 | 国产精品无码无卡在线观看 | 国自产精品手机在线视拍 | 国产精品成人69xxx免费视频 | 91狠狠色综合久久久夜色撩人 | 国产精品视频无码一区二区三区 | 91麻豆精品一区二区 | 国产91免费在线观看 | 国产97精品一区二区三区四区 | 国产亚洲精久久久久久无码浪潮 | 福利视频一区 | 国产精品一区二区三区不卡视频 | 国产精品一区二区三区免费 | 岛国一区二区三区 | 国产高清精品自拍av | 国产精品特级露脸 | av中文字幕专区 | 国产三级电影 | 成人无码专区免费 | 国产美女作爱全过程免费视频 | 丰满的人妻hd高清日本 | 91精品久久久久久久99蜜桃 | 国产综合精品九九久久一区二区 | 国产麻无矿码直接观看 | 国产精品丝袜无码不卡视频 | 国产3p一区二区三区视频在线 | 国产亚洲欧美在线观看的 | 国产激情一区二区三区四区 | 国产在线观看精品一区二区三 | 国产福利95精品一区二区三区 | 丰满人妻一区二区三区 | 国产一级aa黄毛片 | 激情欧美日韩一区二区 | 精品丝袜国产自在在线 | av收藏夹 | 国产91对白在线 | 69式国产真人免费现视频 | 成年无码av动漫全部免费 | 国产一区视频在线观看 | 2025亚洲天堂无码视屏手机版 | 91在线软件 | 99国产精品欧美一区二区三区 | 国产精品伦一区二区三级视频 | 国产成人精品一区二区三区 | 精品亚洲国产成人av在线 | 精品国产一区二区三区蜜桃 | 国语对白精品一区二区在线观看 | 国产一区二区三区视频 | 国产在线原创剧情麻豆 | 成人午夜爽a片免费视频 | 国产91精品高跟丝袜在线 | 91精品久久久久一区二区三区 | a级毛片在线免费观看 | 国产美女下面流白浆视频 | av中文字幕音影先锋天堂 | 精品久久无码中文字幕一区 | 国产成人精品一二 | 国产高清在线免费观看 | 国产成人免费在线观看av | 不卡国产手机版毛片 | 二区三区高清电影 | 国产亚洲欧美日本韩国黄色 | 99精品在线| 国产毛片健身在线 | av无码天堂一区二区三区 | 国产精品一区在线麻 | 国产成人av区一区二区三 | 国产在线永久视频 | 精品人妻无码一区二区三区丝袜 | 国产放荡av剧情演绎麻豆 | 精品黑人一区二 | 国产成人亚洲精品影院 | 99久re热视频| 国产精品无码影视久久久久久久 | 国产偷窥盗摄一区二区 | 精品国产一区二区三区久久影院 | 91大神精品长腿在线 | 国产视频在线一区二区三区 | 精品人妻一区二区三区曰产乱码 | 国产精品福利免费 | 99久久伊人精品综合观看 | 91麻豆69天堂 | 国产精品另类激情久久久免费 | 国产一区在线看黄 | 国产精品午夜福利2025久久 | 国产萌白酱喷水视频在线播放 | 国产成人精品一区二三区在线观看 | 国产疯狂女同互磨高潮在线看 | 国产在线观看午夜电影视频网站 | 大尺度无遮挡激烈床震网站 | 精品视频在线观自拍自拍 | 国产精品无码av不卡 | 国产成人无码av一区二区 | 国产成人永久在线播放 | 国产av无码专区影视 | 国产精品午夜福利1000集 | 精品无码国产不卡在线观看首 | 国产精品国产三级久久久久电影 | 不卡色老大久久综合网 | 国产呦精品一区二区三区下载 | 国产在线无码一区二区三区 | 成人综合网站 | 国产成人精品自拍 | 成人午夜a级毛片免费 | 国产成人91亚洲精品无码 | 18禁无遮挡羞羞啪啪免费网站 | 国产高清在线看av片 | 国产91av在线播放 | 国产色精品久久人妻无码看片软件 | 国产日韩亚洲欧美综合另类 | 国产毛片精品高清一区二区 | 91蜜芽尤物福利在线观看 | 国产大学生无码视频在线观看 | 丰满熟女少妇午夜福利视频 | 国产精品国内免费一区 | 91蜜桃传媒精品久久久一区二 | 国产成人亚洲欧美三区综合。 | 国产精品日韩高清秒播日韩国产欧美 | 91精品久久久久 | 爆乳无码专区 | 成年女人毛片免费视频 | 国产av国片精品一区二区 | 精品丝袜国产自在线拍高清 | av蜜臀| 国产精品一级毛片无码视频 | 99在线精品一区二区三区 | 国产成人精品一区二区三区不卡 | 国产午夜福利在线看 | 丰满人妻销魂娇喘呻吟 | 国产日韩欧美一区精品 | 国产精品爆乳奶水无码视频 | 二区不卡 | 国产一区二区精品丝袜 | a级毛片水真多 | 丰满熟妇乱又伦 | 国产人妻精品午夜福 | 激情亚洲精品中文字幕 | 成人综合亚洲欧美一区h | 国产亚洲视频在线观看网址 | 成人国产三级精品 | 国产精品密播 | 精品国产你懂的在线观看 | 东京热无码国产精 | 国产微拍一区 | 国产av无码精 | 国产熟女一区二区 | 国产av精品一区二区三区视频 | 成人亚洲精品久久久久软件 | 成人无码av片在线观看 | 国产精品无码午夜免费影院 | av无码一区二区三区波多野 | 国产中文字幕玖玖 | 国产精品三级av三级av三级 | 国产成人无码a在线观 | 国产午夜精品电影久久 | av中文无码 | 国产成人亚洲综合一区 | 国产精品系列在线观看 | 18禁无遮拦无码国产在线播放 | 国产麻豆一区二区三区精品视频 | 国产无码av观看 | 国产99er66在线视频 | 国产一区二区免费不卡在线播放 | 国产精品成人一区二区三区视 | 91人妻在线综合 | 国产交换配乱 | 国产成人精选在线不卡 | 精品日韩欧美人妻少妇 | 91在线国产一区二区 | 国产成人女人毛片视频在线 | 国产日韩精品欧美一区喷 | 91精品日韩 | 国产精品女同一区二区久久 | 国产午夜免费一区二区三区 | 国产最火爆久久久久国产一级毛片 | 国产精品无码久久久久成人网站 | 国产成人精品成人a在线观看 | 国产白丝内射 | 91性爱视频在线观看 | 成在线人免费视频一区二区 | 国产三级在线观看中文字幕 | 国产精品理论在线观看 | 国产无套乱子伦精彩是白视频 | 国产av综合精品色区 | 国产精品民宅偷窥盗摄 | 国产成人综合激情视频在线观看 | 国产精品无码无片在线观看3d | 18国产精品白浆在线观看免 | 岛国精品一区二 | 2025国产在线拍揄 | 精品国产肉丝袜久久 | 国产成人精品影视 | 国产超碰āv人人做人人爽 国产超碰女人任你爽 | 国产熟女露脸大叫高潮 | 国产福利一区二区三区 | 国产成人av无码一二三区 | 精品无码无人网站免费视频 | 国产成人午夜精品视频牛牛 | 国产精品va一级二级三级电影 | 成人黄色视频在线播放165 | 91精品国产乱码久 | 国产在线精品无码二区二区 | 国产v欧美ⅴ日韩v在线观看 | 成人亚洲a片v一区二区三区麻豆 | 69国产成人综合久久精品 | 国产精品视频大白屁股冒白浆 | 精品成在人线aⅴ无码免费看 | 国产精品亚欧美一区二区三区 | 国产成人精品一区二区视频 | 国产精品无码久久综合日韩 | 国产精品日韩高清在线蜜芽 | 成人午夜精品无码区久久漫画 | 成熟女人毛片www免费版在线 | 国产午夜福利片国产一级a片 | 国产一区二区视频在线 | 成人午夜大片免费看爽爽爽 | 国产欧美日韩一区二区三区四区 | 国产门事件在线亚洲日韩欧美 | 成人片黄网站a毛片 | 国产v欧美ⅴ日韩v在线观看 | 国产一区二区三区草草影院 | 国产成人精品久久一区二区精品 | 国产自产自拍 | 91一区二区三区在线观看 | 国产精品亚洲色一色 | 国产精品国产三级国v麻豆 国产精品国产三级国产 | 国产交换配乱婬视频 | 国产在线不卡视频免费视频 | 2025最新国产三级在线看 | 18禁黄污吃奶免费看网站 | 国产轮奸精品一区二区三区 | 高清无码国产精品区 | 99精品久久精品一 | 国产av无码不卡 | 成人在线观看免费爱爱 | 国产福利无码一区在线 | 国产盗摄91精品一区二区三区 | 国产无套gv在线观看 | 国产成人8x人网站视频下载 | 高清不卡一区二区三区 | 国产丝袜在线播放 | 国产欧美日韩一区二区刘玥 | 福利一区二区三区在线视频 | 国产尤物在线观看无码不卡 | 91精品国产福利在线观看麻豆 | 欧美一区二区三区四区 | av一区二区三区 | 91久久久久精品无嫩草影院 | 精品国内一区二区三区在线 | 成人综合国内精品久久久久久影院 | 国产在线视频国产永久2025 | 国产一区二区在线观看麻豆 | 91成人视频 | 国产三级精品久久久久久久 | 精品国产一区二区三区吸毒 | 精品欧洲av无码一区二区14 | 国产成人综合一区精品 | 国产精品一区 | 国产重口老太和小伙乱 | 国产三级无码在线观看 | 国产精品免费看 | 91制片国产自产在线观看 | 2025在线精品自 | 国产高清网站 | 国产精品日韩欧美久久综合 | 国产一级片射在线观看 | 国产欧美韩国一区二区在线播放 | 国产91精品看黄网站在线观看 | 国精产品一品二品国精品69xx | 国产经典自拍一区 | 国产精品一区二区三区久久 | 国产精品亚洲av色欲 | 国产熟女一区二区三区十视频 | 国产综合一区二区三区精品 | 国产盗摄一区二 | www日韩中文字幕在线看 | 潮喷好爽在线观 | 18禁无码动漫在线播放 | 成在人线av无码免费看网站 | 国产免费无码一区二区 | 东京热人妻无码一区二区av | 二区本道av特级毛片 | 2025精品久久久久久中文字 | 99精品久久毛片a片 99精品久久毛片a片潘金莲 | 精品九九99久久在免费线 | 国产一区二区免费伦理鲁丝片 | 丰满的女房东 | 精品国产一区二区三区久久久蜜 | 国产成人av性色在线影院 | 成人午夜亚洲精品在线网站 | 99精品久久99久久久久 | 国产欧美日韩综合自拍 | 国产成人a∨麻豆精品 | 国产不卡高清在线观看视频 | 国产精品高清99 | 国产专区校园欧美 | 91久久久久无码国产精品一区99 | 国产成人秘在线观看免费网站 | 成人啪精品视频免费网站 | 国产精品自产在线观看免费 | 精品无码一区二区三区在线 | 国产成人免费高潮激情视频 | 国产精品毛片久久蜜月a√ 国产精品毛片天天看片 | 国产在线精彩视频二区 | av网站在线观看天堂 | 国产女王女调教另类调教在线 | 国产尤物精品视频 | 国产精品无码翘 | 国产欧美日韩中文在线观看不卡 | 国产在线高清在线精品 | 国产在线观看一区二区三区精品 | 国产av无码精品 | 国产剧情麻豆mv | 国产精品无码免费播放在线观看 | 精品视频在线观看一区二区 | 国产精品蜜桃在线观看 | 国产对白在线观看精品 | 国产一区二区在线观看动漫 | 国产成人av免费网址 | 超级乱淫片午夜电影网福利 | 国产艳福片内射视频播放免费 | 国产三级不卡靖品播放 | 成人免费a级 | 国产后入又长又硬 | 国产午夜精品一区二区三区四 | 国产精品日日做人人爱 | 91av视频在线观看 | 精品日韩专区 | 国产在线视频区电影 | 国模精品一区三区 | 国语自产偷拍精品 | 国产一区内射最近更新 | 国产一区麻豆剧传媒果 | 国产高清美女一级a毛片久久 | 成年女人毛片免费视频 | 国产精品国色综合久久 | 97人妻起碰视频免费 | 国产丝袜一区 | 精品人妻av中文字幕乱码 | 国产午夜福利高清小视频合集 | 91无码人妻精品一区二区蜜桃 | 91精品国产高清久久久久久9 | 国产成人免费影院在线 | 成年无码动漫av片在线观看 | 高潮毛片无遮挡高清视频播放 | 成人a级毛片无码免费 | 精品无码无码一级毛片免费 | 成年女人免费视频播放成年m | 成人精品一区二区三区中文 | 精品国产一区二区在线 | av无码午夜福利一区二区三区 | 国产一区二区三区日韩精品欧美 | 2025自拍偷在线 | 国产美女免费视频 | 成人无码a区在线观看视频 成人无码h免费动漫 | 精品亚洲成av人在线观看 | 国产韩国视频一区二区三区 | 国产aⅴ天堂无码一区二区三区 | 国产福利萌白酱在线观看视频 | 国产福利微拍精品一区二区 | 国产高清精品福 | 国产亚洲成av人片在线观黄桃 | 精品无码国产日韩制服丝袜 | 成人无码潮喷在线观看 | 国产真实乱人偷看精品 | 国产果冻豆传媒麻婆电影 | 国产传媒19精品免费1区2 | 99久久婷婷免费国产综合精品 | 99久久人人爽亚洲精品美女 | 国产成人麻豆精品午夜福利在 | 国产成人精选视频在线观看不卡 | 91精品亚洲影视在线观看 | 韩国黄色片免费在线观看 | 国内偷拍三级视频不卡 | 国产在线精品福利91啪 | av午夜久久蜜桃传媒软件 | 国产丝袜视频 | 精品无码自拍视频在 | 国产精品无码av在线播放 | 国产区视频在线 | 国产成人av一区二区三区无码 | 国产高清免费av片在线观看不卡 | 国产精品丝袜久久 |