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

事件委托的深層原理:當冒泡不夠用時,你該做什么?

開發 前端
并非所有事件都會冒泡——focus、blur、mouseenter和mouseleave?是例外。對于這些事件,使用focusin、focusout或自定義冒泡事件的替代方案。

隨著前端應用的規模擴大,用戶交互管理變得越來越重要。為每個交互元素添加事件監聽器是一種不良實踐,因為它可能導致代碼混亂、內存消耗增加和性能瓶頸。這時就需要事件委托了。

每個交互式網頁都是建立在文檔對象模型(DOM)及其事件系統之上的。當你點擊按鈕、在輸入框中輸入或懸停在圖片上時,就會觸發一個事件。但事件并非孤立發生,它會通過DOM樹傳播,這個過程稱為事件傳播。

對于構建現代Web應用的開發者來說,理解事件委托不僅是“錦上添花”,而是必不可少的。原因如下:

  • 提升效率——數百甚至數千個獨立的事件監聽器會消耗內存和CPU。事件委托集中處理,提高響應速度并減少開銷
  • 降低復雜度——在一個地方處理事件使代碼庫更整潔、更易導航和調試,避免監聽器散布各處
  • 保持功能——事件委托無縫支持動態添加的元素。即使DOM實時更新,應用也能保持響應

理解DOM事件傳播

在深入委托之前,了解事件如何通過DOM傳播非常重要。這個旅程被稱為事件傳播,分為三個不同階段。

三個階段

當事件在DOM元素上觸發時,它不會僅僅到達目標就停止。而是會經過以下階段:

  1. 捕獲階段——旅程從window開始,向下遍歷DOM樹中的每個祖先元素,直到到達目標元素的父元素。帶有useCapture = true(addEventListener的第三個參數)的事件監聽器在此觸發
  2. 目標階段——在此階段,事件到達目標元素。所有直接附加到該元素的事件監聽器都會觸發
  3. 冒泡階段——在擊中目標后,事件“冒泡”回DOM,從目標的父元素到其祖父元素,依此類推,直到到達window。默認情況下,大多數事件監聽器在此階段運行

你可以閱讀一篇全面的文章,了解原生JavaScript中事件傳播的工作原理。

事件在DOM樹中的流動

<div id="grandparent">
  <div id="parent">
    <button id="child">Click Me</button>
  </div>
</div>

如果你點擊<button id="child">,以下是click事件的流動:

  1. 捕獲——window -> document -> <html> -> <body> -> <div id="grandparent"> -> <div id="parent">
  2. 目標——<button id="child">
  3. 冒泡——<button id="child"> -> <div id="parent"> -> <div id="grandparent"> -> <body> -> <html> -> document -> window

我們可以使用event.eventPhase檢查事件階段:

const grandparent = document.getElementById('grandparent');
const parent = document.getElementById('parent');
const child = document.getElementById('child');

grandparent.addEventListener('click', (event) => {
console.log('Grandparent - Phase:', event.eventPhase, 'Target:', event.target.id);
}, true); // 捕獲階段

parent.addEventListener('click', (event) => {
console.log('Parent - Phase:', event.eventPhase, 'Target:', event.target.id);
}, true); // 捕獲階段

child.addEventListener('click', (event) => {
console.log('Child - Phase:', event.eventPhase, 'Target:', event.target.id);
}); // 冒泡階段(默認)

grandparent.addEventListener('click', (event) => {
console.log('Grandparent (Bubbling) - Phase:', event.eventPhase, 'Target:', event.target.id);
}); // 冒泡階段

parent.addEventListener('click', (event) => {
console.log('Parent (Bubbling) - Phase:', event.eventPhase, 'Target:', event.target.id);
}); // 冒泡階段

當你點擊“Click Me”按鈕時,控制臺輸出將顯示階段序列,展示事件如何先捕獲到DOM樹再冒泡回來:

圖片圖片

控制臺輸出顯示DOM點擊事件示例中捕獲、目標和冒泡階段的事件階段和目標

事件委托基礎

現在我們理解了事件傳播,讓我們探索如何利用它進行高效的事件處理。

什么是事件委托?

事件委托是一種將事件監聽器添加到多個子元素的父元素上的方法,而不是單獨添加到每個子元素。當子元素上的事件發生時,它會觸發父元素上的監聽器,監聽器會檢查是哪個子元素觸發了事件。

考慮一個簡單的列表<ul>,其中包含<li>項:

<ul id="myList">
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
</ul>

而不是為每個<li>添加點擊監聽器:

const listItems = document.querySelectorAll('#myList li');
listItems.forEach(item => {
  item.addEventListener('click', (event) => {
    console.log(`Clicked on: ${event.target.textContent}`);
  });
});

使用事件委托,你只需將一個監聽器附加到父元素<ul>:

const myList = document.getElementById('myList');

myList.addEventListener('click', (event) => {
  // 檢查點擊的元素是否是<li>
  if (event.target.tagName === 'LI') {
    console.log(`Clicked on: ${event.target.textContent}`);
  }
});

在這個例子中,當任何<li>被點擊時,click事件會冒泡到myList。myList上的單個事件監聽器然后檢查event.target.tagName,確認是<li>觸發了事件,并相應地執行操作:

圖片圖片

控制臺輸出顯示使用事件委托在四個列表項上點擊事件(標記為Item 1到Item 4)

為什么重要

事件委托非常有益,因為:

  • 相比可能添加數百或數千個監聽器,少數父容器就足夠了,大大減少內存占用
  • 更少的監聽器提高了瀏覽器的整體系統內存使用效率,并減少了JavaScript引擎在事件管理和分發方面的負載
  • 它支持動態創建的元素,這對于動態創建帶有事件處理器的JavaScript元素非常有幫助。假設在頁面加載后(例如API調用后)向#myList添加新的<li>元素,#myList上的監聽器仍然有效。無需重新附加監聽器

事件委托中的常見陷阱

雖然事件委托功能強大,但也有其注意事項。理解這些陷阱有助于你更可靠地實現它。

event.target與event.currentTarget

這兩個屬性經常被混淆,但它們有不同的用途:

  • event.target 是觸發事件的具體元素。在ul > li示例中,點擊<li>會使該<li>成為event.target,即使監聽器附加在<ul>上
  • event.currentTarget 是事件監聽器實際附加的元素。在我們的委托ul > li示例中,如果監聽器在myList(<ul>)上,那么event.currentTarget始終是myList

何時使用哪個

  • 使用event.target 當你需要確定在委托設置中哪個子元素被點擊或交互時
  • 使用event.currentTarget 當你需要引用帶有監聽器的元素本身時,例如在移除監聽器或事件發生后對容器執行操作:
myList.addEventListener('click', (event) => {
  console.log('Target element:', event.target.tagName);
  console.log('Current element with listener:', event.currentTarget.id);

  if (event.target.tagName === 'LI') {
    event.target.style.backgroundColor = 'lightblue'; // 修改被點擊的LI
  }
});

圖片圖片

控制臺輸出顯示點擊事件中的目標元素和帶有監聽器的當前元素

stopPropagation()和stopImmediatePropagation()

雖然這些技術可以有效地管理事件流,但它們可能會削弱委托處理程序的影響。

  • event.stopPropagation()——此方法將阻止事件繼續冒泡或捕獲。如果在子元素的事件處理程序中執行此操作,則其祖先上的任何委托監聽器都無法訪問該事件
  • event.stopImmediatePropagation()——這不是stopPropagation()的簡單復制粘貼。它們的相似之處在于這種效果:它阻止進一步的事件傳播,以及阻止附加到同一元素的其他任何監聽器執行

在某些情況下,它們會破壞委托處理程序,例如:子元素的事件處理程序調用stopPropagation將為DOM層次結構中任何委托監聽器創建功能空白。委托監聽器將不會收到事件。這對分析、集中式UI邏輯或可訪問的自定義控件功能尤其麻煩。

在這種情況下,除非有充分理由,否則不建議使用stopPropagation()和stopImmediatePropagation()。大多數情況下,其他技術(如event對象的屬性或管理組件狀態)可以讓事件流動而不產生意外后果。

Shadow DOM和事件傳播

Shadow DOM構成了組件的內部結構和樣式,并封裝了組件的邊界。Web組件的這一部分會影響事件流:

  • 事件重新定位——當事件冒泡出Shadow DOM時,event.target屬性會將指針重置為Shadow Host(自定義元素)。這是封裝和安全措施。外部世界不需要知道組件的組成部分
  • composed標志——某些事件不會跨越陰影邊界。composed的事件(例如click、keydown等)將打破Shadow DOM的束縛,繼續到下一個階段,即Light DOM。帶有composed: false的事件(如focus和blur)將保持在陰影邊界內,因此只能在Shadow DOM中觀察到
  • bubbles標志——bubbles標志用于創建自定義事件。對于自定義事件要跨越陰影邊界,必須設置bubbles: true和composed: true:
// 在Web組件的Shadow DOM內部
classMyShadowComponentextendsHTMLElement {
constructor() {
    super();
    const shadowRoot = this.attachShadow({ mode: 'open' });
    shadowRoot.innerHTML = 'Shadow Button';

    shadowRoot.querySelector('#shadowButton').addEventListener('click', (e) => {
      console.log('Inside Shadow DOM click:', e.target.id); 
    });
  }
}
customElements.define('my-shadow-component', MyShadowComponent);

// 在Light DOM(主文檔)中
document.body.innerHTML += '';
document.body.addEventListener('click', (e) => {
console.log('Outside Shadow DOM click:', e.target.tagName);
});

這個例子展示了當事件跨越陰影邊界時event.target的變化。在帶有Shadow DOM的事件委托中,請記住你的委托監聽器在Light DOM中會收到Shadow Host作為event.target。你需要監聽Shadow Host本身上的事件,或者考慮在你的Web組件中創建自定義事件并用bubbles: true和composed: true分發它們:

圖片圖片

控制臺輸出顯示Shadow DOM內部和外部的事件目標

不冒泡的事件(及解決方法)

雖然大多數常見UI事件會冒泡,但有明顯的例外事件無法通過標準冒泡機制委托。

不冒泡的事件

最明顯的不冒泡事件包括:

  • focus——當元素獲得焦點時觸發
  • blur——當元素失去焦點時觸發
  • mouseenter——當指針進入元素時觸發
  • mouseleave——當指針離開元素時觸發

為什么它們不冒泡

這些事件通常無法觸發,因為瀏覽器的運作方式以及過去的兼容性問題。focus和blur旨在觸發在獲得或失去焦點的特定元素上,因此沒有冒泡。mouseenter和mouseleave與mouseover和mouseout(它們會冒泡)配對;但是,與mouseover和mouseout不同,mouseenter和mouseleave僅在指針位于元素上時觸發(而不是在其子元素上)。

因此,由于你不能使用冒泡委托這些事件,你需要使用替代策略,包括:

  • 使用focusin/focusout代替focus/blur:focus和blur事件無法通過冒泡委托,但focusin和focusout事件可以。這些是用戶交互的極佳替代方案:
const form = document.getElementById('myForm'); // 包含輸入字段的父元素

form.addEventListener('focusin', (event) => {
if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {
    console.log(`Input focused: ${event.target.id}`);
    event.target.classList.add('focused-input');
  }
});

form.addEventListener('focusout', (event) => {
if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {
    console.log(`Input blurred: ${event.target.id}`);
    event.target.classList.remove('focused-input');
  }
});

圖片控制臺輸出顯示使用focusin和focusout事件處理輸入框的焦點事件

  • 手動分發自定義事件:對于mouseenter/mouseleave或其他不冒泡的事件,如果focusin/focusout不適用,你可以將單個監聽器附加到子元素,然后從該子元素手動分發一個自定義事件,確保它冒泡且可組成。這為你提供了細粒度的控制:
const items = document.querySelectorAll('.item'); // 許多項目

items.forEach(item => {
  item.addEventListener('mouseenter', (e) => {
    const customHoverEvent = newCustomEvent('item-hover', {
      bubbles: true,
      composed: true,
      detail: { itemId: e.target.id, action: 'entered' }
    });
    e.target.dispatchEvent(customHoverEvent);
  });
});

// 父元素上的委托監聽器
document.getElementById('container').addEventListener('item-hover', (e) => {
console.log('Delegated hover event:', e.detail.itemId, e.detail.action);
});
  • 雖然不直接與事件委托相關,MutationObserver允許你對DOM樹的變化做出反應,例如元素被添加或移除。在極少數邊緣情況下,如果你需要為動態添加且不冒泡的元素附加監聽器,而其他技術不起作用,你可以使用MutationObserver檢測新元素并將監聽器綁定到它們。

然而,這重新引入了事件委托旨在避免的處理開銷。因此,僅在其他所有選項都窮盡時才使用此方法,作為最后的手段:

const observer = newMutationObserver((mutationsList) => {
for (const mutation of mutationsList) {
    if (mutation.type === 'childList') {
      mutation.addedNodes.forEach(node => {
        if (node.nodeType === 1 && (node.tagName === 'INPUT' || node.querySelector('input'))) {
          const inputElement = node.tagName === 'INPUT' ? node : node.querySelector('input');
          if (inputElement) {
            inputElement.addEventListener('focus', () => {
              console.log('Focus (individual listener):', inputElement.id);
            });
          }
        }
      });
    }
  }
});

observer.observe(document.body, { childList: true, subtree: true });

由于附加許多單個監聽器的性能影響,這通常不被推薦。盡可能使用focusin/focusout。

框架中的事件委托

現代JavaScript框架通常會優化并利用事件委托等技術,即使它們抽象了DOM事件及其相關操作。

React如何實現委托

每個瀏覽器都有其管理原生事件的方式,因此React創建了其事件委托策略,稱為合成事件系統。該系統展示了高級事件委托技術。

例如,在React 17之前,大多數事件監聽器(如onClick和onChange)都與document關聯,React的合成事件系統會在那里攔截和處理它們。在標準化和重新分發它們到相關組件后,React會觸發原生事件。這是一種高效的事件委托,因為只有少數監聽器附加到document的更高層級。

React的合成事件系統確保跨瀏覽器的行為一致,即使對于復雜、深度嵌套的結構也是如此(請參閱我們關于比較React樹組件的指南)。

React 17+和React 18+的變化

  • React 17——React不再將事件附加到document。現在它將它們附加到React樹掛載的根DOM容器(例如root.render(<App />)將監聽器添加到<div id="root">>)。這旨在改進React應用的漸進式升級支持(在同一頁面上運行多個React版本)以及依賴文檔級事件處理器的非React應用和框架。它仍然是委托,因為React仍然在不同的地方分發事件處理,但React委托事件的位置發生了變化
  • React 18——通過實現自動批處理進一步優化了合成事件系統。這不是事件委托的更改,但它使用事件系統將單個事件引起的多個狀態更新合并為一個更新和一個重新渲染。React仍然委托大量事件內部架構以提高性能和跨瀏覽器的兼容性

Vue、Svelte和Angular的比較

每個框架都以自己的細微差別處理事件處理和委托:

框架

事件綁定語法

事件處理方式

手動委托需求

備注

Vue

@click

v-on:click

使用標準DOM監聽器,Vue通過其響應式系統高效地附加和分離它們

不總是需要,但對高度動態列表很有用

Vue的虛擬DOM自動處理大多數委托

Svelte

on:click

編譯為原生事件監聽器,針對直接目標

通常不需要,但對大型動態列表可能有所幫助

無運行時;稀疏動態輸出減少委托需求

Angular

(click)

使用原生DOM監聽器;變更檢測使DOM更新平滑

如果動態輸出導致問題,大型列表可選

HostListener

支持監聽宿主或全局目標并啟用委托

結論

事件委托通過將單個監聽器附加到父元素來簡化事件處理。當子元素觸發事件時,它會冒泡到父元素,減少內存使用并簡化代碼。

這種技術在管理大型相似元素集(如列表項或按鈕,尤其是動態生成的)時效果顯著。父監聽器可以處理新添加元素的事件,無需額外配置。

并非所有事件都會冒泡——focus、blur、mouseenter和mouseleave是例外。對于這些事件,使用focusin、focusout或自定義冒泡事件的替代方案。

要識別觸發事件的確切元素,請依賴event.target。除非絕對必要,否則避免使用stopPropagation(),因為它會阻止事件到達你的委托處理程序。

在處理Shadow DOM時,事件可能不會按預期冒泡,使用composed標志允許它們通過陰影邊界。

責任編輯:武曉燕 來源: 前端小石匠
相關推薦

2021-08-08 08:17:45

事件響應日志網絡安全

2021-03-15 23:11:12

內存虛擬化技術

2013-05-02 09:16:16

程序員

2019-11-15 10:41:10

Vim分屏終端

2013-12-19 10:08:52

AWS服務器

2017-12-29 08:16:43

2024-10-16 10:50:00

2013-06-14 13:27:36

內存Linux交換分區

2024-07-25 12:33:45

2016-11-25 15:03:33

FacebookWIFI

2024-12-09 16:00:00

代碼引用

2018-11-22 14:34:01

局域網IP擴容

2017-03-23 11:24:26

Windows 10Windows系統盤

2013-10-23 14:28:30

2013-08-08 10:27:03

云計算

2020-11-12 07:47:18

程序員管理時間

2015-07-16 15:16:41

內存泄露解決辦法

2024-04-10 08:00:00

點贊
收藏

51CTO技術棧公眾號

黄色小视频在线观看| 日本三级一区二区| 免费看日产一区二区三区| 亚洲综合av网| 欧美一区视久久| 一卡二卡三卡在线| 欧美精品一线| 夜夜嗨av一区二区三区四区| 国产999免费视频| 欧美办公室脚交xxxx| 中文字幕中文字幕一区| 国产一区二区三区av在线| 伊人免费在线观看| 亚洲精品黄色| 操日韩av在线电影| 亚洲v国产v欧美v久久久久久| 日韩中文字幕无砖| 在线观看亚洲一区| 国产伦精品一区二区三区四区视频_| av午夜在线| yourporn久久国产精品| 成人免费视频网| 在线免费观看国产精品| 国内综合精品午夜久久资源| 中文字幕日韩欧美| 亚洲第一页av| 国偷自产视频一区二区久| 欧美日韩国产高清一区二区三区 | 亚洲片av在线| 国产国语老龄妇女a片| 巨大黑人极品videos精品| 天天亚洲美女在线视频| 欧美一级中文字幕| 免费大片黄在线观看视频网站| 2023国产一二三区日本精品2022| 超碰97在线资源| 国产又黄又大又粗的视频| 日韩1区2区日韩1区2区| 91成人国产在线观看| 国产一级aa大片毛片| 中文字幕日韩一区二区不卡| 日韩亚洲综合在线| 精品一区二区6| 精品国产乱码| 国产亚洲欧洲高清一区| av中文字幕免费观看| 欧美wwwsss9999| 亚洲电影免费观看高清| 26uuu国产| 99精品国产高清一区二区麻豆| 制服丝袜成人动漫| 国产又粗又长又爽又黄的视频| 久久久久久久性潮| 欧美日韩1234| 亚洲18在线看污www麻豆| 久久亚洲人体| 91精品国产综合久久精品图片 | 中文字幕激情小说| 午夜综合激情| 日本亚洲精品在线观看| 波多野结衣一二区| 日本中文字幕一区二区有限公司| 国产精品99久久久久久人 | 中国一级片在线观看| 色狮一区二区三区四区视频| 色老头一区二区三区| 翔田千里88av中文字幕| 在线中文一区| 欧美极品少妇全裸体| 日韩美女黄色片| 久久福利毛片| 国产精品免费福利| 国产精品人人妻人人爽| 岛国精品在线播放| 蜜桃狠狠色伊人亚洲综合网站| 激情小视频在线| 国产精品你懂的| 国产在线无码精品| 久草在线资源福利站| 色婷婷综合久久久| 国内自拍第二页| www.久久东京| 亚洲欧美国产va在线影院| 你懂得视频在线观看| 一本一本久久a久久综合精品| 久久久久久久国产精品视频| www亚洲视频| 精品制服美女丁香| 国产精品污www一区二区三区| 欧美日韩国产综合视频| 国产日韩欧美一区二区三区乱码| 日本一级淫片演员| 在线最新版中文在线| 欧美日韩亚洲综合| 丝袜熟女一区二区三区| 国产日产精品_国产精品毛片| 日韩视频欧美视频| 91国产丝袜播放在线| 蜜桃久久久久久久| 国内精品二区| 黄网站在线免费看| 欧美日韩在线看| 999久久久精品视频| 欧美成人午夜77777| 有码中文亚洲精品| www.av视频在线观看| 奇米影视7777精品一区二区| 国产精品白丝jk白祙| 91大神在线网站| 精品女同一区二区三区在线播放| 午夜视频在线网站| 一区二区小说| 久久久久久久久亚洲| 亚洲在线精品视频| 久久久久久影视| 日韩一级性生活片| 国产午夜久久av| 中文一区二区视频| 亚洲精品男人的天堂| 国产成人99久久亚洲综合精品| 色综合久久88色综合天天提莫| 波多一区二区| 91精品国产一区二区| 少妇视频在线播放| 亚洲一卡久久| 黑人中文字幕一区二区三区| 在线免费观看a视频| 精品视频在线看| 韩国女同性做爰三级| 国产欧美午夜| 国产美女在线精品免费观看| www视频在线免费观看| 欧美视频一区二区三区四区| 亚洲精品国产91| 国产日韩精品视频一区二区三区 | 亚洲精品国产片| 亚洲免费在线观看视频| 欧美性受xxxxxx黑人xyx性爽| 精品国产一区二区三区av片| 日本国产一区二区三区| 亚洲av成人精品一区二区三区在线播放 | 惠美惠精品网| 亚洲精品国产精品乱码不99按摩 | 99久久婷婷国产综合| 精品影院一区二区久久久| 日本成人三级| 久久久成人av毛片免费观看| 国产香蕉97碰碰久久人人| 无码人妻精品一区二区三区蜜桃91| 97se亚洲国产综合自在线观| 波多野结衣之无限发射| 琪琪久久久久日韩精品| 1769国产精品| 男人天堂亚洲二区| 色天使久久综合网天天| 亚洲色成人网站www永久四虎| 日韩高清在线观看| 亚洲v国产v| av日韩在线免费观看| 精品综合久久久久久97| 丁香六月天婷婷| 五月婷婷久久综合| 无码人妻aⅴ一区二区三区| 天堂影院一区二区| 日韩伦理一区二区三区av在线| 国产一区二区三区朝在线观看| 中文字幕日韩欧美| av免费在线不卡| 亚洲一二三区在线观看| 少妇户外露出[11p]| 日韩有码一区二区三区| 一区二区成人国产精品 | 7777精品伊人久久久大香线蕉| 永久免费看黄网站| 波多野结衣亚洲一区| 国产亚洲天堂网| 欧美国产一区二区三区激情无套| 亚洲综合自拍一区| 多野结衣av一区| 一区二区成人精品| 国产人妖一区二区| 亚洲大型综合色站| 人妻少妇无码精品视频区| 国产一区二区三区国产| 国产中文字幕在线免费观看| 欧美精品羞羞答答| 999国产在线| 都市激情综合| 欧美精品免费在线观看| 色综合久久网女同蕾丝边| 欧美日韩高清一区二区三区| 精品人妻在线播放| 国产精品麻豆欧美日韩ww| 亚洲欧美激情一区二区三区| 久久精品三级| 免费看日b视频| 美女久久久久| 91黄色精品| 成人亚洲综合| 国语对白做受69| 欧美被日视频| 亚洲乱码av中文一区二区| 99在线无码精品入口| 欧美性极品少妇精品网站| 国产免费一区二区三区四区| 99精品黄色片免费大全| 午夜福利123| 日韩电影在线观看一区| 波多野结衣综合网| 中文字幕一区二区三区在线视频| 欧美性色黄大片人与善| 高清日韩中文字幕| 国产精品一区二区三区毛片淫片| 123区在线| 久久69精品久久久久久久电影好| 国产色a在线| 亚洲国产日韩欧美在线图片 | 快播电影网址老女人久久| 欧美激情啊啊啊| 国产精品剧情| 中日韩美女免费视频网站在线观看 | 国产精品久久久久久久久夜色| 一区二区理论电影在线观看| 91久久久久久久久久久久久久 | 激情欧美一区二区| 超碰影院在线观看| 99精品国产一区二区青青牛奶| 欧美aaa在线观看| 日韩影院二区| 亚洲国产一区二区精品视频| 国产精品免费大片| 欧美国产综合视频| 亚洲国产最新| 玛丽玛丽电影原版免费观看1977 | 国产精品久久久久久久久免费高清 | 国产精品69毛片高清亚洲| 香港日本韩国三级网站| 日韩av一区二区三区| 免费日韩视频在线观看| 免费视频久久| 国产一级不卡毛片| 丝袜亚洲精品中文字幕一区| 成人免费无码av| 久久久久久久波多野高潮日日| 国产成人无码精品久久久性色| 影音先锋亚洲精品| 日韩中字在线观看| 亚洲青涩在线| 国产精品后入内射日本在线观看| 亚洲精品少妇| 日本精品一区二区三区四区| 久久国产日本精品| 一区二区三区视频在线观看免费| 美女久久久精品| 日韩一区二区三区久久| 韩国三级中文字幕hd久久精品| 久久无码人妻一区二区三区| 国产精品综合av一区二区国产馆| 美女日批在线观看| 成人av在线资源网站| 国产在线观看无码免费视频| 久久久午夜精品| 国产真人真事毛片视频| 亚洲欧美日韩中文播放 | 老司机午夜精品视频| 五月婷婷六月合| 极品少妇一区二区| 亚洲一区和二区| 91在线观看一区二区| 美女被到爽高潮视频| 国产精品乱码一区二三区小蝌蚪| 99鲁鲁精品一区二区三区| 亚洲午夜视频在线| 日韩特级黄色片| 欧美日韩高清一区| 亚洲美女福利视频| 亚洲精品视频在线播放| 自拍视频在线免费观看| 欧美精品在线第一页| 欧美巨大丰满猛性社交| 国产精品亚洲综合天堂夜夜| 日韩精品一区二区三区中文在线| 国内外成人免费视频| 精品国产一区二区三区香蕉沈先生| 一区在线电影| 日韩视频三区| 在线观看日本一区二区| 成人午夜精品一区二区三区| 国产精品久久久久无码av色戒| 国产精品国产自产拍高清av王其| 精品亚洲永久免费| 欧美优质美女网站| 性生活免费网站| 国产午夜一区二区| xxxx视频在线| 成人黄色免费在线观看| 欧美福利在线播放网址导航| 一区二区三区电影| 亚洲一区国产一区| ass极品水嫩小美女ass| 国产清纯白嫩初高生在线观看91 | 永久免费未视频| 日韩欧美精品中文字幕| 午夜老司机福利| 精品国产一区二区三区四区在线观看 | 欧美电影《睫毛膏》| 青青草成人免费在线视频| 久久av老司机精品网站导航| 中文字幕高清视频| 亚洲一区二区四区蜜桃| 一级做a爱片性色毛片| 亚洲欧美日韩区| h片在线观看| 91视频-88av| 日韩欧美中字| 日韩精品免费播放| 99综合电影在线视频| 中文字幕影音先锋| 欧美精品亚洲二区| 成人在线免费电影| 欧美在线观看网站| 久本草在线中文字幕亚洲| 三上悠亚免费在线观看| 美女一区二区久久| 国产一区二区三区精品在线| 欧美日韩国产激情| 免费激情视频网站| 欧美疯狂性受xxxxx另类| 成人短视频软件网站大全app| 亚洲精品tv久久久久久久久| 三级久久三级久久| 无码人妻精品一区二区中文| 精品久久久久人成| 手机看片福利永久| 久久久久久亚洲精品中文字幕 | 欧洲国产精品| 久久久www| 蜜桃精品一区二区| 欧美午夜丰满在线18影院| 婷婷久久久久久| 欧美中文在线观看| 亚洲激情77| 三级4级全黄60分钟| 国产三级精品在线| 免费看污视频的网站| 这里只有精品视频在线| 亚洲电影有码| 一级日韩一区在线观看| 国产一区二区在线影院| 欧美成人黄色网| 亚洲成人av在线| 精精国产xxxx视频在线播放| 精品一区二区国产| 久久夜色精品| 青青草华人在线视频| 欧美精品丝袜久久久中文字幕| 老司机午夜在线| 亚洲www视频| 狠狠干综合网| 黄瓜视频污在线观看| 欧美亚一区二区| 精品国产丝袜高跟鞋| yy111111少妇影院日韩夜片| 亚洲国产午夜| 中文字幕在线观看免费高清| 欧美三日本三级三级在线播放| 免费大片黄在线观看视频网站| 99精品99久久久久久宅男| 日韩视频三区| 貂蝉被到爽流白浆在线观看| 日韩一区二区三区在线| 999av小视频在线| 日韩中文一区二区三区| 国产中文字幕精品| 亚洲精品午夜久久久久久久| 亚洲欧美资源在线| 高清久久精品| 日韩精品 欧美| 国产精品看片你懂得| 亚洲女同志亚洲女同女播放| 奇米4444一区二区三区| 国产精品国产一区| 亚洲中文字幕无码一区| 在线观看成人免费视频| 在线看女人毛片| 欧美日韩另类综合| 国产麻豆日韩欧美久久| 亚洲欧美自拍视频| 久久成人精品一区二区三区| 亚洲婷婷丁香| 午夜免费视频网站| 色婷婷亚洲综合| 92久久精品| 一本色道婷婷久久欧美| 97久久精品人人澡人人爽| 国产日韩欧美中文字幕| 欧洲成人午夜免费大片| 欧美精品国产一区| 亚洲一二三精品| 日韩成人在线电影网|