欧美精品在线一区二区三区_亚洲女同精品视频_日韩一区免费_国产欧美久久久精品免费_国产这里只有精品_僵尸再翻生在线观看_久久99精品国产一区二区三区_亚洲免费一区二区_女教师淫辱の教室蜜臀av软件_中文字幕国产一区二区

[EX]事件捕獲,事件冒泡,事件委托

2018-4-17    seo達人

如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

1事件流

JavaScript與HTML之間的交互是通過事件實現的。事件,就是文檔或瀏覽器窗口中發生的一些特定的交互瞬間。可以使用偵聽器來預訂事件,以便事件發生時執行相應的代碼。 
 
事件流的起源:就是在瀏覽器發展到第四代的時候,瀏覽器開發團隊遇到一個問題:頁面的哪一部分會擁有某個特定的事件?要明白這個問題問的是什么,可以想象畫在一張紙上的一組同心圓。如果你把手指放在圓心上,那么你的手指指向的不是一個圓,而是紙上的所有圓。也就是說如果單擊了頁面的某個按鈕,同時也單擊了按鈕的容器元素,甚至單擊了整個頁面。不過呢,IE提出的是冒泡流,而網景提出的是捕獲流。

示例:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>事件流</title> <style type="text/css"> #content{width: 150px;height: 150px;background-color: red;} #btn{width: 80px;height: 80px;background-color: green;} </style> </head> <body> <div id="content">content <div id="btn">button</div> </div> <script type="text/javascript"> var content = document.getElementById("content"); var btn = document.getElementById('btn');
        btn.onclick = function(){ alert("btn");
        };
        content.onclick = function(){ alert("content");
        };
        document.onclick = function(){ alert("document");
        } </script> </body> </html>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

如果點擊容器#btn,則彈出的順序是:btn-content-document;如果點擊的是容器#content,則彈出的是content-document;如果點擊的是document,彈出的是document。

由此可以看出JavaScript的事件流機制

前面說過,IE提出的是冒泡流,而網景提出的是捕獲流,后來在W3C組織的統一之下,JS支持了冒泡流和捕獲流,但是目前低版本的IE瀏覽器還是只能支持冒泡流(IE6,IE7,IE8均只支持冒泡流),所以為了能夠兼容更多的瀏覽器,建議大家使用冒泡流。

JS事件流原理圖如下: 
 
這里寫圖片描述 


2事件冒泡與事件捕獲

由此可以知道:

1、一個完整的JS事件流是從window開始,最后回到window的一個過程

2、事件流被分為三個階段(1~5)捕獲過程、(5~6)目標過程、(6~10)冒泡過程

示例:

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> #wrapDiv, #innerP, #textSpan{ margin: 5px;padding: 5px;box-sizing: border-box;cursor: default; } #wrapDiv{ width: 300px;height: 300px;border: indianred 3px solid; } #innerP{ width: 200px;height: 200px;border: hotpink 3px solid; } #textSpan{ display: block;width: 100px;height: 100px;border: orange 3px solid; } </style> </head> <body> <div id="wrapDiv">wrapDiv <p id="innerP">innerP <span id="textSpan">textSpan</span> </p> </div> <script> var wrapDiv = document.getElementById("wrapDiv"); var innerP = document.getElementById("innerP"); var textSpan = document.getElementById("textSpan"); // 捕獲階段綁定事件 window.addEventListener("click", function(e){ console.log("window 捕獲", e.target.nodeName, e.currentTarget.nodeName);
    }, true);

    document.addEventListener("click", function(e){ console.log("document 捕獲", e.target.nodeName, e.currentTarget.nodeName);
    }, true);

    document.documentElement.addEventListener("click", function(e){ console.log("documentElement 捕獲", e.target.nodeName, e.currentTarget.nodeName);
    }, true);

    document.body.addEventListener("click", function(e){ console.log("body 捕獲", e.target.nodeName, e.currentTarget.nodeName);
    }, true);

    wrapDiv.addEventListener("click", function(e){ console.log("wrapDiv 捕獲", e.target.nodeName, e.currentTarget.nodeName);
    }, true);

    innerP.addEventListener("click", function(e){ console.log("innerP 捕獲", e.target.nodeName, e.currentTarget.nodeName);
    }, true);

    textSpan.addEventListener("click", function(e){ console.log("textSpan 捕獲", e.target.nodeName, e.currentTarget.nodeName);
    }, true); // 冒泡階段綁定的事件 window.addEventListener("click", function(e){ console.log("window 冒泡", e.target.nodeName, e.currentTarget.nodeName);
    }, false);

    document.addEventListener("click", function(e){ console.log("document 冒泡", e.target.nodeName, e.currentTarget.nodeName);
    }, false);

    document.documentElement.addEventListener("click", function(e){ console.log("documentElement 冒泡", e.target.nodeName, e.currentTarget.nodeName);
    }, false);

    document.body.addEventListener("click", function(e){ console.log("body 冒泡", e.target.nodeName, e.currentTarget.nodeName);
    }, false);

    wrapDiv.addEventListener("click", function(e){ console.log("wrapDiv 冒泡", e.target.nodeName, e.currentTarget.nodeName);
    }, false);

    innerP.addEventListener("click", function(e){ console.log("innerP 冒泡", e.target.nodeName, e.currentTarget.nodeName);
    }, false);

    textSpan.addEventListener("click", function(e){ console.log("textSpan 冒泡", e.target.nodeName, e.currentTarget.nodeName);
    }, false); </script> </body> </html>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91

這個時候,如果點擊一下textSpan這個元素,控制臺會打印出這樣的內容: 
 
這里寫圖片描述

從上面所畫的事件傳播的過程能夠看出來,當點擊鼠標后,會先發生事件的捕獲

· 捕獲階段:首先window會獲捕獲到事件,之后document、documentElement、body會捕獲到,再之后就是在body中DOM元素一層一層的捕獲到事件,有wrapDiv、innerP。

· 目標階段:真正點擊的元素textSpan的事件發生了兩次,因為在上面的JavaScript代碼中,textSapn既在捕獲階段綁定了事件,又在冒泡階段綁定了事件,所以發生了兩次。但是這里有一點是需要注意,在目標階段并不一定先發生在捕獲階段所綁定的事件,而是先綁定的事件發生,一會會解釋一下。

· 冒泡階段:會和捕獲階段相反的步驟將事件一步一步的冒泡到window

上述代碼中的兩個屬性:e.target和e.currentTarget

target和currentTarget都是event上面的屬性,target是真正發生事件的DOM元素,而currentTarget是當前事件發生在哪個DOM元素上。

可以結合控制臺打印出來的信息理解下,目標階段也就是 target == currentTarget的時候。我沒有打印它們兩個因為太長了,所以打印了它們的nodeName,但是由于window沒有nodeName這個屬性,所以是undefined。

那可能有一個疑問,我們不用addEventListener綁定的事件會發生在哪個階段呢,我們來一個測試,順便再演示一下我在上面的目標階段所說的目標階段并不一定先發生捕獲階段所綁定的事件是怎么一回事。

<script>
    var wrapDiv = document.getElementById("wrapDiv"); var innerP = document.getElementById("innerP"); var textSpan = document.getElementById("textSpan"); // 測試直接綁定的事件到底發生在哪個階段
    wrapDiv.onclick = function(){
        console.log("wrapDiv onclick 測試直接綁定的事件到底發生在哪個階段")
    }; // 捕獲階段綁定事件
    window.addEventListener("click", function(e){
        console.log("window 捕獲", e.target.nodeName, e.currentTarget.nodeName); }, true); document.addEventListener("click", function(e){
        console.log("document 捕獲", e.target.nodeName, e.currentTarget.nodeName); }, true); document.documentElement.addEventListener("click", function(e){
        console.log("documentElement 捕獲", e.target.nodeName, e.currentTarget.nodeName); }, true); document.body.addEventListener("click", function(e){
        console.log("body 捕獲", e.target.nodeName, e.currentTarget.nodeName); }, true); wrapDiv.addEventListener("click", function(e){
        console.log("wrapDiv 捕獲", e.target.nodeName, e.currentTarget.nodeName); }, true); innerP.addEventListener("click", function(e){
        console.log("innerP 捕獲", e.target.nodeName, e.currentTarget.nodeName); }, true); textSpan.addEventListener("click", function(){
        console.log("textSpan 冒泡 在捕獲之前綁定的")
    }, false); textSpan.onclick = function(){
        console.log("textSpan onclick")
    }; textSpan.addEventListener("click", function(e){
        console.log("textSpan 捕獲", e.target.nodeName, e.currentTarget.nodeName); }, true); // 冒泡階段綁定的事件
    window.addEventListener("click", function(e){
        console.log("window 冒泡", e.target.nodeName, e.currentTarget.nodeName); }, false); document.addEventListener("click", function(e){
        console.log("document 冒泡", e.target.nodeName, e.currentTarget.nodeName); }, false); document.documentElement.addEventListener("click", function(e){
        console.log("documentElement 冒泡", e.target.nodeName, e.currentTarget.nodeName); }, false); document.body.addEventListener("click", function(e){
        console.log("body 冒泡", e.target.nodeName, e.currentTarget.nodeName); }, false); wrapDiv.addEventListener("click", function(e){
        console.log("wrapDiv 冒泡", e.target.nodeName, e.currentTarget.nodeName); }, false); innerP.addEventListener("click", function(e){
        console.log("innerP 冒泡", e.target.nodeName, e.currentTarget.nodeName); }, false); textSpan.addEventListener("click", function(e){
        console.log("textSpan 冒泡", e.target.nodeName, e.currentTarget.nodeName); }, false); </script>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

控制臺打印如下:

這里寫圖片描述

· textSpan是被點擊的元素,也就是目標元素,所有在textSpan上綁定的事件都會發生在目標階段,在綁定捕獲代碼之前寫了綁定的冒泡階段的代碼,所以在目標元素上就不會遵守先發生捕獲后發生冒泡這一規則,而是先綁定的事件先發生。 

[在目標元素上就不會遵守先發生捕獲后發生冒泡這一規則,而是先綁定的事件先發生。]

· 由于wrapDiv不是目標元素,所以它上面綁定的事件會遵守先發生捕獲后發生冒泡的規則。所以很明顯用onclick直接綁定的事件發生在了冒泡階段。


3事件綁定

1、直接獲取元素綁定:

element.onclick = function(e){
        // ... };
    
  • 1
  • 2
  • 3

優點:簡單和穩定,可以確保它在你使用的不同瀏覽器中運作一致;處理事件時,this關鍵字引用的是當前元素,這很有幫助。

缺點:只會在事件冒泡中運行一個元素一次只能綁定一個事件處理函數,新綁定的事件處理函數會覆蓋舊的事件處理函數;事件對象參數(e)僅非IE瀏覽器可用。


2、直接在元素里面使用事件屬性

3、W3C方法:

element.addEventListener('click', function(e){
        // ... }, false);
    
  • 1
  • 2
  • 3

優點:該方法同時支持事件處理的捕獲和冒泡階段;事件階段取決于addEventListener最后的參數設置:false (冒泡) 或 true (捕獲);在事件處理函數內部,this關鍵字引用當前元素;事件對象總是可以通過處理函數的第一個參數(e)捕獲;可以為同一個元素綁定你所希望的多個事件,同時并不會覆蓋先前綁定的事件

缺點:IE不支持,你必須使用IE的attachEvent函數替代。


IE下的方法:

element.attachEvent('onclick', function(){
        // ... });
    
  • 1
  • 2
  • 3

優點:可以為同一個元素綁定你所希望的多個事件,同時并不會覆蓋先前綁定的事件。 
 
缺點:IE僅支持事件捕獲的冒泡階段;事件監聽函數內的this關鍵字指向了window對象,而不是當前元素(IE的一個巨大缺點);事件對象僅存在與window.event參數中;事件必須以ontype的形式命名,比如,onclick而非click;僅IE可用,你必須在非IE瀏覽器中使用W3C的addEventListener。

注意:不是意味這低版本的ie沒有事件捕獲,它也是先發生事件捕獲,再發生事件冒泡,只不過這個過程無法通過程序控制。 


4解除事件

通用:

element.removeEventListener('click', function(e){
        // ... }, false);
    
  • 1
  • 2
  • 3

IE:

element.detachEvent('onclick', function(){
        // ... });
    
  • 1
  • 2
  • 3

5阻止事件傳播

在支持addEventListener()的瀏覽器中,可以調用事件對象的stopPropagation()方法以阻止事件的繼續傳播。如果在同一對象上定義了其他處理程序,剩下的處理程序將依舊被調用,但調用stopPropagation()之后任何其他對象上的事件處理程序將不會被調用。不僅可以阻止事件在冒泡階段的傳播,還能阻止事件在捕獲階段的傳播。

IE9之前的IE不支持stopPropagation()方法,而是設置事件對象cancelBubble屬性為true來實現阻止事件進一步傳播。

<script>
    var wrapDiv = document.getElementById("wrapDiv"); var innerP = document.getElementById("innerP"); var textSpan = document.getElementById("textSpan"); // 測試直接綁定的事件到底發生在哪個階段
    wrapDiv.onclick = function(){
        console.log("wrapDiv onclick 測試直接綁定的事件到底發生在哪個階段")
    }; // 捕獲階段綁定事件
    window.addEventListener("click", function(e){
        console.log("window 捕獲", e.target.nodeName, e.currentTarget.nodeName); }, true); document.addEventListener("click", function(e){
        console.log("document 捕獲", e.target.nodeName, e.currentTarget.nodeName); }, true); document.documentElement.addEventListener("click", function(e){
        console.log("documentElement 捕獲", e.target.nodeName, e.currentTarget.nodeName); }, true); document.body.addEventListener("click", function(e){
        console.log("body 捕獲", e.target.nodeName, e.currentTarget.nodeName); }, true); wrapDiv.addEventListener("click", function(e){
        console.log("wrapDiv 捕獲", e.target.nodeName, e.currentTarget.nodeName); // 在捕獲階段阻止事件的傳播
        e.stopPropagation(); }, true); innerP.addEventListener("click", function(e){
        console.log("innerP 捕獲", e.target.nodeName, e.currentTarget.nodeName); }, true); textSpan.addEventListener("click", function(){
        console.log("textSpan 冒泡 在捕獲之前綁定的")
    }, false); textSpan.onclick = function(){
        console.log("textSpan onclick")
    }; textSpan.addEventListener("click", function(e){
        console.log("textSpan 捕獲", e.target.nodeName, e.currentTarget.nodeName); }, true); // 冒泡階段綁定的事件
    window.addEventListener("click", function(e){
        console.log("window 冒泡", e.target.nodeName, e.currentTarget.nodeName); }, false); document.addEventListener("click", function(e){
        console.log("document 冒泡", e.target.nodeName, e.currentTarget.nodeName); }, false); document.documentElement.addEventListener("click", function(e){
        console.log("documentElement 冒泡", e.target.nodeName, e.currentTarget.nodeName); }, false); document.body.addEventListener("click", function(e){
        console.log("body 冒泡", e.target.nodeName, e.currentTarget.nodeName); }, false); wrapDiv.addEventListener("click", function(e){
        console.log("wrapDiv 冒泡", e.target.nodeName, e.currentTarget.nodeName); }, false); innerP.addEventListener("click", function(e){
        console.log("innerP 冒泡", e.target.nodeName, e.currentTarget.nodeName); }, false); textSpan.addEventListener("click", function(e){
        console.log("textSpan 冒泡", e.target.nodeName, e.currentTarget.nodeName); }, false); </script>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78

這里寫圖片描述

實際上我們點擊的是textSpan,但是由于在捕獲階段事件就被阻止了傳播,所以在textSpan上綁定的事件根本就沒有發生,冒泡階段綁定的事件自然也不會發生,因為阻止事件在捕獲階段傳播的特性,e.stopPropagation()很少用到在捕獲階段去阻止事件的傳播,大家就以為e.stopPropagation()只能阻止事件在冒泡階段傳播。 


6阻止事件的默認行為

e.preventDefault()可以阻止事件的默認行為發生,默認行為是指:點擊a標簽就轉跳到其他頁面、拖拽一個圖片到瀏覽器會自動打開、點擊表單的提交按鈕會提交表單等等,因為有的時候我們并不希望發生這些事情,所以需要阻止默認行為。

IE9之前的IE中,可以通過設置事件對象的returnValue屬性為false達到同樣的效果。

function cancelHandler(event){ var event=event||window.event;//兼容IE //取消事件相關的默認行為 if(event.preventDefault) //標準技術 event.preventDefault(); if(event.returnValue) //兼容IE9之前的IE event.returnValue=false; return false; //用于處理使用對象屬性注冊的處理程序 }
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

7事件委托

在JavaScript中,添加到頁面上的事件處理程序數量將直接關系到頁面的整體運行性能。導致這一問題的原因是多方面的。首先,每個函數都是對象,都會占用內存;內存中的對象越多,性能就越差。其次,必須事先指定所有事件處理程序而導致的DOM訪問次數,會延遲整個頁面的交互就緒時間。

對“事件處理程序過多”問題的解決方案就是事件委托。事件委托利用了事件冒泡,只指定一個事件處理程序,就可以管理某一類型的所有事件。例如,click事件會一直冒泡到document層次。也就是說,我們可以為整個頁面指定一個onclick事件處理程序,而不必給每個可單擊的元素分別添加事件處理程序。

在父級上定義了函數,當點擊目標時,會向上冒泡,到父級執行操作。每一個子元素,都會統一冒泡到父級然后執行。

<ul id="color-list"> <li>red</li> <li>yellow</li> <li>blue</li> <li>green</li> <li>black</li> <li>white</li> </ul>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

如果點擊頁面中的li元素,然后輸出li當中的顏色,我們通常會這樣寫:

(function(){
    var color_list = document.getElementById('color-list'); var colors = color_list.getElementsByTagName('li'); for(var i=0;i<colors.length;i++){ colors[i].addEventListener('click',showColor,false); }; function showColor(e){
        var x = e.target; alert("The color is " + x.innerHTML); }; })();
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

利用事件流的特性,我們只綁定一個事件處理函數也可以完成:

(function(){
    var color_list = document.getElementById('color-list'); color_list.addEventListener('click',showColor,false); function showColor(e){
        var x = e.target; if(x.nodeName.toLowerCase() === 'li'){
            alert('The color is ' + x.innerHTML); } } })();
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

事件委托還有一個好處就是添加進來的元素也能綁定事件:

沒有使用事件委托:

<body> <ul id="thl"> <li>001</li> <li>002</li> <li>003</li> </ul> <button onclick="fun()">touch</button> <script> var thl= document.getElementById('thl'); var aLi = thl.getElementsByTagName('li'); for (var i = 0; i < aLi.length; i++) {
      aLi[i].onclick = fn;
    } function fn (){ console.log(this.innerHTML);
    } function fun(){ var node=document.createElement("li"); var textnode=document.createTextNode("maomaoliang");
        node.appendChild(textnode);
        document.getElementById("thl").appendChild(node);
    } </script> </body>
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

使用了事件委托:

<script> var thl= document.getElementById('thl');
    thl.onclick = function(ev) { ev = ev || event; //兼容處理 var target = ev.target || ev.srcElement; //找到li元素 if (target.nodeName.toLowerCase() == 'li') {
              console.log(target.innerHTML);
         }
    }; function fun(){ var node=document.createElement("li"); var textnode=document.createTextNode("maomaoliang");
        node.appendChild(textnode);
        document.getElementById("thl").appendChild(node);
    } </script>
藍藍設計www.ocunn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 平面設計服務

日歷

鏈接

個人資料

藍藍設計的小編 http://www.ocunn.cn

存檔

国产呦小j女精品视频| 女女同性女同一区二区三区91| 国产午夜在线一区二区三区| 青青草在线视频免费观看| 91精品啪在线观看国产18| 一本大道久久精品懂色aⅴ| av一区二区三区免费| 青青青视频在线免费观看| 久久国产精品黑丝| 国产乱色国产精品免费视频| 伊人精品在线观看| 91看片就是不一样| 最新在线你懂的| 欧美激情第8页| 欧美色综合久久| 欧美亚洲另类在线一区二区三区| 丰满少妇乱子伦精品看片| 99精品在线免费观看| 国产欧美视频一区二区| 国产成人亚洲综合91精品| 亚欧洲乱码视频| 激情网站在线| 成人精品小蝌蚪| 国模极品一区二区三区| 丰满岳乱妇一区二区| 国产黄色在线观看| 国产成人8x视频一区二区| 欧美激情小视频| 久久久久久婷婷| 国产美女情趣调教h一区二区| 国产69精品久久99不卡| 久久理论片午夜琪琪电影网| 在线观看国产网站| 69av成人| 国产午夜亚洲精品午夜鲁丝片| 日韩美女毛茸茸| 三年中国中文观看免费播放| 91精品xxx在线观看| 中文字幕一区二区三区av| 亚洲影院高清在线| 粉嫩aⅴ一区二区三区| 韩国女主播一区二区三区| 欧美日韩午夜视频在线观看| 色99中文字幕| www黄色在线观看| 欧美性色综合| 亚洲欧洲成视频免费观看| 制服丝袜综合网| 免费网站黄在线观看| 国产成人在线电影| 欧美亚洲国产日本| 懂色av蜜臀av粉嫩av永久| 欧美另类一区二区| 美女午夜精品| 欧美日韩亚洲国产综合| h无码动漫在线观看| 国产污污在线观看| 奇米四色…亚洲| 欧美日韩国产成人| 亚洲精品国产一区黑色丝袜| 国内精品伊人| 午夜欧美视频在线观看| 亚洲欧洲一区二区| 四虎永久在线观看| 日韩av一区二区三区四区| 久久777国产线看观看精品| 黄色国产在线观看| 日本在线一区二区| 色综合久久综合| 奇米777四色影视在线看| 天海翼一区二区三区免费| 日本欧美在线观看| 91精品国产91久久久久久吃药| 中国美女黄色一级片| 91精品啪在线观看国产爱臀| 欧美网站大全在线观看| 人人妻人人添人人爽欧美一区| 免费在线国产| av一区二区不卡| 91青青草免费在线看| 中文字幕免费高清在线观看| 国产精品草草| 久久天天躁狠狠躁夜夜躁2014 | 黄色免费视频网站| 欧美v亚洲v综合v国产v仙踪林| 精品美女永久免费视频| 妺妺窝人体色www看人体| 欧美精品少妇| 91免费国产在线观看| 国产精品视频免费一区二区三区| 国产视频www| 日日夜夜精品免费视频| 欧美影院久久久| 国产精品500部| 亚洲国产精品日韩专区av有中文| 色噜噜狠狠狠综合曰曰曰88av| 李宗瑞91在线正在播放| av毛片精品| 精品久久久久av影院 | 久久亚洲导航| 亚洲第一激情av| 水蜜桃色314在线观看| 黄色在线免费| 亚洲精品视频观看| 激情五月六月婷婷| 日本福利在线| 亚洲免费av在线| 激情五月六月婷婷| 国产在线高清视频| 樱花影视一区二区| 日韩国产一级片| 青青草视频在线免费直播| 亚洲影院久久精品| 欧美精品自拍视频| av福利导福航大全在线| 精品人伦一区二区三区蜜桃网站| aa在线观看视频| 丰满诱人av在线播放| 精品久久久久久中文字幕| 北条麻妃69av| 九色porny自拍视频在线播放| 欧美日韩精品国产| 午夜国产一区二区三区| 成人免费网站www网站高清| 欧美色网一区二区| 色姑娘综合天天| 亚洲第一二区| 亚洲精品一区二三区不卡| 极品蜜桃臀肥臀-x88av| 国产一区二区三区不卡视频网站| 这里只有精品视频| 久久久精品视频免费观看| 888久久久| 8090成年在线看片午夜| 免费黄色一级大片| 蜜桃精品在线观看| av在线亚洲男人的天堂| 在线中文视频| 中文av一区二区| 精品免费久久久久久久| 不卡一本毛片| 欧美性猛片xxxx免费看久爱| 91精产国品一二三| 欧美激情99| 日韩视频精品在线| 久久露脸国语精品国产91| 国产精品资源| 91久久爱成人| 日韩大片b站免费观看直播| 中文字幕亚洲在| 日本免费黄视频| 国产第一亚洲| 亚洲精品色婷婷福利天堂| 波多野结衣喷潮| 狠狠爱www人成狠狠爱综合网| 国产精品精品一区二区三区午夜版 | 久久伊人久久| 国产亚洲精品成人av久久ww| 精国产品一区二区三区a片| 亚洲精品1区2区| 成人淫片在线看| 亚洲日本va中文字幕久久| 亚洲男帅同性gay1069| 欧美精品成人网| 国语精品视频| 色偷偷噜噜噜亚洲男人的天堂| 日本特黄一级片| 麻豆成人在线观看| 日本不卡一区二区三区视频| 性欧美ⅴideo另类hd| 欧美日韩大陆一区二区| 99久久久无码国产精品性| 一区二区三区网站| 国产综合视频在线观看| 在线成人福利| 亚洲成人动漫在线观看| 中文字幕在线播放一区二区| 国产麻豆一区二区三区精品视频| 8x海外华人永久免费日韩内陆视频| 国产福利小视频| 欧美激情一区二区| 人人爽人人av| 婷婷综合一区| 热久久这里只有精品| 天天干天天操av| 综合久久综合久久| 欧美一级特黄aaa| 欧美日韩激情| 国产免费一区二区三区在线观看| 欧美高清成人| 在线一区二区视频| 日韩免费成人av| 丝袜脚交一区二区| 亚洲春色在线| 天天综合网站| 日韩视频免费大全中文字幕| 国产女人高潮时对白| 国产精品伦一区二区三级视频| 成人免费在线观看视频网站| 九一精品国产| 国产精品美女久久| 国产在线黄色| 欧美日韩成人综合在线一区二区| 中日韩一级黄色片| 久久国产日韩欧美精品| 中文字幕色一区二区 | 91久久久久久久久久久久久| 成人不用播放器| 在线综合+亚洲+欧美中文字幕| www.99re7| 国产一区二区三区在线观看免费视频 | av资源站久久亚洲| 久久不射影院| 亚洲欧洲成视频免费观看| 一级片视频免费| 中文字幕一区二区在线观看| 三上悠亚 电影| 欧美日本一区| 麻豆亚洲一区| 日韩av超清在线观看| 久久久av电影| 无码国产精品高潮久久99| 五月天精品一区二区三区| 亚洲第一视频区| 精品在线你懂的| 热99这里只有精品| 一道在线中文一区二区三区| 成人性生交大片免费看小说 | 亚洲精品网站在线播放gif| 国产男人搡女人免费视频| 国产精品美女www爽爽爽| 麻豆av免费看| 免费亚洲视频| 亚洲av首页在线| 久久久久久久久久久久久久久久久久久久| 日本高清不卡在线| av免费在线一区二区三区| 精品国产免费久久| 一二三区中文字幕| 亚洲国产精品影院| 国产中文字幕久久| www.亚洲免费av| 日日干日日操日日射| 亚洲激情另类| 免费的av在线| 国产成人三级| 精品久久久久久一区二区里番| 中文字幕系列一区| 国产91精品黑色丝袜高跟鞋| 九色porny在线| 亚洲新中文字幕| 香蕉av一区二区三区| 欧美日韩中字一区| 久久久久在线视频| 一级中文字幕一区二区| 亚洲熟女毛茸茸| 91捆绑美女网站| 97人妻精品一区二区三区免费| 日本欧美加勒比视频| 国产男女激情视频| 国语自产精品视频在线看8查询8| 中国一区二区三区| 亚洲电影男人天堂| 久久一区二区精品| 欧美特黄不卡| 91九色蝌蚪嫩草| 国产成人免费| 国产欧美日韩高清| 久久久一本精品| 日本韩国在线不卡| 19禁羞羞电影院在线观看| 欧美精品激情blacked18| 亚洲成人影院麻豆| 播播国产欧美激情| аⅴ资源新版在线天堂| 亚洲性无码av在线| 在线黄色av| 亚洲另类图片色| 一区二区三区视频国产日韩| 亚洲国产精品久久久久秋霞不卡| 亚洲第一天堂影院| 制服丝袜av成人在线看| 91丨porny丨在线中文 | 久久久久久久久久97| 久久久久国色av免费看影院| 无码人妻精品一区二区三应用大全| 手机av在线免费观看| 一区二区三区不卡视频在线观看| 男人操女人的视频网站| 国产精品久久久久久久久免费相片| 成人性视频免费看| 国产精品午夜在线| 欧美大片xxxx| 日韩一区中文字幕| 538精品在线观看| 亚洲精品日产精品乱码不卡| 国产一级二级三级| 亚洲自拍另类综合| 午夜影院免费在线观看| 欧美日韩在线另类| 国产日韩在线免费观看| 欧美艳星brazzers| 国产情侣自拍小视频| 日韩一级黄色片| 香蕉视频911| 亚洲免费精彩视频| aaa在线观看| 欧美超级乱淫片喷水| 久久香蕉一区| 国产精品91久久久久久| 久久久久黄色| 国产精品一区二区你懂得| 牛牛影视久久网| 亚洲一区二区在线免费观看| 希岛爱理av一区二区三区| 久久久亚洲国产精品| 亚洲影音一区| 香蕉视频色在线观看| 成人一区二区三区| 国产大屁股喷水视频在线观看| 中文字幕日韩av资源站| 欧美三级韩国三级日本三斤在线观看| 精品久久久久久久大神国产| 一级做a爱片性色毛片| 欧美一区二区视频在线观看2022 | 国产福利短视频| 国产日韩欧美精品电影三级在线| 欧洲猛交xxxx乱大交3| 午夜精品aaa| 国产精品天天操| 亚洲国产一区二区三区四区| 狠狠色伊人亚洲综合网站l| 欧美老女人xx| 偷拍中文亚洲欧美动漫| 国产精品国产三级欧美二区| 曰本一区二区三区视频| a天堂资源在线观看| 亚洲专区免费| 香蕉久久久久久av成人| 国产欧美日产一区| 日韩三级免费看| 欧美久久久影院| 在线黄色.com| 欧美国产日韩一区二区| 日韩免费小视频| 久久精品国产美女| 91精品婷婷色在线观看| av在线网址导航| av不卡一区二区三区| 九九久久免费视频| 欧美午夜精品电影| 尤物视频网站在线观看| 久久久久久国产免费| 成人亚洲网站| 亚洲高清精品中出| 亚洲专区一区| 成年人网站免费看| 亚洲综合视频在线观看| 国产伦理一区二区| 国产性色av一区二区| 国产乱码午夜在线视频| 国产精品久久7| 一区二区三区四区电影| 三级黄色片免费观看| 久久精品在这里| 无码人妻一区二区三区免费| 亚洲第一页自拍| 成a人片在线观看| 99国产超薄肉色丝袜交足的后果| 不卡在线一区二区| 亚洲视频第二页| 久久色成人在线| 波多野结衣视频在线看| 日韩精品亚洲元码| sm在线观看| 美女黄毛**国产精品啪啪| 亚洲黄色大片| 国产精品300页| 亚洲国产一区视频| 亚洲 国产 欧美 日韩| 欧美国产日韩一区二区在线观看| 成人激情久久| 2019日韩中文字幕mv| 东方aⅴ免费观看久久av| 日韩和一区二区| 亚洲的天堂在线中文字幕| 欧美1—12sexvideos| 国产一区喷水| 一区二区久久| 人人爽人人爽人人片| 日本高清成人免费播放| 青青免费在线视频| 国产精品偷伦免费视频观看的| 精品在线播放| 想看黄色一级片| 一区二区三区欧美激情| 五月色婷婷综合| 日本亚洲欧洲色| 日韩精品永久网址| 精品无码av一区二区三区|