国产凹凸在线-国产拗女一区二区三区-国产白白视-国产白领-国产白拍-国产白丝jk被疯狂输-国产白丝喷-国产白丝在线

金喜正规买球

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@fc6vip.cn

文章轉載自:網絡轉載

為你推薦

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


添加微信 立即咨詢

電話咨詢

客服熱線
023-68661681

TOP
欧美高清精品一区二区 | 国产精品jizz在线观看美国 | 欧美亚洲午夜成人va在线 | 国产在线激情小视频青青 | 国产精品免费一区二区在线观看 | 日韩欧美国产 | 在线高清mv视 | 一区二区三区国产亚洲网站 | 国产精品186在线观看在线播放 | 欧美日韩大尺码免费专区 | 国亚洲一厂区二厂区三厂区 | 69老司机午夜免费 | 日本免费一级二级三 | 成人一级淫妇视频 | 好男人好资源影视在线 | 日本不卡高清视频v中文字幕 | 亚洲成a人a∨久在线观看 | 免费的精品一区二区三区 | 日本欧美日韩综合精品一区二区 | 国产激情视频在线 | 免费看aⅴ | 国产精品午夜福利免费老师 | 97在线视频观看在线观看视频 | 亚洲欧美中文一区二区三区 | 亚洲国产| h鸡大网在线看 | 亚洲欧美精品福利一区二区 | 精品二区中文字幕播放 | 免费视频精品一区二区三区 | 国产精品专区在线仙踪林 | 99这里只有精品 | 日本国产欧美日韩三区四区 | 国产高清在线视频一区二区三区 | 午夜成人亚洲理伦片在线观看 | 亚洲人成色7777在线观看 | 国产国产人免费视频成 | 国产又猛又黄 | 免费三级在线观看中文字幕 | 乱码午夜 | 国产亚洲日本精品成人专区 | 国产91精品在线播放 | 亚洲自偷自偷精品 | 国产一级特黄大片特爽 | 欧美日韩动漫亚洲 | 国产欧美日韩综合在线一 | 精品一区二区三区视频在线 | 日本公与 | 三级在线国产 | 黄又爽免费网站 | 亚洲国产亚洲片在线观看播放 | 开拓亚洲色偷偷偷综合网的同时 | 精品一区二区成人 | 亚洲国产理论片 | 国产午夜三级在线播放 | 8090成年在线看| 九一人才网| 日国产一区三区三区在线观看 | 亚洲制服丝袜中文字幕自拍 | 国产女主播回放在线观看 | 日本免费在线观看视频 | 97在线观看免费视频观看 | 黑人巨大性欧美一区二区三 | 欧美精品寂寞影院 | 日本乱理伦片在线观看中文字幕 | 国产原创精品国产专区 | 免费国产a国产片高清 | 国产高清一级做a爱在线观看 | 免费1级a做爰片在 | 日韩美色中文娱乐网 | 日韩在线视精品在亚洲 | 国产v片成人影院在线观看 日韩欧美在线播放视频 | 亚洲精品一品区二品区 | 国产精品拍自在线 | 精品国产sm捆绑最大网免费站 | 天堂在线最 | www.亚洲最大夜色伊人 | 秋霞午夜福利影院 | 国产福利91精品一区二区三区 | 国产偷国产偷亚洲高清日 | 亚洲国内精品 | 精品亚洲一区二 | 99欧美| 国产免费中文字幕v在线 | 国产精品小视频网站 | 欧美激情片区一区二区三区 | 国产精品国产自线拍免费 | 国产偷v国产偷v | 欧美a在线看 | 国产日韩精品欧美一区视频 | 国产精品免费一区二区三区四区 | 日本一二区在线观看 | 91视频免费下载 | 国产aⅴ | 成人精品综合免费视频 | 欧美日韩一区 | 免费最新热播韩剧美剧电视剧 | 欧美、另类 | 日韩一卡2 | 日韩亚洲人成网站在线播放 | 国产精品一区二区播放在线 | 陌陌影视在线观看高清完整版 | 国产+欧美日韩+一区二区三区 | 国产精选在线观 | 国产午夜视频在永久在线观看 | 欧美人与动 | 亚洲偷自拍拍综合网 | 日韩中文字幕a | 国产伦精品一区三区视 | 中国凸偷窥xxxx自由视频 | 国产公开免费人成视频 | 成人午夜在线i免费观看 | 国产免费又 | a免费网站 | 中文在线а天堂中文在线新版 | 国产日韩乱码精品一区二区 | 免费高清乱伦欧美 | 日韩欧美亚洲每日更新在线观看 | 小小的日本高清在 | 欧美日韩国产免费一 | 不卡一区二区 | 日韩高清精品在线 | 免费ā片在线观看 | 为您提供国产成 | 国产久9视频这里只有精品 国产福利在线观看91精品性色 | 91精品欧美一区二区综合在线 | 亚洲大片精 | 国产精品综合视频一区二区 | 伊人影院综合 | 亚洲第一网站a√在线观看 日韩亚洲产 | 蜜桃精品一区二区三区在线观看 | 日韩ā片在线观看免费观看 | 91牛牛国产在线无弹窗 | 成人国产一区 | 国产亚洲高清不卡在线观看 | 一区二区三区高清视频国产女人 | 国产精品一区二区尿失禁 | 日韩中文字幕 | 国产探极品在线观看观看 | 99国产清国产精品国产 | 亚洲国产综合精品一区 | 天天综合天天做 | 精品自拍视频在线观看电影 | 在线免费观看成年人视频 | ⅹxx欧美 | 精品国产日韩欧美一区二区 | 人成在线免费视频 | 欧美日韩在线一区二区免费 | 人在线成视频 | 成年人看的视频网站 | 国产精品13页 | 96网友上传国产 | 99热免费精品 | 二区三区欧美精品在线观看 | 欧美国产日韩一区在线视频 | 中文字幕与 | 精品国产免费人成在线观看 | 不卡中文字幕系 | 中文字幕无线码中文字幕网站 | 国色天香天天影院综 | 任你躁在线精品免费视频 | 国产在线视频一区二区三区 | 国产一区日韩一区二区三区 | 亚洲综合色区在线播放 | 国产在线拍揄自揄拍免费下载 | 好看的高清电影大全 | 国产舌乚八伦偷 | 精品国偷自产在线不卡短视 | 成人精品一区二区户外 | 欧美精品三区 | 国产免费三a在线 | 日韩欧美在线第一页 | 国产精品高清视亚洲一区二区 | 中文字幕一区二区三区乱码 | 国产36页在线| 香港三级澳门三级欧洲三级 | 国产酒店视频在线观看 | 国产精品女同一区二区在线 | 亚洲高清专区 | 国产精品亚洲综合网熟女 | 特黄三级| 国产成a人亚| 久热视频在线观看精品 | 国产专区欧美专区在线观看 | 日韩午夜顶级在线观看 | 男女交性永久免费视频播放 | 91热成人精品国产免费 | 中文字幕亚洲欧美在线不卡 | 亚洲第一性网 | 国产在线一区二区三区不卡在线 | 91精品国产白产91精品 | 精品美脚玉足 | 国产区日韩区欧美区 | 国产高清在线视频一区二区三区 | 国产精选免 | 欧美?日韩? | 中文字幕在线看日本大片 | 婷婷六月综合缴情在线小蛇 | 92午夜福利| 国产舌乚 | 日韩一级在线播放 | 91插插插网站 | 国产丰满大乳奶水在线播放 | 亚洲欧美另类在线区 | 美国成人影院 | 精品推荐 | 日本免费一级婬片a级中文字幕 | 国产精品美脚玉足脚交 | 手机午夜福利1000视频 | 了解最新38在线信息 | 成年女人免费永久看片 | 亚洲国产精品资源 | 俺去鲁婷婷六月色综合 | 亚洲有码在线播放 | 性爱网在线免费 | 免费国产在线观看 | 久章草在线视 | 日本一区二区三区www | 玖玖直播| 一级a性色生活片 | 亚洲国产一区在线观看视频 | 国产女人喷潮视频在线观看 | 欧美在线精品国自产拍免费 | 欧美日韩精品一区二区三区视 | 国产欧美va天堂在线观看视频 | 成人免费一区二区三区视频软件 | 亚洲高清成 | 国产精品美女一区二区视频 | 亚州精品永久观看视频 | 日韩精品亚洲精品第一页 | 亚洲精品日韩在线观看高清不卡 | 国产一级在线观看www色 | 精品国产欧美一 | 成人欧美精品资源在线观看 | 成在线人永久免费视频播放 | 高清线视频 | 中文字幕乱码亚洲中文在线 | 成人热色戒 | 欧美日韩亚洲综合一区二三激情 | 99re热视频这里只有精 | 三级在线观看自 | 国产r级在线播放 | 国产日韩欧美二区 | 日韩一区二区三区网址 | 国产99在线视频 | 老司机精品成免费视频 | 天美麻花星空免费观看乡村版 | 国产日韩欧美精品区性色 | 日本一道高清 | 91福利在线观看 | 欧美第一页在线观看 | 中日韩精品视频在线观看 | 999电影网 | 欧美.日韩.日本国产视频 | 亚洲第成年人电影 | 国产精品亚洲无线码在线播放 | 国产亚洲欧美另类一区 | 国产精品v欧美精品∨日韩 色与欲影视天天影视 | 欧美偷拍97色伦综合 | 国产老人一区v二三区 | 国产亚洲自拍一区 | 国精产品一品二品国精品69x | 国产91高清免费 | 1024国产在线在线视频 | 美女一区二区三区 | 日本午夜免费啪视频 | 97韩剧(tv)网 | 亚洲综合成人精品成人精品 | 欧美高清色高清在线观看 | 欧美日韩国产精品二区在线观看 | 香蕉电影 | 欧美a区b区c区视频在线观看 | 日韩免费播放一区二区 | 69视频免费在线观看 | 国产精品自产拍在线观看 | 亚洲中文欧美 | 色猫咪免费人成网站在线观看 | 国产精品专区第一页在线观看 | 日韩一区二区三区免费高清 | 欧美毛多水多肥妇 | 欧美巨大黑人暴力xxxxx黑人 | 日韩在线一区二区三区免费视频 | 国产尤物在线视精品在亚洲 | 日本素人黑人视频 | 国产精品欧美福利久 | 欧美日韩亚洲精品成人 | 国产日产欧产美韩系列 | 又大又硬一进一出做视频 | 亚洲精品综合色区二区 | 精品字幕亚洲一区二区三区 | 免费国产偷人三大片视频 | 羞羞影院午夜男女爽爽视频免费 | 99亚洲自偷自拍图片区 | 国产欧美日韩va另类在线 | 欧美性夜影院亚洲 | 国产伦精品一区二区三区视 | 精新精新国产自在现 | 精品无人乱码一区二区三区 | 国产欧美日韩综合一区在线播放 | 日韩亚洲视频一 | 韩日精品一区二区 | 天天做日日 | 国产一在线精品一 | 欧美a欧美乱码一 | 日本视频网站在线w | 亚洲欧洲日韩综合色天使 | 免费观看性生交大片 | 成人精品午夜在线观看 | 日产乱码二卡三卡四在线 | 99热在线精品 | 国产无内肉丝精品视频 | 66lu国产在线观看 | 最新热播电影 | 99这里有精品视频视频 | 亚洲一区中 | 日韩乱码精品中文字幕不卡 | 综合九九 | 国产又黄又爽胸又大免费视频 | 国产边添边摸边做边爱 | 3751性欧美视频在线播放 | 91秦先生久 | 日韩亚洲成a人片在线观看 亚洲色偷偷综合亚洲v | 国产不卡一区不卡二区不卡三区 | 国产精品一区高清在线观 | 欧美疯狂黑人xxxxbbbb | 精品国产一区二区三区香蕉在线 | 国色天香一卡二卡三卡四卡 | 在线看国产精品 | 日本三级韩国三 | 国产精品激情自拍 | 免费高清电影电视剧 | 日本国产美国日韩欧美mv | 欧美日韩国产免费一 | 91蝌蚪91九色 | 特色大片免费看 | 欧美自拍另类欧美综合图区 | 国产亚洲成?v人在线观看导航 | 亚洲国产97视频在线 | 最新国产在线视频 | 国产欧美日韩精品第一区 | 日韩欧美综合一区二区三区 | 91精品成人福利在线播放 | 日韩亚洲精品影视 | 九九热在线视频 | 国产又黄又猛又粗又爽的 | 亚洲成国产人片在线观看 | 日韩国产乱码一区中文字幕 | 91导航在线国产无弹窗 | 制服丝袜亚洲中文综合 | 日韩电影院| 国产欧美日韩综合视频专区 | 日韩不卡视频在线观看 | 国产盗撮视频在线观看 | 国产精品萌白酱永久在线观看 | 国产精品一区二区亚瑟不卡 | 精品性影院一区二区三 | 欧美日韩大片在线观看 | 日韩欧美精品在线观看视 | 亚洲日本欧美综合在线一 | 手机免费看一级 | 日韩高清在线第一页 | 日韩vr欧美vr性视频 | 国产凸凹视频一 | 热门电视剧免费在线观看 | 欧美性受xxxx白人 | 日韩免费精品一区二区三区 | 天堂影视 | 激情小说亚洲图片伦 | 97午夜理论片在线影院 | 91免费伊人 | 亚洲中文字幕在线观看 | 精品一区二区三区盗摄 | 男女午夜猛烈啪啦啦视频 | 日韩女同性恋一区二区三区 | 中文字幕日韩wm二在线看 | 国产精品狼人 | 亚洲日韩在线中文字幕第一页 | 日韩精品在线不卡一区二区 | 免费高清一二三区日本 | 国产精品人妖 | 欧美一区精品视频一区二区 | 国产真人做爰免费视频 | 黄+片在线免费观看+精品+巨 | 又大又硬又爽免费视频 | 国产在线视频不卡 | 国产白领| 不卡精品| 俺去鲁婷婷六月色综合 | 天美麻花 | 天天a3极品a3私服 | 日韩二区在线 | 国产欧美在线 | 国产普通话对白在线观看视频 | 亚洲天堂不卡 | 日韩欧美一级精品 | 国产普通话漏脸在线观看 | 精品午夜福利1000在线观看 | 日本一区中 | 国产传媒在线观看视频免费观看 | 日国产一区三区三区在线观看 | 97国语精品自产拍在线观看茸 | 精品国产免费人成网站 | 免费一看一级 | 老司机午夜视频十八福利 | 精品丝袜国产自在线拍a∨婷婷 | 污污污视频在线免费观看 | 日本xxxwww在线观看 | 国产男女高清视频m免费 | 最近的中文字幕 | 亚洲日本ⅴa中文字幕 | 中文版精| 欧美日韩中文综合第一页 | 国产不卡免费视频 | 日韩一级一区二区不 | 韩国伦理电影网站 | 日本一区二区三区在线观看入口 | 国产精品午夜福利免费老师 | 日韩一卡二卡在线观看 | 国产l精品国产亚洲区 | 日韩精品一区91 | 国产一级a爱做片免费看 | 女人脱精光一清二楚图片 | 精品动漫福利h视频在线观看 | 91污在线观| 欧美亚洲综合一区 | 中文字幕乱 | 国产黑色丝袜美女在线观看婷 | 国产一区二区精品在线观看 | 日本乱熟 | 国产一级自拍亚洲精品在线看 | 日产综合欧美一区二区 | 成人免费观看视频 | 秋霞影院伦理在线看 | 欧美日本乱伦 | 成年免费大片黄在线观看欲女 | 国产jjizz女 黄频国产免费观看 | 最爽的乱淫视频国语对 | 欧美激情中文字幕综合一区 | 在线视频一区二区三区三区不卡 | 日本高清特黄刺激大片 | 国产午夜成福利在线观看 | 视频播放 | 国产另类ts人妖一区二区 | 亚洲在在线观看免费视频 | 国产又黄又大又粗又硬又猛樱花 | 国产熟女一区二 | 好姑娘视频观看免费完整版 | 欧美人成在线播放网站色 | 国产在线一区二区三区视频 | 亚洲日本一线产区和二线产 | 成人免费一区二区三区 | 国产丝袜jk福利 | 98视频在线| 亚洲人成网线在线播放va | 国产人成视频永久免费 | 亚洲成年看片在线观看 | 亚洲国产精品国语在线 | 国精品片在线视频 | 欧亚一卡二卡3卡四卡精品 日本一区二区 | 老熟女导航精品导航 | 国产ab一区二区 | 破了亲妺妺的处免费视频国产 | 国产免费aⅴ一区二区三区 禁止18点击进 | 日韩一区二区三区在线观看 | 国自产拍亚洲免费视频 | 亚洲一区网站 | 国产91精品露脸国语 | 日本国产在线播 | 国产精品免费中文字幕在线观 | 好吊色国产在线视频 | 巨胸喷奶水视频www 男女一进一出超猛烈的视频 | 日本高清免费aaaaa大片视频 | 人人爰人人人人人鲁 | 热播电视剧 | 69hdxxxxcom | 国产精品成人亚发布 | 色五月最新网 | 国产福利一区二区久 | 亚洲欧美日韩人成在线播放 | 国产在线观 | a级高清观看视频在线看 | 无吗一区二区三区 | 国产伦一区二区三 | 91精选日韩综合永久入口 | 日韩欧美精品图片在线 | 亚洲人和日本人jzz视频 | 成人国产精品日本在线 | 国产乱理伦片在 | 午夜在线欧美曰韩精品影 | 免费观看精品视频999 | 免费观看国产日本一区二区 | 中文字幕一区二区三区 | 日韩精品一区二区三区射精 | 欧美一级特黄aa大片 | 俺去也伦理资源站 | 欧美亚洲日韩在线综合 | 国产精品亚洲产品一区二区三区 | 国产精品三级网 | 日本不卡高清视国 | 日韩国产精品一区二 | 亚洲成a人片在线不卡 | 两性色午夜视频免费国产 | 综合欧美乱伦高清 | 成人影院在线观看 | 精品国产日韩欧美一区 | 一区两区三区四区乱码国产精品 | 中文字幕精品亚洲一区 | 91精品手机国产在线观 | 国产乱人 | 日韩一区二区三 | 精品一区在线 | 99热精品免费国产 | 亚洲大片精品免费在线 | 高清免费| 欧美亚洲国产高清在线 | 日韩美精品成人一区二区 | 欧美xxxx做 | 男生j桶进女人p又色又爽又黄 | 精品国产91乱码一 | 欧美国产日本高清不卡 | 7799国产大片免费看 | 国内自产一区视频 | 视频国产精品丝袜第一页 | 国产乱子伦精品免费 | 成人字幕网视频在线观看 | 日本亚洲欧美在线视 | 国内成人免费视 | 男女做aj视频免费的网站 | 亚洲免费在线国产视频午夜精 | 影音先锋女人aa鲁色资 | 日韩成人三级在线观看 | 麻花影视在线看电视剧软件 | 日本阿v视 | 国产精品亚洲专区在线播放 | 亚洲国产婷婷综合在线精品五月 | 国产专区欧美专区在线观看 | 日韩精品人成在线播放 | 欧美日韩一区二区三区四 | 狂野欧美性猛xxxx乱大交 | 性一交一乱一伦一在线小视频 | 高清免费| 国产尤物一区二区在线播放 | 日本高清乱理伦片中文字幕 | 国产超清精品在线观看 | 国产一卡2卡三卡4卡在线观看 | 国产人在线成免费视频 | 欧美多人顶级午夜寂寞影院 | 国产日韩欧美不卡在线二区 | 欧美人做人爱a全程免费 | 欧美性色高清生活片 | 三年片大全免费观看2025在 | 午夜福利电影 | 国产中文字幕在线点播 | 玩成熟老熟女视频 | 欧美人与动牲猛交a欧美精品 | 日本免费人成在线网站 | 国产真实伦在线播放 | 国产精品一区二区免费16 | 欧美v国产v亚洲v日韩九九 | 国产成年人免费在线观看 | 欧美一级日韩国产 | 男女肉大捧一进一出视频 | 国内乱码一线二线三线 | 福利资源在线导航网址 | 男人操女人网站 | 欧美日韩在线免费观看 | 在线国产精品看片 | 日本a网免费在线观看 | 亚洲综合一区国产精品 | 欧美精品一区二区三区在线播放 | 在线观看的免费网站 | 丰满岳妇乱一区二区三区 | 国产特黄| 精品日韩成人欧美 | 韩国精品福利一区二区 | 国产在线激情小视频青青 | 中文字幕亚洲不卡在线亚瑟 | 国产高清亚洲免费片 | 国产乱码精品一区二区三区百度 | 亚州怡红院| 91福利电影| 日本精品a在线观看 | 女人一级视频在线观看 | 国产又大又粗又黄又爽的视 | 国产精品免费大 | 一区二区三区四区日韩 | 欧美日韩高清一道 | 国产综合中文字幕在线 | 日韩在线视频 | 亚洲欧美丝袜另类清纯 | 久青草青综合在线视 | 99在线精品免费视频九九 | 中文字幕精品一区二区三区在线 | 欧美一区二区三区在线观看 | 欧美午夜理伦三级在线观看 | 一二三四在线观看免费中文吗中文 | 午夜福利成人污在线观看 | 国产欧美一二三区男女交配 | 国内精品免费久 | 丝袜美腿精 | 欧洲成人精品高清在线观看 | 国产痴汉系列在线播放 | 女人成年网站在线观看 | 日本中文字幕一区二区有码在线 | 国产午夜不卡一区 | 国产一线大片免费观看 | 18处破外女出血在线 | 青青在线观看国产大片 | 善良的岳hd中字伦理 | 美女视频黄的网站全免弗 | 国产高清综合 | 日韩高清一区二区 | 视频在线观看播放免费 | 精品一区二区三区四区在线 | 国产一区二区视频在线观看 | 欧美亚洲喷水视 | 狂野欧美性猛交xxxx免费 | 91精品欧美 | 欧洲一曲二曲三曲视频 | 亚洲欧美日韩专区一区二区三区 | 绿巨人视频app汅在线 | 日韩免费精品一区二区三区 | 国精产品一品二品国精品69xx | 国产性夜夜春夜夜 | 国产欧美国产精品第一区 | 日本三级在线播放线观看视频 | 精品亚洲国产品香蕉在线 | 国产视频每日更新 | 欧美性爱中文字幕无 | 亚洲国产精品尤物yw在线 | 亚洲欧美日韩激情在线观 | 国产ā片在线 | 狂野欧美激情性xxxx | 秋霞影视免费播放手机版 | 免费电视剧网站 | 日韩国产欧美精品综合二区 | 精品国产电影在线 | 亚洲中国中文字幕免费 | 最新热播电影完整版 | 91国语自产拍在线 | 成视频在线播放免费人成 | 日本一本二本三区免费 | 国产在线拍偷自揄拍精品 | 国产人成网在 | 成人亚洲欧美丁香在线观看 | 91全网在线观看国产 | 99爱免费观看视频在线 | 中文综合第二页 | 手机看片102| 精品日韩国产欧美 | 欧美日韩午 | 国产一级a爱做片免费看 | 成年人免费体 | 99在线观看视频免费精品9 | 性欧美乱妇高清come | 国产精品精品自在线拍 | 偷窥自拍88 | 欧美成āⅴ人高清免费观看 | 在线亚洲欧美制服中文字幕 | 国产精品视频系列专区 | 亚洲精品高清中文字幕完整版 | 国产精品一区福利在线观看 | 国产精品首页熟女 | 日本黄本道一区二区在线观看 | 国产亚洲欧美丝袜 | 日韩美色中文娱乐网 | 国产日韩a在线观看免费视频 | 日本三级做a全过程在线观看 | 不卡午夜| 日韩成人最热在线观看网站 | 免费中文字幕视频2025一页 | 免费日漫在线 | 国偷自产一区二区三区在线视频 | 国产视频网站在线观看 | 日本欧美中文字幕福利一区 | 国产香蕉人在线播放视频网站 | 亚洲视频在线观看免费 | 区二区视频在线观看 | 国产如狼似虎富婆找强壮黑人 | 国产激情在线观看 | 日韩激情电影在线观看 | 日本www视频男人的天堂 | 日本不卡一区二区三区 | 亚洲欧美日韩一区中文字幕 | 国产乱子伦一区二区三区视频播放 | 8x8ⅹ国产精品 | 日本中文字幕专区视频在线 | 国产美女尤物在线播放 | 国产精品欧美亚洲区 | 60分钟床色大片在线观看免费 | 国产自产21区最新资源 | 国产精品一区日韩视频三区 | 成人精品欧美一区二区 | 日本欧美中文日韩v在线 | 中文字幕精品亚洲无线码二 | 国产成年人视频免费 | 日本黄页网站免费大全 | 国产亚洲精品资源在线 | 91欧美在线视频 | 初次深交流请多指教第二话 | 国产经典在线观看一区 | 欧美艳星nikki激 | 国产精品亚洲午夜不卡 | 亚洲国产高清国产拍精品 | 一区二区三区精 | 国产精品成人午夜欧美日韩 | 傲盟下载| 精品福利在线观看 | 日本欧美中文字幕福利一区 | 日韩亚洲欧美亚洲一区二区 | 最近中文字幕视频高清 | 欧美性受xxxx白人性爽 | 国产丶欧美丶日本不卡视频 | 男人j日女人p免费视频 | 精品蜜桃秘?一区二区三区 日本湿姝在线观看 | 伦理片在线线手机版韩国免费6 | 亚洲国产一区二区三区综合片 | 欧美亚洲综合另类成人 | 亚洲国产欧美在线人网站 | 日韩经典欧美一区二区三区 | 国产日韩成人精品视频 | 成人精品久 | 欧美日韩中文字幕在线观看 | 女人下边紧了好还是松点好 | 国产精品日韩亚洲一区二区 | 午夜网站免费 | 亚洲成a人片在线观看高清 日韩亚洲国 | 妺妺窝人体色777777 | 国产高清乱理伦片中文 | 国产99日韩精品第一页 | 欧美最猛性| 国产亚洲欧美另类在线观看 | 日本又黄又爽gif动态图 | 韩国精品福利一区二区 | 国产一级欧美一区二区 | 日本免费一区二区三区中文字幕 | 欧洲成人r | 欧美精品视频在线观看 | 日韩在线观看 | 免费精品一区二区三区在线观看 | 日本香蕉尹人在线视频 | 午夜在线电影网 | 日韩欧美亚洲综合 | 日韩免费高清完整版 | 国产日韩欧美精品91首页 | 亚洲国产欧美日韩一区 | 国产一级做a爱免费观看 | 区二区三区四区免 | 九九热视频 | 91香蕉污视频下载安装 | 老熟女hdxx中国老熟女 | 日韩精品高清在线亚洲天堂 | 日韩精品欧美有码 | 国产高清精品一区二区 | 精品国产高清自在线a免费片 | 国产一区二区三区四区精 | 九九国产精品 | 中文字幕亚洲欧美一区 | 精品福利一区二区三区免费视 | 国产视频福利一区电影 | 91新网页saas版影视网站 | 成人污污污www网站免费 | 免费高清影视资源观看 | 亚洲日韩国产一本视频 | 国产在线精品99一区不卡 | 日韩精品二区 | 日本人浓密bbw | 亚洲一区二区三区四区在线观看 | 亚洲国产欧美国产综合一区 | 国产精品日韩中文字幕 | 三区免费观看 | 91tv成人| 国产舌乚八伦偷品w | 999热成人精品国 | 成人性生交大片免费看 | 欧美性爱插插插 | 夜鲁鲁鲁夜夜综 | 包子铺welcome仙踪林 | a加勒比一本东京 | 果冻传媒国产电影免费看 | 动漫番肉在线观看 | 欧美日韩中文国产一区发布 | 国产综合在线播放 | 亚洲中文字幕在线一区播放 | 高清有码国产一区二区 | 日产精品一卡2卡三卡4乱码 | 日韩成全视频观看免费观看高清 | 欧美日韩成人免费 | 日韩精品综合 | 日韩国产欧美一区二区三区 | 起碰视频在线 | 新不夜城综合另类 | 欧美刺激性大交 | 欧美亚洲中日韩中文字幕在线 | 国产探花在线播放 | 一区二区亚洲精品国产片 | 国产偷国产偷亚洲欧美高清 | 女同蕾丝一 | 国产传媒在线观看 | 欧美乱码一二三区视频 |