成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JS事件總結(jié)--試驗過的一些小經(jīng)驗

Eastboat / 1603人閱讀

摘要:從開始已經(jīng)支持事件捕獲了。刪除通過級方法指定的事件處理程序,只要將事件處理程序的屬性值設(shè)置為即可。如果是,則可以使用這個方法取消事件的進(jìn)一步捕獲或冒泡,同時阻止任何事件處理程序被調(diào)用取消事件的進(jìn)一步捕獲或冒泡。

從IE9開始已經(jīng)支持事件捕獲了。
刪除通過DOM0級方法指定的事件處理程序,只要將事件處理程序的屬性值設(shè)置為null即可。
btn.onclick=null;

attachEvent的事件名稱是onclick,而addEventListener的事件名稱是click

        var btn = document.getElementById("btn");
        btn.onclick = function () {
            alert(this.id);
        }        
        btn.addEventListener("click", function (e) {
            alert("我是來測試chrome的");
        }, false);
        btn.attachEvent("onclick", function (e) {
            alert("我是來測試ie的");
        });

上述代碼在ie9下居然三個alert都彈出來了,也就是說其實從ie9開始已經(jīng)走的事件捕獲模式了,趨向于dom標(biāo)準(zhǔn),但是又沒有完全廢棄自己原先的一套規(guī)則,所以兩種事件監(jiān)聽它都支持。

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

上述代碼在ie8及以下瀏覽器,彈出alert框的順序為2,1,但在ie9下彈出alert框的順序為1,2

        var btn = document.getElementById("btn"); 
        btn.addEventListener("click",function(e){
            alert(1);
        });
        btn.addEventListener("click",function(e){
            alert(2);
        });

事實上DOM2級標(biāo)準(zhǔn)就是按照添加事件的順序注冊的,也就是說在firefox、chrome等瀏覽器下,彈出alert框的順序是1,2
在ie下,事件處理程序是在全局作用域下運行的,所以事件處理程序中的this其實就是window(基于上面的經(jīng)驗,ie9開始趨向于DOM標(biāo)準(zhǔn),我又特意做了測試,結(jié)果alert的也是true,我有點暈)

        var btn = document.getElementById("btn"); 
        btn.attachEvent("onclick", function (e) {
            alert(this===window);   //true
        });

在chrome等瀏覽器下,this指向的是當(dāng)前對象

        var btn = document.getElementById("btn"); 
       
        btn.addEventListener("click",function(e){
            alert(this===btn);    //true        
        });     

在dom0級別的事件綁定中,ie8及以下瀏覽器中e輸出的為undefined,而chrome下的e輸出的對象跟dom2級別中的e完全一樣

        var btn = document.getElementById("btn");
        btn.onclick = function (e) {
            console.log(e);//此處在ie8及以下輸出的是undefined而在ie9下輸出的是object MouseEvent
        }
        btn.attachEvent("onclick", function (e) {
            console.log(e);//在ie7下輸出的是object,在ie8及以下輸出的是object Event,而在ie9下輸出的是object MSEventObj
        });
        var btn = document.getElementById("btn");
        btn.onclick = function (e) {
            console.log(e);//在chrome下,此處的e和下面的e輸出的都是MouseEvent
        }        
        btn.addEventListener("click", function (e) {
            console.log(e);
        });

看一下chome下輸出的e是啥吧

說說這里面有哪些重要的屬性/方法吧
bubbles-->Boolean-->事件是否冒泡

cancelable-->Boolean-->是否可以取消事件的默認(rèn)行為

currentTarget-->Boolean-->事件處理程序當(dāng)前正在處理事件的那個元素

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,則可以使用這個方法

stopImmediatePropagation()-->Function-->取消事件的進(jìn)一步捕獲或冒泡,同時阻止任何事件處理程序被調(diào)用

stopPropagation()-->Function-->取消事件的進(jìn)一步捕獲或冒泡。如果bubbles為true,則可以使用這個方法

target-->Element-->事件的目標(biāo)

type-->String-->被觸發(fā)的事件的類型

其實我自己也沒有搞清楚stopImmediatePropagation和stopPropagation的區(qū)別,太多方法

需要理解currentTarget和target的區(qū)別及聯(lián)系,在事件處理程序內(nèi)部,this始終等于currentTarget值,即currentTarget是指當(dāng)前被觸發(fā)或者說正在處理事件的那個元素,而target是指當(dāng)前的目標(biāo)元素;看看代碼具體解釋一下:`

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

對btn按鈕觸發(fā)點擊事件,那么e.currentTraget指向了this,e.target也指向了this
而如果是對body綁定事件處理程序,那么e.currentTarget就指向了document.body了,那么e.target 指向與 btn那個元素

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
};

由于ie下事件處理程序的作用域是在全局使用域下,所以它的event對象也是通過window.event來
一般最簡化的跨瀏覽器的事件通用js如下:

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;
        }
    }
};

哪些事件不能冒泡:在我知曉的范圍內(nèi)有focus、blur、unload、load、mouseEnter、mouseLeave

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/83937.html

相關(guān)文章

  • 如何正確學(xué)習(xí)JavaScript

    摘要:然而,雖然先生對無所不知,被譽為世界的愛因斯坦,但他的語言精粹并不適合初學(xué)者學(xué)習(xí)。即便如此,在后面我還是會建議把當(dāng)做補充的學(xué)習(xí)資源。但目前為止,依然是學(xué)習(xí)編程的好幫手。周正則表達(dá)式,對象,事件,閱讀權(quán)威指南第,,,章。 既然你找到這篇文章來,說明你是真心想學(xué)好JavaScript的。你沒有想錯,當(dāng)今如果要開發(fā)現(xiàn)代網(wǎng)站或web應(yīng)用(包括互聯(lián)網(wǎng)創(chuàng)業(yè)),都要學(xué)會JavaScript。而面對泛...

    canger 評論0 收藏0
  • 專訪第一代車間程序員:ET工業(yè)大腦數(shù)學(xué)博士夏分

    摘要:從數(shù)學(xué)博士到阿里云工程師,夏分一直學(xué)以致用。入職后的第個月,夏分接手了第一個項目,用工業(yè)大腦幫一家風(fēng)電企業(yè)提前預(yù)測風(fēng)電機組故障。一個萬千瓦的風(fēng)電場,平均每年維護(hù)費用高達(dá)萬元,還會以平均的速率逐年遞增。 從數(shù)學(xué)博士到阿里云工程師,夏分一直學(xué)以致用。加入阿里云接手的第一個ET工業(yè)大腦項目,因為數(shù)據(jù)傳輸問題丟失大量數(shù)據(jù),導(dǎo)致機器誤判拉響警報,這讓他意識到自己不能只坐在電腦前做碼農(nóng),也要下到車...

    h9911 評論0 收藏0
  • 微信程序知識總結(jié)及案例集錦

    摘要:對微信小程序進(jìn)行全局配置,決定頁面文件的路徑窗口表現(xiàn)設(shè)置網(wǎng)絡(luò)超時時間設(shè)置多等。 微信小程序知識總結(jié)及案例集錦 微信小程序的發(fā)展會和微信公眾號一樣,在某個時間點爆發(fā) 學(xué)習(xí)路徑 微信小程序最好的教程肯定是官方的文檔啦,點擊這里直達(dá) 微信官方文檔 認(rèn)真跟著文檔看一遍,相信有vue前端經(jīng)驗的看下應(yīng)該就能上手了,然后安裝 微信小程序開發(fā)者工具 新建一個quick start項目,了解代碼結(jié)構(gòu),...

    sean 評論0 收藏0
  • 微信程序開發(fā)中的二三事之網(wǎng)易云信IMSDK DEMO

    摘要:傳統(tǒng)的網(wǎng)頁編程采用的三劍客來實現(xiàn),在微信小程序中同樣有三劍客。觀察者模式不難實現(xiàn),重點是如何在微信小程序中搭配其特有的生命周期來使用。交互事件傳統(tǒng)的事件傳遞類型有冒泡型與捕獲型,微信小程序中自然也有。 本文由作者鄒永勝授權(quán)網(wǎng)易云社區(qū)發(fā)布。 簡介為了更好的展示我們即時通訊SDK強悍的能力,網(wǎng)易云信IM SDK微信小程序DEMO的開發(fā)就提上了日程。用產(chǎn)品的話說就是: 云信 IM 小程序 S...

    weij 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<