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

史上最詳細(xì)的JavaScript事件使用指南

開發(fā) 前端
事件流描述的是從頁面中接收事件的順序,IE和Netscape提出來差不多完全相反的事件流的概念,IE事件流是事件冒泡流,Netscape事件流是事件捕獲流。

 

事件流

事件流描述的是從頁面中接收事件的順序,IE和Netscape提出來差不多完全相反的事件流的概念,IE事件流是事件冒泡流,Netscape事件流是事件捕獲流。

事件冒泡

IE的事件流叫做事件冒泡,即事件開始時(shí)由最具體的元素(文檔中嵌套最深的那個(gè)節(jié)點(diǎn))接收,然后逐級(jí)向上(一直到文檔);如下代碼:

 

<p id = "p">
    <span id="span">
        <a id="aTag">事件測(cè)試</a>
    </span>
</p>

 

JS如下:

 

document.getElementById("aTag").addEventListener('click',aTag);
document.getElementById("span").addEventListener('click',span);
document.getElementById("p").addEventListener('click',p);
function aTag(e) {
    alert("點(diǎn)擊的是a標(biāo)簽");
}
function span(e) {
    alert("點(diǎn)擊的是span標(biāo)簽");
}
function p(e) {
    alert("點(diǎn)擊的是p標(biāo)簽");
}

 

當(dāng)單擊 “事件測(cè)試”文字后,那么click事件會(huì)按照如下順序傳播;

1)先打印出:點(diǎn)擊的是a標(biāo)簽

2) 再打印出:點(diǎn)擊的是span標(biāo)簽

3) 最后打印出:點(diǎn)擊的是p標(biāo)簽

4)  最后肯定是document文檔。

所有現(xiàn)代瀏覽器都支持事件冒泡。

事件捕獲:

事件捕獲與事件冒泡事件流正好相反的順序,事件捕獲的事件流是最外層逐級(jí)向內(nèi)傳播,也就是先document,然后逐級(jí)p標(biāo)簽 , span標(biāo)簽 , a標(biāo)簽;

上面的JS代碼改成如下:

 

document.getElementById("p").addEventListener('click',p,true);
document.getElementById("aTag").addEventListener('click',aTag,true);
document.getElementById("span").addEventListener('click',span,true);

 

第三個(gè)參數(shù)設(shè)置為true,即為捕獲事件,默認(rèn)為false;否則的話,事件流還是和上面的一樣,因?yàn)椴还苁窃贗E還是標(biāo)準(zhǔn)瀏覽器下,事件冒泡瀏覽器都支持的。

#p#

DOM事件流

DOM2級(jí)事件規(guī)定的事件流包括三個(gè)階段,分別是:事件捕獲階段,處于目標(biāo)階段和事件冒泡階段。示意圖就不畫了,具體的可以看看書。

DOM0級(jí)事件處理程序

如下代碼是DOM0級(jí)事件處理程序:

 

var btn = document.getElementById("btn");
btn.onclick = function(){
     alert("Clicked");
};

 

使用DOM0級(jí)方法指定的事件處理程序被認(rèn)為是元素的方法,處理程序是在元素的作用域進(jìn)行的,程序中this是引用的是當(dāng)前元素。

 

<p id="btn">btn</p>
var btn = document.getElementById("btn");
btn.onclick = function(){
    alert(this.id); // 彈出btn
}

 

單擊元素btn后,通過this.id取得元素的屬性id,還可以通過this訪問元素的任何屬性和方法,以這種方式添加的事情處理程序在事件流的冒泡階段處理。

也可以刪除通過DOM0級(jí)方法指定的事件處理程序,只要將事件處理程序的屬性值設(shè)置為null即可。

btn.onclick = null; // 刪除事件處理程序;

如下JS代碼改成如下:

 

var btn = document.getElementById("btn");
btn.onclick = function(){
    alert(this.id);
}
btn.onclick = null;

 

再單擊btn后,沒有任何反應(yīng);

DOM2級(jí)事件處理程序

DOM2級(jí)事件定義了2個(gè)方法,用于處理指定和刪除事件處理程序的操作;

addEventListener()和removeEventListener()。所有DOM節(jié)點(diǎn)都包含這兩個(gè)方法,他們包含三個(gè)參數(shù),第一個(gè) 參數(shù)為事件類型;第二個(gè)參數(shù)為事件函數(shù),第三個(gè)參數(shù)為布爾值,如果是true的話,說明是事件流是捕獲事件,如果是false的話,那么事件流是冒泡事 件;

比如如上的btn代碼,我們改成如下:

 

var btn = document.getElementById("btn");
btn.addEventListener('click',function(e){
    alert(this.id);
},false);

 

上面的點(diǎn)擊事件是在冒泡階段被觸發(fā),與DOM0級(jí)方法一樣,這里添加的事件處理程序也是在其依副的元素作用域中運(yùn)行,使用DOM2級(jí)添加事件處理程序的好處是可以添加多個(gè)事件處理程序,如下代碼:

 

var btn = document.getElementById("btn");
btn.addEventListener('click',function(e){
    alert(this.id);
},false);
btn.addEventListener('click',function(e){
    alert("我是來測(cè)試的");
},false);

 

上面的代碼被彈出2次對(duì)話框,而在DOM0級(jí)是不可以的;它永遠(yuǎn)是執(zhí)行最后一次的。

addEventListener添加的事件只能使用removeEventListener來刪除相對(duì)應(yīng)的事件,那么如上的JS不能按照上面的方式來編寫哦!需要給定義一個(gè)函數(shù);如下:

 

btn.addEventListener('click',handler,false);
function handler(e){
   alert(this.id);
}

 

可以使用如下方式對(duì)click事件刪除;如下代碼:

btn.removeEventListener(‘click’,handler);

上面的是在標(biāo)準(zhǔn)瀏覽器下處理的事件,下面我們來看看在IE下處理的事件;

#p#

IE事件處理的程序

IE實(shí)現(xiàn)了與DOM類似的2個(gè)方法,分別是attachEvent()和detachEvent(),這兩個(gè)方法只接受2個(gè)參數(shù),第一個(gè)參數(shù)是事件 名稱,第二個(gè)參數(shù)是要處理的函數(shù);由于IE8及更早版本只支持事件冒泡,所以通過attachEvent()添加的事件處理程序會(huì)被添加到冒泡階段;

下面是IE事件處理程序的代碼如下:

 

btn.attachEvent('onclick',handler);
function handler(e){
    alert(this); // window
}

 

注意:attachEvent的事件名稱是onclick,而addEventListener的事件名稱是click,且IE中使用的 attachEvent()與使用DOM0級(jí)方法的的主要區(qū)別在于事件處理程序的作用域,在使用dom0級(jí)情況下,事件處理程序在其所屬元素的作用域內(nèi)運(yùn) 行,在使用attachEvent()方法的情況下,事件處理程序在全局作用域下運(yùn)行,其中的this等于window。

與addEventListener一樣,attachEvent也可以注冊(cè)多個(gè)點(diǎn)擊click事件,如下代碼:

 

btn.attachEvent('onclick',function(e){
    alert("1");
});
btn.attachEvent('onclick',function(e){
    alert("2");
});

 

但是與Dom方法不同的是,這些事件處理程序不是以添加他們的順序執(zhí)行,而是以相反的順序觸發(fā),比如如上代碼,會(huì)先彈出2,然后彈出1對(duì)話框;

使用attachEvent注冊(cè)的事件只能使用detachEvent()方法來移除;

下面我們可以來編寫跨瀏覽器的事件處理程序;代碼如下:

 

var EventUtil = {
    addHandler: function(element,type,handler) {
        if(element.addEventListener) {
                        element.addEventListener(type,handler,false);
        }else if(element.attachEvent) {
                    element.attachEvent("on"+type,handler);
        }else {
            element["on" +type] = handler;
        }
    },
    removeHandler: function(element,type,handler){
        if(element.removeEventListener) {
                    element.removeEventListener(type,handler,false);
        }else if(element.detachEvent) {
                    element.detachEvent("on"+type,handler);
        }else {
            element["on" +type] = null;
        }
    }
};

 

下面我們可以使用這個(gè)封裝的函數(shù)代碼來測(cè)試之前的代碼了,代碼改成如下所示:

 

function handler(){
    alert(1);
}
EventUtil.addHandler(btn,'click',handler);

 

在IE或者標(biāo)準(zhǔn)瀏覽器下都會(huì)彈出1;如果我們需要移除click事件的話,我們可以使用如下代碼:

EventUtil.removeHandler(btn,’click’,handler);

然后在標(biāo)準(zhǔn)瀏覽器下或者IE下點(diǎn)擊btn元素都沒有反應(yīng);

事件對(duì)象:

在觸發(fā)DOM上的某個(gè)事件時(shí),會(huì)產(chǎn)生一個(gè)事件對(duì)象event,這個(gè)對(duì)象中包含著所有與事件有關(guān)的信息;包括導(dǎo)致事件的元素,事件的類型以及其他與特定事件相關(guān)的信息。我們來看看dom0級(jí)和dom2級(jí)的事件對(duì)象Event;

比如如下代碼:

 

var btn = document.getElementById("btn");
btn.onclick = function(e){
    console.log(e);
}

 

打印如下:

下面我們來看看最基本的成員的含義吧;如下:

屬性/方法 類型 含義
bubbles Boolean 事件是否冒泡
cancelable Boolean 是否可以取消事件的默認(rèn)行為
currentTarget Boolean 事件處理程序當(dāng)前正在處理事件的那個(gè)元素
defaultPrevented Boolean 為true 表示已經(jīng)調(diào)用了preventDefault()
detail Integer 與事件相關(guān)的細(xì)節(jié)信息
eventPhase Integer 調(diào)用事件處理程序的階段:1表示捕獲階段,2表示“處于目標(biāo)”,3表示冒泡階段
preventDefault() Function 取消事件的默認(rèn)行為。如果cancelable是true,則可以使用這個(gè)方法
stopImmediatePropagation() Function 取消事件的進(jìn)一步捕獲或冒泡,同時(shí)阻止任何事件處理程序被調(diào)用
stopPropagation() Function 取消事件的進(jìn)一步捕獲或冒泡。如果bubbles為true,則可以使用這個(gè)方法
target Element 事件的目標(biāo)
type String 被觸發(fā)的事件的類型
view AbstractView 與事件關(guān)聯(lián)的抽象視圖。等同于發(fā)生事件的window對(duì)象

#p#

理解currentTarget與target

在事件處理程序內(nèi)部,this始終等于currentTarget值,即currentTarget是指當(dāng)前被觸發(fā)或者說正在處理事件的那個(gè)元素, 而target是指當(dāng)前的目標(biāo)元素;比如如下代碼,對(duì)btn按鈕觸發(fā)點(diǎn)擊事件,那么e.currentTraget指向了this,e.target也指 向了this;如下代碼:

 

var btn = document.getElementById("btn");
btn.onclick = function(e){
    console.log(e.currentTarget == this); // true
    console.log(e.target == this);  // true
}

 

但是如果我對(duì)document.body觸發(fā)點(diǎn)擊的話,那么e.currentTarget就指向了document.body了,那么e.target 指向與 btn那個(gè)元素了,如下代碼:

 

document.body.onclick = function(e){
    console.log(e.currentTarget === document.body); // true
    console.log(document.body === this);  // true
    console.log(e.target === document.getElementById("btn")); //true
};

 

現(xiàn)在應(yīng)該能理解currentTarget與target的區(qū)別吧!currentTarget就是指被點(diǎn)擊的那個(gè)元素,但是target是當(dāng)前點(diǎn) 擊的目標(biāo)元素,如上代碼,由于btn上并沒有注冊(cè)事件,結(jié)果click事件就冒泡到了document.body,在那里事件才得到了處理。

理解標(biāo)準(zhǔn)瀏覽器下的事件對(duì)象與IE下的事件對(duì)象

標(biāo)準(zhǔn)瀏覽器下的事件對(duì)象是event,比如btn點(diǎn)擊后;如下代碼:

 

var btn = document.getElementById("btn");
btn.onclick = function(){
    console.log(event); //標(biāo)準(zhǔn)瀏覽器下打印事件對(duì)象
    console.log(event.type);//'click'
}
btn.onclick = function(){
    // IE下打印的事件對(duì)象window.event
    console.log(window.event);
    console.log(window.event.type); // 'click'
 }

 

上面的寫法是在DOM0級(jí)上注冊(cè)事件,如果我們?cè)贒om2級(jí)上注冊(cè)事件的話,那么就會(huì)有一個(gè)事件對(duì)象event作為參數(shù)傳入事件到函數(shù)中,如下:

 

var btn = document.getElementById("btn");
EventUtil.addHandler(btn,'click',function(e){
    console.log(e);
});

 

理解特定事件的默認(rèn)行為事件

在標(biāo)準(zhǔn)瀏覽器下,在阻止特定事件的默認(rèn)行為,可以使用preventDefault()方法,比如如下,我點(diǎn)擊一個(gè)連接,按道理是打開一個(gè)新連接窗口,但是我使用preventDefault()方法可以阻止默認(rèn)行為,阻止打開新窗口;如下代碼:

 

HTML:<a href="http://www.baidu.com" id="alink" target="_blank">打開新連接</a>
JS如下:
var alink = document.getElementById("alink");
alink.onclick = function(e){
    console.log(e)
    e.preventDefault();
}

 

就可以阻止頁面進(jìn)行跳轉(zhuǎn)了~ 這是標(biāo)準(zhǔn)瀏覽器下處理方式,下面我們來看看IE是如何處理默認(rèn)事件的;

IE下使用returnValue屬性來取消給定事件的默認(rèn)行為,只要將returnValue屬性值設(shè)置為false即可,就可以阻止瀏覽器的默認(rèn)行為,如下代碼:

 

alink.onclick = function(){
    console.log(window.event)
    window.event.returnValue = false;
}

 

標(biāo)準(zhǔn)瀏覽器下與IE下的事件目標(biāo)的區(qū)別

標(biāo)準(zhǔn)瀏覽器下使用e.target來指定當(dāng)前被點(diǎn)擊的目標(biāo)元素,如下代碼所示:

 

var btn = document.getElementById("btn");
btn.onclick = function(){
    console.log(event); 
    console.log(event.target); // 打印事件目標(biāo)元素
}

 

IE下是使用event.srcElement來指定當(dāng)前的目標(biāo)元素,如下代碼:

 

btn.onclick = function(){
    console.log(event); 
    console.log(window.event.srcElement);
}

 

理解標(biāo)準(zhǔn)瀏覽器與IE下阻止事件傳播的區(qū)別

在標(biāo)準(zhǔn)瀏覽器下我們可以使用stopPropagation()方法來停止事件在DOM層次中的傳播,即取消事件中的冒泡或者捕獲。從而避免觸發(fā)注冊(cè)在document.body上面的事件處理程序,如下所示:

 

var btn = document.getElementById("btn");
btn.onclick = function(e){
    alert(1);
    e.stopPropagation();
}
document.body.onclick = function(){
    alert(2);
}

 

如上代碼,如果我不使用stopPropagation()阻止冒泡事件的話,那么在頁面中會(huì)先彈出1,然后彈出2,如果使用stopPropagation()方法的話,只會(huì)在頁面上彈出1,就不會(huì)冒泡到body上面去;

IE下停止冒泡的話,我們可以使用cancelBubble屬性,我們只要將此屬性設(shè)置為true,即可阻止事件通過冒泡觸發(fā) document.body中的注冊(cè)事件。但是IE是不支持捕獲事件的,但是stopPropagation()即支持捕獲事件又支持冒泡事件的。如下代 碼:

 

btn.onclick = function(e){
    alert(1);
    window.event.cancelBubble = true;
}
document.body.onclick = function(){
    alert(2);
}

 

如果不設(shè)置window.event.cancelBubble 為true的話,就會(huì)先彈出1,然后彈出2,如果加上的話,就只會(huì)彈出1對(duì)話框。

理解了上面的區(qū)別后,我們現(xiàn)在可以往EventUtil對(duì)象里面添加跨瀏覽器的方法了;

#p#

跨瀏覽器的事件對(duì)象

 

var EventUtil = {
    addHandler: function(element,type,handler) {
        if(element.addEventListener) {
            element.addEventListener(type,handler,false);
        }else if(element.attachEvent) {
            element.attachEvent("on"+type,handler);
        }else {
            element["on" +type] = handler;
        }
    },
    removeHandler: function(element,type,handler){
        if(element.removeEventListener) {
            element.removeEventListener(type,handler,false);
        }else if(element.detachEvent) {
            element.detachEvent("on"+type,handler);
        }else {
            element["on" +type] = null;
        }
    },
    getEvent: function(event) {
        return event ? event : window.event;
    },
    getTarget: function(event) {
        return event.target || event.srcElement;
    },
    preventDefault: function(event){
        if(event.preventDefault) {
            event.preventDefault();
        }else {
            event.returnValue = false;
        }
    },
    stopPropagation: function(event) {
        if(event.stopPropagation) {
            event.stopPropagation();
        }else {
            event.cancelBubble = true;
        }
    }
};

 

事件類型:

DOM3級(jí)事件規(guī)定了以下幾類事件;如下:

UI事件: 當(dāng)用戶與頁面上的元素交互時(shí)觸發(fā);

load事件:當(dāng)頁面加載完后(包括所有圖像,所有javascript文件,css文件等外部資源),就會(huì)觸發(fā)window上面的load事件,如下代碼是加載圖片的:

HTML代碼:<img src = “event.png” id=”img”/>

JS代碼如下:

 

var img = document.getElementById("img");
EventUtil.addHandler(img,'load',function(event){
      var event = EventUtil.getEvent(event);
      alert(EventUtil.getTarget(event).src);
});

 

當(dāng)圖片加載完后,就會(huì)彈出圖片的url地址了;

如果在創(chuàng)建新的img元素時(shí),可以為其指定一個(gè)事件處理程序,以便圖像加載完成后給出提示,此時(shí),最重要的是在指定src屬性之前先指定事件;如下代碼所示:

 

 EventUtil.addHandler(window,'load',function(){
    var img = document.createElement("img");
    EventUtil.addHandler(img,'load',function(e){
        e = EventUtil.getEvent(e);
        alert(EventUtil.getTarget(e).src);
    });
    document.body.appendChild(img);
    img.src = "event.png";
});

 

在圖像加載完成后,會(huì)彈出圖片地址了;

同樣的功能,我們可以使用DOM0級(jí)的Image對(duì)象來實(shí)現(xiàn),在DOM出現(xiàn)之前,開發(fā)人員經(jīng)常使用Image對(duì)象在客戶端預(yù)加載圖像,如下代碼:

 

EventUtil.addHandler(window,'load',function(){
    var img = new Image();
    EventUtil.addHandler(img,'load',function(e){
        alert(1);
    });
    img.src ="event.png";
});

 

Script元素也支持load事件,但是IE8及以下不支持,在IE9+,F(xiàn)irefox,Opera,chrome及Safari3+都支持, 以便開發(fā)開發(fā)人員確定動(dòng)態(tài)加載的javascript文件是否加載完畢;比如我們動(dòng)態(tài)創(chuàng)建script標(biāo)簽后,通過load事件判斷動(dòng)態(tài)創(chuàng)建的 script標(biāo)簽是否加載完畢,代碼如下:

 

EventUtil.addHandler(window,'load',function(){
    var script = document.createElement("script");
    EventUtil.addHandler(script,'load',function(e){
        alert(1);
    });
    script.src = "a.js";
    document.body.appendChild(script);
});

 

焦點(diǎn)事件:當(dāng)元素獲得或失去焦點(diǎn)時(shí)觸發(fā);

有:blur:在元素失去焦點(diǎn)時(shí)觸發(fā),這個(gè)事件不會(huì)冒泡,所有瀏覽器都支持。

foucs:在元素獲得焦點(diǎn)時(shí)觸發(fā),這個(gè)事件不會(huì)冒泡,所有瀏覽器都支持。

鼠標(biāo)事件:當(dāng)用戶通過鼠標(biāo)在頁面操作時(shí)觸發(fā);

  1. click事件:在用戶單擊鼠標(biāo)按鈕或者按下回車鍵觸發(fā);
  2. dblclick事件:在用戶雙擊鼠標(biāo)按鈕時(shí)被觸發(fā);
  3. mousedown事件:在用戶按下了任意鼠標(biāo)按鈕時(shí)被觸發(fā),不能通過鍵盤觸發(fā)這個(gè)事件。
  4. mouseenter事件:在鼠標(biāo)光標(biāo)從元素外部移動(dòng)到元素范圍之內(nèi)被觸發(fā);這個(gè)事件不冒泡;
  5. mousemove事件:當(dāng)鼠標(biāo)指針在元素內(nèi)部移動(dòng)時(shí)重復(fù)地觸發(fā)。
  6. mouseout事件:用戶將其移入另一個(gè)元素內(nèi)被觸發(fā)。
  7. mouseover事件:鼠標(biāo)指針在元素外部,用戶將移入另一個(gè)元素的邊界時(shí)觸發(fā),感覺和mouseenter事件類似;
  8. mouseup事件:用戶釋放鼠標(biāo)按鈕時(shí)觸發(fā);

頁面上所有的元素都支持鼠標(biāo)事件,除了mouseenter和mouseleave,所有鼠標(biāo)事件都會(huì)冒泡,也可以被取消,而取消鼠標(biāo)事件將會(huì)影響瀏覽器的默認(rèn)行為。

#p#

理解客戶區(qū)坐標(biāo)位置

含義是:鼠標(biāo)指針在可視區(qū)中的水平clientX和垂直clientY坐標(biāo);

如下圖所示:

代碼如下:

 

EventUtil.addHandler(btn,'click',function(e){
    e = EventUtil.getEvent(e);
    console.log("可視區(qū)X軸坐標(biāo)為:"+e.clientX + " "+ "可視區(qū)Y軸坐標(biāo)為:"+e.clientY);
});

 

注意:客戶區(qū)坐標(biāo)位置不包含滾動(dòng)條滾動(dòng)的位置,因此這個(gè)位置不代表鼠標(biāo)在頁面上的位置;

理解頁面坐標(biāo)位置pageX和pageY:

pageX與pageY是指頁面坐標(biāo)的位置,與clientX和clientY的區(qū)別是:它包含頁面滾動(dòng)條的位置,如下圖所示:

代碼如下:

 

EventUtil.addHandler(btn,'click',function(e){
    e = EventUtil.getEvent(e);
    console.log("頁面X軸坐標(biāo)為:"+e.pageX + " "+ "頁面Y軸坐標(biāo)為:"+e.pageY);
});

 

在頁面沒有滾動(dòng)條的情況下,pageX與clientX相等,同理pageY與clientY相等。

但是IE8及更早的版本不支持pageX與pageY,不過我們可以使用客戶區(qū)坐標(biāo)(client,clientY)和滾動(dòng)坐標(biāo)計(jì)算出來;因此我們 需要用到document.body(混雜模式下)或 document.documentElement(標(biāo)準(zhǔn)模式下)中的scrollLeft和scrollTop屬性;

對(duì)此我們可以封裝代碼如下:

 

EventUtil.addHandler(btn,'click',function(e){
    e = EventUtil.getEvent(e);
    var pageX = e.pageX,
          pageY = e.pageY;
    if(!pageX) {
    pageX = e.clientX + (document.body.scrollLeft || document.documentElement.scrollLeft);
    }
    if(!pageY) {
    pageY = e.clientY + (document.body.scrollTop || document.documentElement.scrollTop);
    }
    console.log("頁面X軸坐標(biāo)為:"+pageX + " "+ "頁面Y軸坐標(biāo)為:"+pageY);
});

 

理解屏幕坐標(biāo)的位置

屏幕橫坐標(biāo)screenX和垂直坐標(biāo)screenY屬性是相對(duì)于整個(gè)屏幕的。如下圖所示:

如下代碼測(cè)試:

 

EventUtil.addHandler(btn,'click',function(e){
    e = EventUtil.getEvent(e);
    console.log("屏幕X軸的坐標(biāo)為:"+e.screenX + " "+"屏幕Y軸的坐標(biāo)為:"+e.screenY);
});

 

理解鼠標(biāo)滾輪事件:

IE6首先實(shí)現(xiàn)了mousewheel事件,此后opera,chrome和safari也都實(shí)現(xiàn)了這個(gè)事件,當(dāng)用戶通過鼠標(biāo)滾輪與頁面交互,在垂 直方向上滾動(dòng)頁面時(shí)(無論向上還是向下),就會(huì)觸發(fā)mousewheel事件,這個(gè)事件可以在任何元素上觸發(fā),最終會(huì)冒泡到document(IE8)或 window(IE9,Opera,Chrome,Safari)對(duì)象,與mousewheel事件對(duì)應(yīng)的event對(duì)象外,還有一個(gè)屬性 wheelDelta屬性,當(dāng)用戶向前滾動(dòng)鼠標(biāo)滾輪時(shí),wheelDelta是120的倍數(shù),當(dāng)用戶向后滾動(dòng)鼠標(biāo)滾輪時(shí),wheelDelta是-120 的倍數(shù)。

將mousewheel事件給頁面任何元素或document對(duì)象,即可處理鼠標(biāo)滾輪操作;如下代碼:

 

EventUtil.addHandler(btn,'mousewheel',function(e){
    e = EventUtil.getEvent(e);
    alert(e.wheelDelta);
});

 

如上代碼,我不是在document對(duì)象或者window對(duì)象上,而是在頁面btn元素上觸發(fā)的;但是我們要注意,在Opera9.5之前的版本 中,wheelDelta值的正負(fù)號(hào)是顛倒的,如果我們要支持Opera9.5版本之前的話,那么我們需要瀏覽器檢測(cè)技術(shù)來檢測(cè)下;如下代碼

 

EventUtil.addHandler(document, "mousewheel", function(event){
    event = EventUtil.getEvent(event);
    // var delta = (client.engine.opera && client.engine.opera < 9.5 ? -event.wheelDelta : event.wheelDelta);
       var delta = event.wheelDelta;
    alert(delta);
});

 

但是client.engine.opera 這句代碼運(yùn)行下會(huì)報(bào)錯(cuò),因?yàn)槟壳斑€沒有封裝這個(gè)方法,所以等下一個(gè)博客我會(huì)研究代理檢測(cè)封裝下這個(gè)方法;所以先不考慮opera9.5,先注釋掉這句代碼;

但是FireFox支持一個(gè)為DOMMouseScroll的事件,也是在鼠標(biāo)滾輪滾動(dòng)時(shí)觸發(fā),與mousewheel事件一樣,但是他的有關(guān)鼠標(biāo) 滾輪信息保存在detail屬性中,當(dāng)鼠標(biāo)向前滾動(dòng)時(shí),這個(gè)屬性值是-3的倍數(shù),當(dāng)鼠標(biāo)滾輪向后滾動(dòng)時(shí),這個(gè)屬性值是3的倍數(shù);也可以給 DOMMouseScroll事件使用在任何元素上,且這個(gè)事件會(huì)冒泡到window對(duì)象上,因此我們可以這樣添加滾輪信息的代碼如下:

 

EventUtil.addHandler(document, "DOMMouseScroll", function(event){
    event = EventUtil.getEvent(event);
    alert(event.detail);
});

 

我們現(xiàn)在可以給跨瀏覽器下的滾輪事件;代碼如下:

 

function getWheelDelta (event) {
    if(event.wheelDelta) {
    // return (client.engine.opera && client.engine.opera < 9.5 ? -event.wheelDelta : event.wheelDelta);
         return  event.wheelDelta;
    }else {
        return -event.detail * 40
    }
}

 

getWheelDelta方法首先檢測(cè)了事件對(duì)象是否包含了wheelDelta屬性,如果包含則返回屬性值,如果不包含,那么我們就當(dāng)作是 firefox瀏覽器,那么假設(shè)相應(yīng)的值保存在detail屬性中,有了上面的方法后,我們現(xiàn)在可以將相同的事件指定給mousewheel事件和 DOMMouseScroll事件了;

 

EventUtil.addHandler(document, "DOMMouseScroll", handleMouseWheel);
EventUtil.addHandler(document, "mousewheel", handleMouseWheel);
function handleMouseWheel(event) {
    event = EventUtil.getEvent(event);
    var delta = EventUtil.getWheelDelta(event);
    alert(delta);
}

 

滾輪向上滾動(dòng)是正數(shù)120,向下滾動(dòng)是負(fù)數(shù)-120,所以根據(jù)是否大于0,可以判斷是向下滾動(dòng)還是向上滾動(dòng);

#p#

理解字符編碼charCode

IE9+,firefox,chrome和safari的event對(duì)象都支持一個(gè)charCode屬性,這個(gè)屬性只有在發(fā)生keypress事件 時(shí)才包含值,而且這個(gè)值是按下的那個(gè)鍵所代表字符的ASCLL編碼,但是IE8及之前或者opera不支持這個(gè)屬性,但是我們可以使用keyCode這個(gè) 屬性代替.在取得了字符編碼之后,就可以使用String.fromCharCode()將其轉(zhuǎn)換成實(shí)際的字符。

如下代碼:

 

getCharCode: function(event) {
    if(typeof event.charCode == 'number') {
        return event.charCode;
    }else {
        return event.keyCode;
    }
}

 

我們現(xiàn)在可以給EventUtil添加事件了,如下代碼:

 

var EventUtil = {
    addHandler: function(element,type,handler) {
        if(element.addEventListener) {
            element.addEventListener(type,handler,false);
        }else if(element.attachEvent) {
            element.attachEvent("on"+type,handler);
        }else {
            element["on" +type] = handler;
        }
    },
    removeHandler: function(element,type,handler){
        if(element.removeEventListener) {
            element.removeEventListener(type,handler,false);
        }else if(element.detachEvent) {
            element.detachEvent("on"+type,handler);
        }else {
            element["on" +type] = null;
        }
    },
    getEvent: function(event) {
        return event ? event : window.event;
    },
    getTarget: function(event) {
        return event.target || event.srcElement;
    },
    preventDefault: function(event){
        if(event.preventDefault) {
            event.preventDefault();
        }else {
            event.returnValue = false;
        }
    },
    stopPropagation: function(event) {
        if(event.stopPropagation) {
            event.stopPropagation();
        }else {
            event.cancelBubble = true;
        }
    },
    getRelatedTarget: function(event){
        if (event.relatedTarget){
            return event.relatedTarget;
        } else if (event.toElement){
            return event.toElement;
        } else if (event.fromElement){
            return event.fromElement;
        } else {
            return null;
        }
    },
    getWheelDelta: function(event) {
        if(event.wheelDelta) {
            return event.wheelDelta;
        }else {
            return -event.detail * 40
        }
    },
    getCharCode: function(event) {
        if(typeof event.charCode == 'number') {
            return event.charCode;
        }else {
            return event.keyCode;
        }
    }
};

 

我們現(xiàn)在可以做一個(gè)demo如下:

 

如下代碼:
var inputp = document.getElementById("inputp");
EventUtil.addHandler(inputp,'keypress',function(event){
    event = EventUtil.getEvent(event);
    var code = EventUtil.getCharCode(event);
    alert(EventUtil.getCharCode(event)); // 彈出字符編碼
    alert(String.fromCharCode(code));  // 彈出字符
});

 

HTML5事件

1.   contextmenu事件

contextmenu事件在windows操作系統(tǒng)下,我們是使用右鍵就可以自定義右鍵彈出菜單,但是我們使用右鍵的時(shí)候會(huì)有默認(rèn)的菜單,因此我 們需要使用阻止默認(rèn)事件這個(gè)方法來阻止掉;此事件也是屬于鼠標(biāo)事件,因此此事件包含與光標(biāo)位置中所有的屬性,比如我們右鍵如下圖所示:

 

HTML代碼如下:
<p id="myp">Right click or Ctrl+click me to get a custom context menu.Click anywhere else to get the default context menu.
</p>
<ul id="myMenu" style="position:absolute;visibility:hidden;background-color:
    silver">
<li><a href="http://www.nczonline.net">Nicholas’ site</a></li>
<li><a href="http://www.wrox.com">Wrox site</a></li>
<li><a href="http://www.yahoo.com">Yahoo!</a></li>
</ul>

 

 

JS代碼如下:
var p = document.getElementById("myp");
EventUtil.addHandler(p, "contextmenu", function(event){
    event = EventUtil.getEvent(event);
    EventUtil.preventDefault(event);
    var menu = document.getElementById("myMenu");
    menu.style.left = event.clientX + "px";
    menu.style.top = event.clientY + "px";
    menu.style.visibility = "visible";
});
EventUtil.addHandler(document, "click", function(event){
    document.getElementById("myMenu").style.visibility = "hidden";
});

 

如上,我們是通過右鍵的clientX和clientY來確定菜單的位置;當(dāng)我點(diǎn)擊文檔document的時(shí)候 就隱藏該菜單;

瀏覽器支持有:IE,F(xiàn)irefox,Safari,chrome和Opera11+

beforeunload事件

此事件是給頁面在卸載之前,給用戶一個(gè)提示,是否需要卸載頁面提示給用戶,為了顯示這個(gè)對(duì)話框,對(duì)IE和firefox而言,必須將event.returnValue的值設(shè)置為要顯示給用戶的字符串;但是對(duì)于safari和chrome而言,可以返回此字符串即可;

如下代碼:

 

EventUtil.addHandler(window, "beforeunload",function(event){
    event = EventUtil.getEvent(event);
    var message = "I'm really going to miss you if you go.";
    event.returnValue = message;
    return message;
});

 

當(dāng)用戶關(guān)閉游覽器的時(shí)候,會(huì)彈出如下窗口給用戶提示,如下:

點(diǎn)擊離開此頁按鈕 即關(guān)閉窗口,點(diǎn)擊留在此頁按鈕 即留在當(dāng)前頁面,但是當(dāng)我按F5刷新頁面的時(shí)候,同樣會(huì)彈出窗口提示,如下:

瀏覽器支持:IE,firefox,chrome和safari都支持,但是Opera11及之前的版本不支持;

理解hashchange事件

HTML5中新增加了hashchange事件,以便在URL的參數(shù)列表(url中的#號(hào)后面的所有參數(shù)發(fā)生改變時(shí)通知開發(fā)人員),在Ajax應(yīng)用中,開發(fā)人員經(jīng)常使用url參數(shù)列表保存狀態(tài)或?qū)Ш叫畔ⅲ?/p>

我們必須把hashchange事件添加到window對(duì)象中,然后當(dāng)url參數(shù)列表只要發(fā)生變化就會(huì)調(diào)用此事件,此事件對(duì)象event包含2個(gè)屬性,oldURL和newURL,這兩個(gè)屬性分別保存著URL變化前后的完整URL;

支持的瀏覽器有:IE8+,firefox3.6+,safari5+,chrome和opera10.6+

在這些瀏覽器中,只有firefox3.6+,chrome和opera支持oldURL和newURL屬性;

如下代碼:

 

EventUtil.addHandler(window, "hashchange", function(event){
     alert("Old URL: " + event.oldURL + "\nNew URL: " + event.newURL);
});

 

當(dāng)我第一次#號(hào)參數(shù)后面是aa,現(xiàn)在改成aaaa,就會(huì)觸發(fā)此事件,如下所示:

有些瀏覽器并不支持oldURL和newURL,因此我們可以使用location.hash來保存當(dāng)前的參數(shù)列表,如下代碼:

 

EventUtil.addHandler(window, "hashchange", function(event){

      alert(location.hash);

});

 

當(dāng)#號(hào)后面我改成bbb參數(shù)時(shí)候,會(huì)彈出如下所示:

可以使用如下代碼來檢測(cè)瀏覽器是否支持hashchange事件;

 

var isSupported = ("onhashchange" in window);
alert(isSupported);

 

如果IE8 是在IE7 文檔模式下運(yùn)行,即使功能無效它也會(huì)返回true。為解決這個(gè)問題,可以使用

以下這個(gè)更穩(wěn)妥的檢測(cè)方式:

 

var isSupported = ("onhashchange" in window) && (document.documentMode === undefined || document.documentMode > 7);

 

設(shè)備事件中的—orientationchange事件

蘋果公司為移動(dòng)safari添加的orientationchange事件是能讓用戶確定何時(shí)將設(shè)備由橫向查看模式切換到縱向模式觸發(fā)的事件;此屬 性中包含三個(gè)值,0表示肖像模式;90表示向左旋轉(zhuǎn)的橫向模式(主屏幕按鈕在右側(cè)),-90表示向右旋轉(zhuǎn)的橫向模式(主屏幕按鈕在左側(cè)),如下圖所示:

只要用戶改變了設(shè)備的查看模式,就會(huì)觸發(fā)orientationchange事件,

使用IOS設(shè)備即可演示效果:代碼如下:

 

EventUtil.addHandler(window, "load", function(event){
    var p = document.getElementById("myp");
    p.innerHTML = "Current orientation is " + window.orientation;
    EventUtil.addHandler(window, "orientationchange", function(event){
        p.innerHTML = "Current orientation is " + window.orientation;
    });
});

 

理解移動(dòng)端的事件—觸摸與手勢(shì)事件

有以下幾個(gè)觸摸事件:

  1. touchstart: 當(dāng)手指觸摸屏幕時(shí)觸發(fā),即使是一個(gè)手指放在屏幕上也會(huì)觸發(fā)。
  2. touchmove:當(dāng)手指在屏幕上滑動(dòng)時(shí)連續(xù)地觸發(fā),這個(gè)事件發(fā)生期間,我們可以使用preventDefault()事件可以阻止?jié)L動(dòng)。
  3. touchend: 當(dāng)手指從屏幕上移開時(shí)觸發(fā)。
  4. touchcancel: 當(dāng)系統(tǒng)停止跟蹤觸摸時(shí)觸發(fā)。

上面幾個(gè)事件都屬于冒泡事件,我們可以對(duì)此進(jìn)行取消事件,每個(gè)觸摸的event對(duì)象都提供了在鼠標(biāo)中常見的屬性;

bubbles, cancelable,view,clientX, clientY ,screenX, screenY,detail, altKey, shiftKey, ctrlKey, metaKey,

除了常見的DoM屬性外,觸摸事件還包含下列三個(gè)用于跟蹤觸摸的屬性;

touches: 表示當(dāng)前跟蹤的觸摸操作的Touch對(duì)象數(shù)組;

targetTouches: 特定與事件目標(biāo)的Touch對(duì)象數(shù)組;

changeTouches: 表示自上次觸摸以來發(fā)生了什么改變的Touch對(duì)象數(shù)組;

 

 

 

責(zé)任編輯:王雪燕 來源: 涂根華的博客
相關(guān)推薦

2015-10-27 09:25:11

Vi編輯器使用指南

2019-11-13 12:39:26

Python 開發(fā)編程語言

2025-08-01 10:04:47

2025-07-24 07:10:31

pypaimonPython開發(fā)

2010-02-06 16:30:25

C++內(nèi)存對(duì)齊

2010-02-02 15:01:59

C++成員函數(shù)指針

2010-01-19 12:53:59

VB.NET Text

2022-09-29 09:07:08

DataGrip數(shù)據(jù)倉庫數(shù)據(jù)庫

2010-08-26 10:28:43

2010-11-04 10:16:11

inotify監(jiān)控Linux文件系統(tǒng)

2012-12-26 12:41:14

Android開發(fā)WebView

2021-07-27 10:09:27

鴻蒙HarmonyOS應(yīng)用

2009-12-28 17:40:10

WPF TextBox

2010-09-06 14:24:28

ppp authent

2011-07-21 14:57:34

jQuery Mobi

2017-06-06 13:35:59

AndroidToolbar

2025-06-23 08:40:00

MySQL數(shù)據(jù)庫運(yùn)維

2011-08-01 10:21:42

2009-12-31 17:17:45

Silverlight

2025-07-02 09:00:24

ES運(yùn)維JSON
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲天堂国产视频| 在线观看日韩片| 亚洲av中文无码乱人伦在线视色| 免费观看久久av| 在线看国产一区| 在线视频91| 欧美 日韩 国产 成人 在线| 亚洲主播在线| 中文字幕在线看视频国产欧美| 日本高清免费观看| 日本免费一区二区六区| 亚洲国产精品高清| 成人永久免费| 中文字幕乱码在线观看| 欧美日韩精品| 国产午夜精品美女视频明星a级| 特黄视频免费观看| 中文字幕在线直播| ...av二区三区久久精品| 精品一区久久久久久| 国产一区二区三区视频免费观看| 亚洲午夜一区| 日日摸夜夜添一区| 无套内谢大学处破女www小说| 在线观看欧美| 日韩欧美中文字幕在线观看 | 农村少妇久久久久久久| 日韩经典一区二区| 久久久久国色av免费观看性色| 免费看日本黄色片| 欧亚精品一区| 日韩免费高清视频| 日韩在线不卡一区| 中文字幕日本一区二区| 亚洲国产日韩a在线播放| 亚洲一区二区三区免费看| 头脑特工队2在线播放| 国产乱对白刺激视频不卡| 国产精品日本精品| 日韩不卡在线播放| 亚洲精品护士| 欧美国产亚洲视频| a在线视频播放观看免费观看| 国产成人3p视频免费观看| 亚洲缚视频在线观看| 中文字幕一二三区| 国产欧美视频在线| 欧美猛男超大videosgay| 超碰在线播放91| 日韩欧美另类一区二区| 午夜精品久久久久| 精品国产av无码一区二区三区 | 欧美精品videossex性护士| 免费成人深夜夜行网站| 第一sis亚洲原创| 亚洲天堂影视av| 成人片黄网站色大片免费毛片| 日韩有码一区| 国产丝袜视频一区| av黄色免费网站| 欧美人与物videos另类xxxxx| 日韩不卡中文字幕| 一本色道久久综合亚洲精品图片| 色狼人综合干| 亚洲精品久久久久中文字幕欢迎你| 久久久久亚洲av成人网人人软件| 中文在线综合| 亚洲国产成人久久综合| 中文字幕免费高清视频| 欧美变态网站| 国产一区二区三区在线观看视频| 中文天堂资源在线| 天堂美国久久| 欧美激情综合亚洲一二区| 久久精品无码人妻| 国产亚洲精品久久久久婷婷瑜伽| 欧美在线不卡区| 国产乱码77777777| 青青草成人在线观看| 国产免费一区二区三区香蕉精| 一本色道久久综合亚洲| 国产成人免费视频一区| 精品一区二区视频| 国产高清一区在线观看| 国产精品久久久久毛片软件| 水蜜桃在线免费观看| 国产第一页在线| 欧美日韩免费一区| 亚洲欧洲日本精品| 97精品久久| 亚洲欧美国产一本综合首页| 青青草自拍偷拍| 欧美精品首页| 日韩av不卡电影| 91精品中文字幕| 成人免费高清在线| 先锋影音网一区| 手机在线免费看av| 欧美性高跟鞋xxxxhd| 中文字幕亚洲欧洲| 精品三级av在线导航| 尤物精品国产第一福利三区 | 日韩综合在线| 久久久久久国产精品| 精产国品一区二区| 国产一本一道久久香蕉| 欧美激情www| 性xxxfreexxxx性欧美| 日韩欧美国产网站| 丰满少妇一区二区三区专区| 久久综合亚洲| 欧美寡妇偷汉性猛交| 奴色虐av一区二区三区| 国产成人精品影院| 一区二区三区电影| 蜜桃av在线播放| 日韩视频一区二区在线观看| 一级片手机在线观看| 国产精品v亚洲精品v日韩精品| 国产极品精品在线观看| 色一情一乱一乱一区91av| 亚洲欧洲一区二区在线播放| 白嫩少妇丰满一区二区| 97久久综合精品久久久综合| x99av成人免费| 国产中文字幕视频| 国产馆精品极品| 亚洲成人a**址| av高清不卡| 亚洲第一网站免费视频| 国产精品白嫩白嫩大学美女| 美女性感视频久久| 欧美久久在线| 黄色漫画在线免费看| 日韩区在线观看| 性欧美疯狂猛交69hd| 视频一区中文字幕国产| 精品一区二区国产| 久久香蕉av| 欧美一级日韩免费不卡| 国产传媒在线看| 日韩avvvv在线播放| 久久99精品久久久久久水蜜桃 | 国产精品成人一区二区艾草| 不要播放器的av网站| 国产成人福利av| 欧美精品亚州精品| 国产原创中文av| 国产精品久久久久久一区二区三区| 免费av网址在线| 啄木系列成人av电影| 欧美在线观看网站| 五月婷婷六月丁香| 午夜精品福利一区二区蜜股av | 色伦专区97中文字幕| www.日韩一区| 国产欧美日韩亚州综合| 国产成人无码一二三区视频| 香蕉精品久久| 国产91精品久久久久| 亚洲欧美日韩免费| 欧美日韩加勒比精品一区| 五月天丁香社区| 亚洲精品乱码| 久久99久久精品国产| 欧美国产大片| 亚洲视频电影图片偷拍一区| 欧美一级淫片免费视频黄| 久久久久久久久久久久久女国产乱| www黄色日本| 蜜乳av综合| 国产精品久久久久久久久久久不卡| 国内在线精品| 欧美日韩色综合| 青青草国产在线观看| 成熟亚洲日本毛茸茸凸凹| 欧美一级视频在线播放| 欧美激情网址| 国产精品吹潮在线观看| 欧美成人精品一区二区男人看| 欧美精品久久一区二区三区| 欧美日韩精品在线观看视频| 91在线观看污| 三级a三级三级三级a十八发禁止| 91中文字幕精品永久在线| 91免费版网站入口| www555久久| 亚洲人成电影网站| 国产视频在线观看免费| 五月婷婷激情综合网| 国产精品20p| 激情久久五月天| 国产精品无码人妻一区二区在线 | 亚洲国产一区自拍| 波多野结衣大片| 亚洲另类一区二区| 亚洲av无码成人精品国产| 青青草97国产精品免费观看无弹窗版 | 在线观看国产黄| 一区二区欧美国产| 亚洲精品午夜视频| 国产精品123区| 欧美 日韩精品| 91tv精品福利国产在线观看| 国产在线精品二区| 日韩一区二区三区四区五区 | 激情伊人五月天久久综合| 欧美国产视频一区| 国产日产精品_国产精品毛片| 亚洲一区二区三区视频| 亚洲天堂电影| 精品少妇v888av| 国产黄色片在线观看| 亚洲精品在线电影| 国产精品免费无遮挡| 欧美日韩在线一区| 永久免费看黄网站| 亚洲国产经典视频| 波多野结衣福利| 国产成人在线观看| 久久黄色片网站| 久久性色av| 欧美一级免费播放| 91精品1区| 亚洲视频电影| 欧美日本成人| 精品蜜桃一区二区三区| 日韩中文字幕| 成人乱色短篇合集| 丁香婷婷久久| 欧美最猛性xxxx| 黄视频网站在线观看| 久久97久久97精品免视看| 日本天堂在线观看| 国产一区二区三区毛片| 无码精品视频一区二区三区 | 一区二区三区资源| 欧美性x x x| 国产精品国产三级国产有无不卡 | av手机天堂网| 精品美女永久免费视频| 麻豆chinese极品少妇| 综合色天天鬼久久鬼色| 1024手机在线观看你懂的| 国产亚洲欧美中文| 白白色免费视频| 久久久美女毛片 | 国产精品网站在线| 69视频在线观看免费| 久久婷婷久久一区二区三区| 欧美成人三级伦在线观看| 成人免费视频免费观看| 美女伦理水蜜桃4| 成人免费视频播放| 星空大象在线观看免费播放| 成人综合在线网站| 亚洲中文字幕无码一区| av高清久久久| www.自拍偷拍| 91色.com| 精品人妻无码一区二区三区换脸| 久久久午夜电影| 国产熟女一区二区| 国产精品麻豆久久久| 成人自拍小视频| 亚洲精品国产视频| 久久久精品99| 亚洲h在线观看| 欧美h在线观看| 欧美专区在线观看一区| 中文在线免费观看| 日韩一区二区三区视频在线| 性生活视频软件| 亚洲精品久久久一区二区三区| 日韩三级电影网| 国产一区二区三区在线观看视频| 成人77777| 久久综合伊人77777蜜臀| 99在线视频影院| 欧洲亚洲女同hd| 欧美成人高清视频在线观看| 成人综合网网址| 福利电影一区| 欧美日韩亚洲在线| 性欧美欧美巨大69| 妞干网在线观看视频| 石原莉奈在线亚洲三区| 17c国产在线| 福利一区福利二区| 亚洲色成人网站www永久四虎 | 欧美性爽视频| 欧美自拍视频在线观看| 偷拍自拍亚洲| 精品国产一区二区三| 日韩久久电影| 韩日视频在线观看| 美女一区二区三区在线观看| 性一交一黄一片| 久久精品一区二区三区不卡| 国产精品白丝喷水在线观看| 婷婷一区二区三区| 亚洲在线免费观看视频| 精品美女在线播放| 在线免费黄色| 韩剧1988免费观看全集| 成人在线视频免费| 欧美不卡三区| 中文精品电影| 蜜臀av午夜一区二区三区| 国产在线精品一区二区不卡了 | 中文字幕一区二区人妻痴汉电车| 日韩一区二区在线观看| 欧美中文在线| 欧美激情videos| 九九热这里有精品| 欧美lavv| 亚洲国产高清一区二区三区| 国产精欧美一区二区三区白种人| 91偷拍与自偷拍精品| 久久久.www| 欧美片在线播放| 五月婷婷六月丁香| 久久久亚洲欧洲日产国码aⅴ| 国产亚洲欧美日韩精品一区二区三区| 国产精品美女黄网| 欧美 日韩 国产 一区| 久草在在线视频| 91蜜桃免费观看视频| 麻豆亚洲av成人无码久久精品| 欧美中文字幕久久| 欧洲亚洲精品视频| 91精品国产乱码久久久久久久久 | 538在线一区二区精品国产| 欧美成熟毛茸茸| 97在线视频观看| 免费观看性欧美大片无片| 一区二区三区精品国产| 日日夜夜一区二区| 日韩av在线看免费观看| 精品国产1区2区| 欧美一级在线免费观看| 久精品免费视频| 免费精品一区| 经典三级在线视频| 久久精品理论片| 无码人中文字幕| 欧美午夜免费电影| 国产毛片av在线| 国产精彩精品视频| 成人毛片在线| 男女爽爽爽视频| 欧美激情一区二区| 一区二区视频在线免费观看| 中文字幕一区电影| 日韩成人在线电影| 色一情一乱一伦一区二区三区| 丝袜亚洲另类欧美| 最新中文字幕av| 在线观看国产一区二区| 1024免费在线视频| 成人性生交大片免费观看嘿嘿视频| 欧美国产小视频| 久久婷婷中文字幕| 亚洲激情av在线| 欧美在线精品一区二区三区| 8090成年在线看片午夜| 你懂的一区二区三区| 欧美精品成人网| 亚洲欧洲精品一区二区三区| www.激情五月| 91国产一区在线| 亚洲自拍电影| 亚洲 国产 图片| 亚洲精品大片www| 亚洲精品一区二区三区四区| 亚洲91精品在线| 国产欧美日韩影院| 91蝌蚪视频在线| 午夜一区二区三区视频| 日中文字幕在线| 国产精品男人的天堂| 国产精品videosex性欧美| 亚洲精品鲁一鲁一区二区三区| 亚洲mv大片欧洲mv大片精品| 黄色电影免费在线看| 国产专区欧美专区| 国产综合精品一区| 妺妺窝人体色WWW精品| 67194成人在线观看| av中文资源在线资源免费观看| 欧美日韩国产高清视频| 久久99久久精品| 国产无套内射又大又猛又粗又爽 | 国产精品熟妇一区二区三区四区| 欧美体内谢she精2性欧美| 91caoporm在线视频| 国产精品国色综合久久| 日韩精品91亚洲二区在线观看 | 欧美日韩在线视频观看| 免费成人黄色|