国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Event Handler 事件處理程序 2 ---跨瀏覽器事件對(duì)象《高程3》

roadtogeek / 2993人閱讀

摘要:一旦事件處理程序執(zhí)行完成,對(duì)象就會(huì)被銷毀。所有瀏覽器對(duì)的支持方式包括事件對(duì)象和事件對(duì)象。無(wú)論指定事件處理程序時(shí)使用什么方法級(jí)或級(jí),都會(huì)傳入對(duì)象。由于不支持事件捕獲,因而只能取消事件冒泡但可以同時(shí)取消事件捕獲和冒泡。

0 Event Object導(dǎo)論

支持DOM0、DOM2的瀏覽器和IE瀏覽器實(shí)現(xiàn)事件處理程序的不同,除了體現(xiàn)在添加事件處理程序的不同上,還體現(xiàn)在event對(duì)象的實(shí)現(xiàn)差異上,包括具體的屬性和方法。
在觸發(fā)DOM上的某個(gè)事件時(shí),都會(huì)產(chǎn)生一個(gè)event對(duì)象,這個(gè)對(duì)象包含著所有與事件有關(guān)的信息。一旦事件處理程序執(zhí)行完成,event對(duì)象就會(huì)被銷毀。所有瀏覽器對(duì)event的支持方式包括:DOM事件對(duì)象和IE事件對(duì)象。

1.1 DOM0和DOM2支持的Event對(duì)象(針對(duì)IE之外的瀏覽器)

兼容 DOM 的瀏覽器會(huì)將一個(gè) event 對(duì)象傳入到事件處理程序中。無(wú)論指定事件處理程序時(shí)使用什么方法(DOM0 級(jí)或 DOM2 級(jí)) ,都會(huì)傳入 event 對(duì)象。

var btn = document.getElementById("myBtn");
btn.onclick = function(event){
alert(event.type); //"click"
};
btn.addEventListener("click", function(event){
alert(event.type); //"click"
}, false);

在通過(guò) HTML 特性指定事件處理程序時(shí),變量 event 中保存著 event 對(duì)象:


1.2 event對(duì)象常用屬性和方法

(1) type, String; 只讀; 被觸發(fā)的事件的類型,如click。
(2) currentTarget, Element,只讀,其事件處理程序當(dāng)前正在處理事件的那個(gè)元素;
(3) target, Element, 只讀, 事件的目標(biāo);
在事件處理程序內(nèi)部,對(duì)象 this 始終等于 currentTarget 的值(注冊(cè)事件處理程序的元素),而 target 則只包含事件的實(shí)際目標(biāo)(事件直接觸發(fā)的元素)。如果直接將事件處理程序指定給了目標(biāo)元素,則 this、 currentTarget 和 target 包含相同的值。但是考慮到有時(shí)候會(huì)使用事件冒泡機(jī)制,事件直接觸發(fā)的元素不一定是事件綁定的元素,例如:

 //按鈕在body中,事件會(huì)冒泡到body
document.body.onclick = function(event){
alert(event.currentTarget === document.body); //true
alert(this === document.body); //true
alert(event.target === document.getElementById("myBtn")); //true
};

當(dāng)單擊這個(gè)例子中的按鈕時(shí), this 和 currentTarget 都等于 document.body,因?yàn)槭录幚沓绦蚴亲?cè)到這個(gè)元素上的。然而, target 元素卻等于按鈕元素,因?yàn)樗?click 事件真正的目標(biāo)。由于按鈕上并沒(méi)有注冊(cè)事件處理程序,結(jié)果 click 事件就冒泡到了 document.body,在那里事件才得到了處理。

(4) preventDefault()方法:阻止特定事件的默認(rèn)行為。例如,鏈接的默認(rèn)行為就是在被單擊時(shí)會(huì)導(dǎo)航到其 href 特性指定的 URL。

var link = document.getElementById("myLink");
link.onclick = function(event){
event.preventDefault();
};

(5) stopPropagation()方法:用于立即停止事件在 DOM 層次中的傳播,即取消進(jìn)一步的事件捕獲或冒泡。這個(gè)屬性在jQuery中很重要。

(6) eventPhase 屬性:可以用來(lái)確定事件當(dāng)前正位于事件流的哪個(gè)階段。如果是在捕獲階段調(diào)用的事件處理程序,那么 eventPhase 等于 1;如果事件處理程序處于目標(biāo)對(duì)象(直接點(diǎn)擊對(duì)象,一般是最內(nèi)層對(duì)象)上,則 eventPhase 等于 2;如果是在冒泡階段調(diào)用的事件處理程序, eventPhase 等于 3。這里要注意的是,盡管“處于目標(biāo)”發(fā)生在冒泡階段,但 eventPhase 仍然一直等于 2。

var btn = document.getElementById("myBtn");
btn.onclick = function(event){
alert(event.eventPhase); //2 ,最內(nèi)元素在事件傳播結(jié)束后觸發(fā)
};
document.body.addEventListener("click", function(event){
alert(event.eventPhase); //1,DOM2事件觸發(fā)使用true參數(shù)是在傳播階段觸發(fā)
}, true);
document.body.onclick = function(event){
alert(event.eventPhase); //3,DOM0事件在冒泡階段觸發(fā)
};

當(dāng)單擊這個(gè)例子中的按鈕時(shí),首先執(zhí)行的事件處理程序是在捕獲階段觸發(fā)的添加到 document.body中的那一個(gè),結(jié)果會(huì)彈出一個(gè)警告框顯示表示 eventPhase 的 1。接著,會(huì)觸發(fā)在按鈕上注冊(cè)的事件處理程序,此時(shí)的 eventPhase 值為 2。最后一個(gè)被觸發(fā)的事件處理程序,是在冒泡階段執(zhí)行的添加到document.body 上的那一個(gè),顯示 eventPhase 的值為 3。而當(dāng) eventPhase 等于 2 時(shí),this、target和 currentTarget 始終都是相等的。

2.1 IE中的事件對(duì)象

IE中event對(duì)象的訪問(wèn)方式取決于綁定事件處理程序的方法:
1)DOM0級(jí)方法: event對(duì)象作為window對(duì)象的一個(gè)屬性存在。

        var btn = document.getElementById("myBtn");
        btn.onclick = function(){
        var event = window.event;
            alert(event.type); //"click"
        };

2)如果事件處理程序是通過(guò)attachEvent()添加的,就有一個(gè)event對(duì)象作為事件處理程序的參數(shù)。

    

        var btn = document.getElementById("myBtn");
        alert(typeof attachEvent);
        btn. attachEvent("click", function(event){
            alert(event.type); //"click"
        });
2.2 IE中event對(duì)象的屬性和方法

1)cancelBubble:默認(rèn)值為false,但將其設(shè)置為true就可以取消事件冒泡(與DOM中
的stopPropagation()方法的作用相同);
2)returnValue:默認(rèn)值為true,但將其設(shè)置為false就可以取消事件的默認(rèn)行為(與
DOM中的preventDefault()方法的作用相同);
3)srcElement:事件的直接目標(biāo)(與DOM中的target屬性相同);
4)type:被觸發(fā)的事件的類型。

srcElement:因?yàn)槭录幚沓绦虻淖饔糜蚴歉鶕?jù)指定它的方式來(lái)確定的, this 不一定總是等于事件目標(biāo)。例如:

var btn = document.getElementById("myBtn");
btn.onclick = function(){
alert(window.event.srcElement === this); //DOM0級(jí)方法,true
};
btn.attachEvent("onclick", function(event){
alert(event.srcElement === this); //false
});

returnValue 屬性:只要將 returnValue 設(shè)置為 false,就可以阻止默認(rèn)行為。

var link = document.getElementById("myLink");
link.onclick = function(){
window.event.returnValue = false;
};

cancelBubble 屬性:與 DOM 中的 stopPropagation()方法作用相同,都是用來(lái)停止事件冒泡的。由于 IE 不支持事件捕獲,因而只能取消事件冒泡;但 stopPropagatioin()可以同時(shí)取消事件捕獲和冒泡。例如:

//在單擊按鈕之后,只會(huì)顯示一個(gè)警告框。
var btn = document.getElementById("myBtn");
btn.onclick = function(){
alert("Clicked");
window.event.cancelBubble = true;
};
document.body.onclick = function(){
alert("Body clicked");
};
2.3 IE11的變化

但是在IE11發(fā)布之后attachEvent函數(shù)被替換成了addEventListener。

var btn = document.getElementById("myBtn");
alert(typeof addEventListener);//function
btn.addEventListener("click", function(event){
    alert(event.type); //"click"
});

IE11中srcElement屬性測(cè)試:

HTML:

the onlt one div

JavaScript:

    var wrapper = document.getElementById("wrapper");
    alert(typeof addEventListener);
    wrapper.addEventListener("click", function(event){
        alert(event.target); //span
        alert(event.currentTarget); //div
        alert(event.srcElement); //span
        alert(this);//div
    });

結(jié)論:srcElement和target是相同的,都指向事件的直接元素,但是this和currentTarget都指向事件綁定元素。

如果需要阻止默認(rèn)行為,直接使用在addEventListener()中使用event.preventDefault()即可。根據(jù)以上,可以得出初步的結(jié)論:在IE11瀏覽器中使用addEventListener()后,DOM2級(jí)event具有的屬性和方法都可以使用。

我在IE中使用addEventListener()并沒(méi)有遇到問(wèn)題,但是網(wǎng)上有一些開(kāi)發(fā)者在使用時(shí)會(huì)遇到問(wèn)題,提供的解決方法有數(shù)種:
https://social.msdn.microsoft...
第一種是加入一些腳本:

    

第二種是把IE的internet選項(xiàng)-- >安全,點(diǎn)擊“將所有區(qū)域重置為默認(rèn)級(jí)別”。

3 跨瀏覽器的事件對(duì)象EventUtil
    var EventUtil = {
        //是否支持DOM2?是否是IE?是否支持DOM0?一般前兩個(gè)if包含了所有情況
        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;
            }
        },
        //IE沒(méi)有event對(duì)象,因此使用window.event
        getEvent: function(event){
            return event ? event : window.event;
        },
        /*使用getEvent()方法得到event對(duì)象后才可以使用getTarget()、
        preventDefault()、stopPropagation()方法
        */
        //先檢測(cè)DOM0 DOM2的target屬性,然后檢測(cè)IE的srcElement屬性
        getTarget: function(event){
            return event.target || event.srcElement;
        },
        //先檢測(cè)DOM0 DOM2的preventDefault(),再檢測(cè)IE的returnValue
        preventDefault: function(event){
            if (event.preventDefault){
                event.preventDefault();
            } else {
                event.returnValue = false;
            }
        },
        //是否支持DOM2?是否是IE?是否支持DOM0?一般前兩個(gè)if包含了所有情況
        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;
            }
        },
        //先檢測(cè)DOM0 DOM2的stopPropagation(),再檢測(cè)IE的cancelBubble
        stopPropagation: function(event){
            if (event.stopPropagation){
                event.stopPropagation();
            } else {
                event.cancelBubble = true;
            }
        }
    };

測(cè)試實(shí)例:

    var but = document.getElementById("myButtun");
    var handler = function(event){
        event = EventUtil.getEvent(event);
        var target = EventUtil.getTarget(event);
         alert(target);// [object HTMLInputElement]
        
    };
    EventUtil.addHandler(but, "click", handler);

當(dāng)然,上述跨瀏覽器的事件對(duì)象所包含的屬性和方法并不是必須的,在實(shí)際中可以根據(jù)實(shí)際情況適當(dāng)刪減一些屬性和方法。但是,萬(wàn)變不離其宗。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/50143.html

相關(guān)文章

  • Make a simple custom EventEmitter

    Thoughts Recently I have been reading the book Async Javascript about JS asynchronicity and JS event is one of the useful solutions to the problem. To get a deeper understanding of how events work, I ...

    fizz 評(píng)論0 收藏0
  • php微框架 flight源碼閱讀——2.框架初始化、Loader、Dispatcher

    摘要:當(dāng)調(diào)用時(shí),會(huì)觸發(fā)當(dāng)前類的魔術(shù)方法,通過(guò)判斷屬性中索引是否存在,不存在拋出異常,存在就通過(guò)去實(shí)例化初始化時(shí)設(shè)置的,這里是工廠模式,接下來(lái)的路由文章會(huì)詳細(xì)分析。在操作中,會(huì)將前置操作設(shè)置到類的屬性中。微框架源碼閱讀系列 在自動(dòng)加載實(shí)現(xiàn)完成后,接著new flightEngine()自動(dòng)加載的方式實(shí)例化了下框架的核心類Engine,這個(gè)類名翻譯過(guò)來(lái)就是引擎發(fā)動(dòng)機(jī)的意思,是flight的引擎發(fā)...

    U2FsdGVkX1x 評(píng)論0 收藏0
  • Vue.js 表格組件

    //Vue組件開(kāi)始 var Grid = Vue.extend({ template: {{col.display}} ...

    Alliot 評(píng)論0 收藏0
  • 使用 Authing + Lambda 替代 AWS Cognito

    摘要:編寫(xiě)函數(shù)編寫(xiě)函數(shù)推薦使用這個(gè),控制臺(tái)中的函數(shù)編寫(xiě)堪稱讓人痛不欲生。在控制臺(tái)中安裝在中引入包后會(huì)一起打包上傳到運(yùn)行時(shí)中。 Amazon Web Services(AWS) 雖然作為市場(chǎng)份額全球第一的云計(jì)算廠商,其產(chǎn)品也不是完美無(wú)缺的,Cognito (AWS 的身份認(rèn)證解決方案)及其附帶的中文文檔就是一個(gè)反面教材,其難用程度令人發(fā)指。當(dāng)然,除了不易用之外,還有訪問(wèn)速度緩慢,不適用于中國(guó)市...

    Vultr 評(píng)論0 收藏0
  • Image Load Error Handler

    Preface In the past, I posted an answer in SO about how to replace broken images. And the code is window.addEventListener( error, windowErrorCb, { capture: true }, true ) function windo...

    cocopeak 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<