欧美日韩亚-欧美日韩亚州在线-欧美日韩亚洲-欧美日韩亚洲第一区-欧美日韩亚洲二区在线-欧美日韩亚洲高清精品

金喜正规买球

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
专区不卡 | 韩精品欧美综合区 | 涩涩爱在线观看 | 伊人国产在线播放 | 姐姐的朋友3 | 欧美日韩午 | 亚洲国产日韩不卡线欧美 | 成人影院在线免费观看 | 中文字幕亚洲无线码在一区 | 在线观看中文最近最新观看 | 国产精品宾馆精品酒店 | 日本日本乱码伦视频在线 | 草莓视频污免 | 国产精品k频道首页在线观看 | 国自产拍在线视频天 | 亚洲精品中文字 | 女厕所撒尿视频免费 | 日韩综合一区在线观看 | 午夜在线电影网 | 香港日本韩国三级网站 | 亚洲欧美综合另类中字 | 免费高清影院 | 羞羞视频 | 亚洲第一视频在线播放 | 亚洲欧美日韩中文字幕在线不卡 | 日本伦理片在线看 | 2025最新热播电影电视剧 | 在线观看亚洲精品福利片 | 欧美综合亚洲日韩精品区 | 欧美性猛交xxxx免费看 | 日韩电影大片手机在线观看 | 中文字幕日韩wm | 中日韩国内精品视频 | 日韩精品视频欧美国产 | 欧美特黄aaaaa | 在线一区二区三区 | 欧美日韩一区二区综合在线 | 日韩免费一区二区三区高清 | 欧美视频一区二区专区 | 天堂va欧美ⅴa亚洲va一国产 | 欧美xxxxx高| 国产在线观看青草视频 | 水蜜桃视频网站在线观看网址 | 亚洲成a人v影院 | 日韩在线视频 | 51国产愉自视频区视频 | 国产日韩欧 | 91一区二区午夜免费 | 国产一区欧美亚洲 | 国产第一福利136视频导航 | 亚洲成?v人片在线观看翻墙网站 | 一级女性全黄生活片免费 | 国产欧美综合精品一区二区 | 国产黃片在线观看 | www.五月天激情 | 蜜桃视频一区二区在线观看 | 在线观看国产人视频免费中国 | 色天使综合婷婷国产日韩v 国产精品ⅴa在线观看 | 国产精品1024永久免费中国 | 91精品啪国产在线观看免费牛牛 | 亚洲一区在线视频 | 国内视频一区在线播放 | 在线精品国精品国产尤物 | 大黑人交xxxx | 国产综合成人一区二区三区电影院 | 最近免费字幕中文大全 | 欧美午夜在线观看 | 99免费在线视频 | 日本阿v免费观看视频 | 国产日韩精品一区二区在线播放 | 果冻传媒视频在线 | 亚洲欧美精品综 | 国产乱子伦不卡视频 | 国产高清精品一区二区不卡 | 91精品专区国产盗摄 | 国产精品香蕉夜间视频免费播放 | 国产精品免费一区二区三区 | 婷婷开心激情综合五月天 | 国产精品v片在线观看不卡 国产亚洲精品午夜福利 | 视频播放| 99视频精品免费在线观看 | 羞羞网站在线观看 | 一区二区三区四区免费视频 | 99爱国产精品免费高清在线观看 | 成人区http | 亚洲中文 | 国产亚洲综合一区柠檬导航 | 欧美日韩国产一区二区三区不卡 | 国产丝袜视频在 | 国产一区欧美一区二区 | 国产精品一级婬片免费 | 男人的天堂 | 国产精品亚洲综合一区在线观看 | 中文字幕与 | 精品国产91乱码一区二区 | 50岁丰满女 | 欧美午夜一区二区三区 | 免费国产黄线在线播放 | 日本在线观看一区 | 日韩在线视频 | 亚洲色久婷婷 | 国产网站免费精品网站 | 日韩综羞羞视频免费网站欧美 | 欧美成aⅴ人高清免费观看 精品人伦一区二区三区 | 国产精品免费aⅴ片在线观看 | 精品国产福利盛宴在线观看 | 国产色系视频免费在线观看 | 国产日韩一 | 小蜜被两老头 | 18以下勿进色禁网站免费看 | 色撸撸在线视频 | 国产精品厕所 | 亚洲精品一在线观看 | 亚洲国产精品综合小说图片区 | 亚洲国产精品sss在线观看 | 国产综合色在线视频区 | 由91亚色| 国产99视频精品免费观看9 | 亚洲色妇网站 | 精品一区二区三 | 午夜影院网站野外大战 | 欧美变态口味重另类在线视频 | 99热这里只有精品 | 中文字幕精品视频第一区第二 | 精品视频在线 | 免费电影网站在线观看 | 欧美国产日韩a视频在线不卡 | 欧美日韩免费不卡在线观看 | 8x8×拨牐拨 国产suv精品一区二区6 | 久在线免费观看成年人视频 | 亚洲三级带中字 | 亚洲欧洲日产国码农村 | 91丝袜在线观看亚洲 | 国产精品黄在线观看免费 | 日本高清在线观看www色 | 国产激情视频在线观看 | 拍拍拍无挡国产精品 | 国产亚洲精品综合在线网址 | 中文乱码字幕在线观看播放 | 乌克兰少 | 视频一区中文字幕日韩专区 | 最新免费电影 | 国产精品人成在线播放新网站 | 亚洲欧美精品精品aⅴ | 女人18毛多水多 | 国产欧美综合精品一区二区 | 91天堂国产网站 | 亚洲精成9| 91精品国产品香蕉在线 | 99精品视频免费热播在线观看 | 中国免费xxxx视频在线观看 | 欧美日韩中文在线 | 精品国产午夜福利在线观看蜜月 | 亚洲欧美性综合在线 | 欧美日韩成人午夜电影 | 蜜桃精品一区二区三区在线观看 | 日本在线视频在线 | 国产人成在线观 | 日韩欧美国产精 | 国产一区视频一区欧美 | 亚洲综合另类第一页 | 国产91精品老熟女泻火 | 91精品在线看 | 在线人成免费 | 网址视频在线成人亚洲 | 午夜福利精品 | 国产国语一级 | 亚洲人成网站在线 | 国产一区二区亚洲一区二区 | 成人国产精品中文字幕 | 老太xxxx下面毛茸茸 | 最新在线观看视频国产91 | 国产日本欧美高清免费区 | 欧美日韩在线播放一区二区三区 | 国产资源中文字幕 | 欧美色精 | 国产欧美日韩综合精品一区二区 | 国产精品专区第一页 | 神马电影| 精品免费囯产一区二区三区四 | 免费观看视 | www.五月天激情 | 色拍自拍亚洲综合图区 | 太大太长太粗太久太硬了 | 99精品偷拍视频一区二区三区 | 免费人成年短视频免费网站 | 精品精品国产欧美在线观看 | 中文国产欧美在线观看 | 巨熟乳波霸中文观看免费 | 欧美有色 | 亚洲色一色噜一噜噜噜人与 | 动漫h在线观看 | 国产亚洲综合区成 | 在线欧美精 | 欧美日韩亚洲一区二区三区 | 小说区激情另类春色 | 日韩新片在线观看网 | 7799精品天天综合网 | 亚洲欧美日本国产—区二区三区 | 国产日本在线观看网址 | 三三影院网 | 欧美日韩变态另类在线观看 | 一区二区三区在线 | 国产噜噜噜精品免费 | 亚洲欧美日本韩国在线观看 | 亚洲jizz | 国产黃色精品三級一区二区 | 色依依亚洲一区在线观看 | 国产女人喷潮在线观看视频一 | aa视频观看网站 | 日本一区二区三区四区公司 | 亚洲欧美日韩国产精品专区网 | 好看的电视剧免费在线观看 | 亚洲综合娱乐在线视频 | 亚欧成人中文字 | 秋霞伦理电影在线看 | 中文字幕人成乱码在线观看 | 综合五月激情二区视频 | 亚洲熟女乱综合一区 | 影院4k电影在线 | 免费视频精品一区二区三区 | 天堂网果冻传媒 | 日韩精品美女视频 | 日本乱理伦片在线观看中文字幕 | 午夜成人免费影院 | 福利第二页精品推荐在线观看 | 中文文字幕文字幕亚洲色 | 亚洲日本一线产区和二线 | 青青草自产拍国产精品 | 日韩国产亚洲一区二区 | 欧美女视频网站大全在线观看 | 日韩va不卡精品一区二区 | 欧美亚洲| 亚洲韩精品欧美一区二区三区 | 欧美日韩日处女黑人 | 日韩国产欧美亚洲一区不卡 | 亚洲精品在线观看中文字幕 | 在线观看精品国产免费 | 国产丝袜视频在 | 欧美日韩一区日本成人一区二区 | 国产精品ⅴa在线观看 | 成人午夜福利短视频在线观 | 日本中文字幕在线播放 | 欧美三级在线观看视频 | a级高清观看视频在线看 | 亚洲精品国产精品乱码不卡√ | 欧美日韩第一页中文字幕 | 欧美+亚洲+精品+三区 | 国产高清不卡在线 | 国产美女精 | 福利一区二区 | 成人91污污污在线观看 | 欧美自拍区日韩国产区 | 羞羞影院午夜男女爽爽影 | 日韩在线视频中文字幕 | 热播电视剧免费追剧 | 亚洲欧美日韩国产精品一区二 | 国产亚洲精品自在在线观看 | 成人国产精品一区二区免费 | 91天仙tv国产福利精品 | 国产韩国精品一区二 | 国产福利爱福利微拍视频 | 欧美精品亚洲精品日韩专区va | 精品一区二区三 | 高清在线午夜一区二区亚洲 | 国内日本精品视频在线观看 | 在线观看亚洲一区二区三区 | 国产美女自卫慰视频福利 | 三级影视| 欧美日韩亚洲 | 国产狂喷潮在线观看 | 精美日产| 精品国产一区二区三区香 | 亚洲精品视频在 | 一区两区三区四区乱码国产精品 | 国产又大又粗又黄又爽的视 | 国产精品进线69影院在线 | 日韩精品在线不卡一区二区 | 国产日本精品视频 | 国产男女免费完整视频网页 | 黑人在日| 成人国产亚洲精品a区天堂 激情五月天深爱网 | 日韩a∨精品日韩在线观看 国产女精 | 欧美最猛性xxxxx大叫 | 手机高清热播韩剧美剧电视剧 | 欧美日韩成人午夜电影 | 国产真实强奷网站在线播放 | 国产福利在线永久视频 | 日韩一级 | 丰满妇女强 | 亚洲国产欧美日韩另类 | 亚洲中文字幕一二三四区 | 欧美国产在线看 | 真实国产乱子伦对 | 亚洲日韩动漫一区 | 国产精品jlzz视频 | 国产日b视频在线观看 | 丝袜美腿精品 | 国产亚洲精品午夜高清影院 | 成人亚欧| 九九热这里只有精品视频 | 国产91茄子在线播放 | x8x8国产在线最新地址 | 国产一区二区不卡视频 | 日韩中文字幕v亚洲中文字幕 | 成人永久免费视频网站在线观看 | 成人又黄又爽又色的网站 | 中文字幕人成人乱码亚洲影 | 欧美日韩国产欧美 | 欧美精品国产制服一区 | 国色天香在线观看 | 三年片在线 | 午夜丁香婷婷免费手机在线观 | 在线观看国产高清免费不卡黄 | 国产精品国产 | 国产日韩在线视频 | 国产欧美日本亚洲 | 亚洲人和日本人jzz视频 | 国产直播视频在线播放 | 国产日韩在线视频免费播放 | 欧美视频人人干人人 | 69一区二三区好的精华液 | 成人国产精品中文字幕 | 911亚洲精品国内自产 | 免费人成在线观看播放 | 国产欧美精品一区二区三区pp | 欧美日韩国产这里只有精品 | 欧美中文字幕人成在线网站 | 欧美日韩精品福利 | 国产欧美日韩精品丝袜高跟鞋 | 九九九国产视频 | 军训完被教官灌满精子男男 | 亚洲日本v | 国产凸凹视频一 | 日韩免费的视频在线观看香蕉 | 天堂亚洲日韩专二区 | 日本高清在线观看www色 | 2025免费国产a | 亚洲一区二三区好的精华液 | 欧美国产日韩一区二区三区综合视 | 午夜福利久| 国产精选在线视频 | 国产成年人免费在 | 国产精品初高中精品免费观看 | 亚洲欧美日本国产—区二区三区 | 免费人成动漫在线播放r1 | 青青久热| 日韩电影免费观 | 91精品区| 看片国产 | 国产精品国色综 | 日本高清一区二区 | 欧美日韩免费一区二区在线观看 | 激情小说亚洲图片伦 | 欧美亚洲综合色 | 热播影视大全 | 亚洲中文字幕乱码熟女在线 | 大片免费视频观看 | 欧美特黄一免在线观看 | 国产精品中文 | 亚洲日本va | 网友自拍视频一区二区三区 | 中文字幕日韩一级 | 亚洲免费在线观看一区二区 | 亚洲欧美在线观看 | 欧美激情一区二区三区成人 | 香港三级理论在 | 日韩欧美国产奇米影视在线观看 | 免费黃色三級片在线观看18 | 欧美18videosex性极品 | 亚洲成a人片在线观看 | 日韩乱码精品中文字幕不卡 | 国产精品亚洲片在 | 亚洲精品成人一区二区aⅴ 精品国产成a人在线观看 | 国产a网站 | 成人激情电影 | 亚洲囯产一区二区三区 | 国产一级a爱片 | 无尽动漫性视频╳╳╳3d | 国产美女自卫慰水免费视频 | 综合网国产国产人 | 国产亚洲精品aa | 第一影院| 亚洲视频免费观看 | 99电影网 | 色哟哟精| 国产专区91 | 91精品国产免费青青碰在线观看 | 亚欧精品一区二区三区四区 | 日日夜夜精品免费视频779 | 欧美日精品一区二区在线观看 | 国产日产高清欧美一区 | 最好看免费观看高清电影大全 | 性欧美乱妇高清come | 日日噜噜夜夜狠狠va | 欧美国产一区二区三区精品 | 国产h片量多网站 | 一区二区亚洲精品国产片 | 国产男人午夜视频在线观看 | 国产一卡2卡3卡4卡网站免费 | 国产一区二区三区在线综合视频 | 国产在线观看福利一区二区 | 在线播放精品一区二区三区 | 亚洲免费在线国产视频午夜精 | 日本福利一区二区三区 | 五月综合激情婷婷六月色窝 | 国产亚洲自拍一区 | 欧美+日韩+ | 日韩一区二区手机免费观看 | 日本高清中文字幕高清在线 | 在线精品国产第一页 | 日韩欧美在线综合网高清 | 国产未成女一区二区 | 天天射天天添 | 国产精品v日韩精品v | 欧美日韩国产亚洲一区二区 | 欧美一级特黄aaa大片在线观看 | 99re6热在线精品视频观看 | 国产精品激情欧美可乐视频 | 成人一区专区在 | 亚洲日韩成人精品不卡在线 | 欧美极品jizzhd欧美 | 国产天堂网在线视频 | 国产啪视频免费观看视频 | 国产一级午夜大片 | 资源在线观看高清国产 | 成人免费a | 国产午夜福利精品一区 | 国产欧美一区二区三区户外 | 丰满岳乱妇在线观看中字无 | 一区二区三区日韩免费 | 午夜影视污 | 欧亚天堂在线播放 | 国产精品日产欧美在线一区 | 三年在线观看免费大全 | 日本一区二区电影 | 91影视永久福利免费观 | 亚洲人和日本人jzz视频 | 国产日产高清dvd碟片 | 88影视网免费的电视剧 | 国内精品自在自线在免费 | 亚洲卡通欧美制服中文 | 福利导航 | 亚洲熟女精品中文字幕 | 欧美黑粗特黄午夜大片 | 国产偷伦精品视频 | 亚洲中文欧美 | 欧美日韩四区在线 | 亚洲国产一成久 | 亚洲国产欧美精品一区二区三区 | 最新欧美日韩 | 国产乱子伦农村xxxx | 伦理片午夜视频在线观看免费 | 两口子交换真实刺激 | 在线欧美精品二区三区 | 青青青爽在 | 欧美精品视频手机在线视频 | 国产精品自产拍在线观看 | 欧美精品黄页在线观看2区 日本视频 | 欧美在线伊人 | 欧美日韩国产综合 | 亚洲国产日韩无在线播放 | 亚洲国产欧美日韩精品网 | 福利微拍一区二区 | 亚洲精品国产v片 | 午夜在线观看亚 | 国产在线一卡2卡三卡4卡免费 | 亚洲欧美v视色一区二区 | 亚洲欧美日韩中文高清一 | 风流老熟女一区二区三区l 国产亚洲精品国产福利 | 国产又大又硬又粗 | 91精品国产闺蜜国产在线闺 | 97青草最新免费精品视频 | 国产亚洲欧美 | 男人j日女人p免费视频 | 精品国产高清自在线 | 亚洲一日欧美日韩中文字幕 | 国产亚洲一区激情小说 | 中文一区二区三 | 日本高清一二三不卡区 | 亚洲欧美日韩激情在线观看 | 日日摸夜夜添夜夜添特色大片 | 超91精品手机国产 | 精品区一区二区三 | 国产精品成人不卡在线观看 | 国产精品自线在线播放 | 亚洲区小说区图片区qvod | 大陆精大陆国产国语精品 | 国产在线精品一区在线观看; | 亚洲第一区国产一区二区精品 | 精品成人大胸美女视频在线播放 | 国产亚洲综合一区柠檬导航 | 药物迷奷系列在线播放免 | 国产小视频在线高清播放 | 成人免费观看视频 | 亚洲国产精品自在现线让你爽 | 日韩中文字幕精品视频在线 | 欧美日韩精品一区二区在线播放 | 尤物国产精品福利三区 | 中文日本免费高清 | 日韩一区二区三区免费精品 | 亚洲色成人www永久网站 | 国产农村乱子伦精品视频 | j8又粗又大又长又爽又硬电影 | 性直播视频在线观看免费 | 欧美日韩国产另类不卡在线 | a级国产乱理伦片在线观看 天美传媒官方网站 | 日本一本二本三区免费免费高清 | 黑人和欧美人交bbw 午夜电影网在 | 人成午夜视频在线观看 | 最近日本韩国观看 | 成人91污污污在线观看 | 国产综合欧美日韩视频一区 | 爽妇综合网 | 男人j放进女人p全黄在线 | 精品国产日韩无影视 | 国产高清在线精品一本大道 | 国产精品第一区亚洲精品 | 狼群影院视频在线观看高清版 | 国产精品亚洲网红主播 | 亚洲国产高清在线不卡 | 国产老女人精品免费视频 | 永久免费播放 | 国产va天堂va欧美va | 日韩精品亚洲a | 日韩女同在线二区三区 | 男女超爽视频免费播放 | 在线观看免费精品国产第一区 | 亚洲日本 | 欧美日本一区二区视频在线播放 | 亚洲国产精品成人va在线观看 | 日韩高清码中文字幕日韩 | 日韩亚洲第一页 | 欧美日韩一区二区成人午夜电影 | 亚洲日韩高清在线亚洲专区 | 激情综合五月 | 中文字幕在线观看不卡 | 国产无吗一区 | 91视频官 | 国产精品专区第一页在线观看 | 成人福利国产精品视频 | 最近的中文字幕 | 伊人影视 | 欧美一区二区三区免费播放 | 免费在线追剧 | 91久色视 | 中文字幕在线看日本大片 | 国产精品一区二区手机在线观看 | 日韩电影在线观看视频 | 一区二区三区日韩免费 | 国产亚洲欧美一区二区三区 | 日韩高清在线播放不卡 | 日本最新一日本一二三区 | 交换配一点不卡 | 一本精品一区二区在线观看 | 国产日韩精品一区二区在线观看 | 亚洲国产v片在线 | 欧美怡红院免费全部视频 | 免费看涩涩视频网站入口 | 7799精品天天综合网 | 美腿丝袜在线播放 | 欧美国产在线专区 | 亚洲精品在线中文字幕 | 午夜a级理论片在线播放 | 国产精品今日更新国产主播 | 欧美日本一区二区三区在线 | 国产精品一区二区播放在线 | 辽宁老熟女 | 国产亚洲欧美高清在线观看 | 中文字幕在线观看国产 | 北京国贸大酒店张津 | 精品免费一区二区三区视频 | 真人二十三式性视频(动) | 日韩午夜理论免费tv影院 | 精品国产sm捆绑最大网免费站 | 91视频国产亚洲精品 | 亚洲中文字幕dⅴd | 精品国内一区二区三区免费视频 | 国产综合在线观看自拍 | 99在线热播 | 国产精品自在线拍国产下载 | 最近免费中文字幕 | 九九热这里只有精品在线观看视 | 国产在线一区二区三区欧美 | 最新国产精品拍自在线播放 | 一区二区视频在线 | 野花香视频免费观看高清在线 | 日韩国产免费一区二区三区 | 高清在线免费欧 | 日本看片一区二区免费 | 日本免费在线视频 | 免费二级c片在线观看a | 青草在线视频在 | 亚洲资源最新版在线观看 | 日本搞黄| 中文字幕日韩精品一 | 亚洲成a人片在线观看网站 亚洲第一综合天堂另类专 91成人小视频 | 日本高清不卡一道免费观看 | 亚洲欧美日韩国产综合 | 性荡视频播放在线视频 | 国产日韩欧美 | 中文字幕一区二区三区不卡 | 无毒不卡在线观看无需下载 | h视频免费在线 | 国内成人精品亚洲 | 国产日韩区欧美a | 91精品国产自产在线观看永久 | 亚洲国产日韩欧 | 国产精品免费视频能看 | 50岁丰满女| 美女视频黄频a美女大全 | 国产视频综合网 | 成年男人午夜片免费观看 | 日本免费国产 | 日本日本乱码伦视频在线观看 | 国产91丝袜在线播放动漫蜜月 | 大胆gogo高清在线观看 | 国产丝袜在线精品丝袜不卡 | 欧美精品网站一区二区三区 | 国产一级二级三级经典在线 | 国产日韩精品一级二级 | 国产公开免费人成视频 | 午夜日韩综合激 | 亚洲精品制服丝袜四区 | 91免费网站| 综合精品网成人影院 | 国产一区二区三区影院 | 日韩电影免费在线观看中文字幕 | 亚洲精品国产电 | 大吊干逼视频 | 艾栗栗国产精品视频一区 | 一区二区不卡 | 国产在线欧美观看 | 国产精品午夜福利免费老师 | 亚洲狠狠婷 | 日本xxxx色 | 扒开腿挺进肉嫩小泬喷水网站 | 色偷偷2025免费视频观看 | 日韩性爱视频 | 在线网站| 国产福利在线免费 | 国产每日更 | 国产精品女主播主要上线 | 国产又黄又大又粗的视频 | 成人α片免费视频在线观看 | 欧美精品亚洲精品日韩传电影 | 日韩亚洲国 | 综合色就爱涩涩涩综合婷婷 | 国产美女在线观看 | 日韩午夜视 | 日韩欧美在线综合va网 | 日本高清色本在线www | 国产精品免费大片 | 97在线观看免费视频观看 | 国产盗摄xxxx视频xxxx | 日本乱理伦片在线观 | 亚洲最大激情中 | 国产99日韩精品第一页 | 亚洲裸男gv网站 | 国产aⅴ一 | 91视频国产大片 | 综合久青草视频 | 国产又大又硬又粗 | 亚洲精品午夜福利在 | 国产亚洲a∨片在线观看 | 国产资源一区 | 国产亚洲精品日本亚洲网站 | 国产精品秘吴 | 色色色色色色资源女人天堂 | 日本成人频道一区二区三区 | 美女足脚交一区二区三区 | 国产在线精品一区二区高清不卡 | 日本国产一区二区三区在线观看 | 又粗又大又硬又爽的免费视频 | 国产精品视 | 国产片第一福利片 | 国产精品自产拍在线观看一 | 蜜臀视频 | 日韩精品人| 国产三区免费在线观看 | 尤物视频在线网站 | 国产午夜精华2025在线 | 欧美日韩韩高清在线不卡 | 欧美性狂猛xxxxx深喉 | 狂野欧美性猛交xxxx免费 | 91牛牛国产在线无弹窗 | 国产一区二区不卡免费 | 最新好看的电视剧免费在线观看 | 一区二区视频在线 | 999y| 三级特黄60 | 最新欧美精品一区二区三区不卡 | 黄瓜视频在线观看 | 国产一区二区精品尤物 | 国产亚洲日韩欧美一区二区三区 | 亚洲日韩不卡综合 | 亚洲欧美另类在线图片区 | 高清伦理| 成人年鲁鲁在线观 | 国产精品视频永久免费播放 | 狼群影院视频在线观看高清版 | 丰满大码熟女在线播放 | 自拍亚洲欧美国产 | 午夜欧美国产一区 | 在线看国产精品 | 日本高清一级婬片a级中文字幕 | 国产精品高清在线观看93 | 国产精品亚洲日韩au在线 | 国产精品专区第一页在线观看 | 97精产国品一二三产区 | 人人爱天天做夜夜爽2025 | 欧美一区二区三区四区国产另类 | 青青河边草免费高清电影 | 成人午夜在线观看国产 | 亚洲无亚洲人成网站77777 | 69午夜成年免费视频 | 婷婷国产精品中文字幕 | 国产黃片在线观看 | 大伊香蕉精品一区在线 | 国语对白刺激精品视频 | 九九热视频免费在线观看 | 国产亚洲福利日本一区二区 | 三年片在线观看免费 | 国产日韩精品一区二区三区在线 | 国产精品入口免费视频 | 亚洲色成人影院在线观看 | 日本护士xxxxx在线播放 | 男人性毛| 九九热这里只有精品在线观看视 | 亚洲是第一大洲的原因 | 国产+高| 日韩性freexxxx在线观看 | 亚洲一区二区三区高清视频 | 华人亚洲欧美精品国产 | 国产亚洲一区二区三区在线 | 国产大片黄在线观 | 国产免费人成视频在线播放播 | 国产免费网站看v片在线观看 | 99国产精品免费观看视频 | 中文字幕影片免费在线观看 | 亚洲色中文字幕在线播放 | 亚洲日本中 | 99这里只有精品在线观看视频播 | 真实国产熟睡乱子伦视频 | 亚洲一区二区三区和欧美四区 | аⅴ资源中文在线天堂 | 国产喷水大秀在线观看2025 | 国内偷拍第一页 | 在线亚洲欧国产精品专区 | 国产精品乱码一区二区三区 | 午夜亚洲国产理论片二 | 免费看美女脱了全身衣服直播 | 在线播放国产精品三级 | 成人国产精品中文字幕 | 视频免费| 欧美成a人片在线观看 | 不卡精品 | 成人免费高清视频 | 性xxxx欧美老妇胖老太性多毛 | 欧美日韩深夜视频在线观看 | 亚洲91精品一区 | 国产末成年女噜噜 | 亚洲美女视频网 | 欧美人成网站观看www | 日韩成人午夜影院 | 国产一极视频 | 在线一区二区三区中文字幕 | 免费在线观看国内色片网站网址 | 亚洲人色大成年网站在线观看 | 免费国产偷人三大片视频 | 国产熟女一区二区三区浪潮 | 天美传媒果冻传媒国产电影 | 中文字幕免费观看一区 | 蜜芽tv国产在| 日本vs亚洲vs韩国一区三区 | 亚洲欧美色一区二区三区 | 日韩成a| 天天天天躁天天爱天天碰2025 | 日本高清视频在线免费观看 | 成年女人免费碰碰视频 | 97干视频 | 成年私人影院网 | 国产超级va在线播放 | 天堂资源中文 | 精品亚洲成a | 亚洲欧洲| 尤物免费人成在线观看播放a | 免费观看最新电影和热门影视剧 | 中文天堂在线 | 国产精品国产午夜免费看福利 | 中文字幕第38页永 | 精品福利一区二区三区免费视频 | 国产一卡2卡3卡4卡网站免费 | 欧美v亚洲v综合v国产v | 日韩精品极品视频在线观看免 | 亚洲人成网站观看在线播放 | 亚洲人成网77777色在线播放 | 亚洲色偷偷偷鲁综合 | 国产欧美日韩va另类在线 |