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

資訊專欄INFORMATION COLUMN

JS事件總結--試驗過的一些小經驗

Eastboat / 1551人閱讀

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

從IE9開始已經支持事件捕獲了。
刪除通過DOM0級方法指定的事件處理程序,只要將事件處理程序的屬性值設置為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開始已經走的事件捕獲模式了,趨向于dom標準,但是又沒有完全廢棄自己原先的一套規則,所以兩種事件監聽它都支持。

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

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

在chrome等瀏覽器下,this指向的是當前對象

        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-->是否可以取消事件的默認行為

currentTarget-->Boolean-->事件處理程序當前正在處理事件的那個元素

defaultPrevented-->Boolean-->為true 表示已經調用了preventDefault()

detail-->Integer-->與事件相關的細節信息

eventPhase-->Integer-->調用事件處理程序的階段:1表示捕獲階段,2表示“處于目標”,3表示冒泡階段

preventDefault()-->Function-->取消事件的默認行為。如果cancelable是true,則可以使用這個方法

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

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

target-->Element-->事件的目標

type-->String-->被觸發的事件的類型

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

需要理解currentTarget和target的區別及聯系,在事件處理程序內部,this始終等于currentTarget值,即currentTarget是指當前被觸發或者說正在處理事件的那個元素,而target是指當前的目標元素;看看代碼具體解釋一下:`

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

對btn按鈕觸發點擊事件,那么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;
        }
    }
};

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83937.html

相關文章

  • 如何正確學習JavaScript

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

    canger 評論0 收藏0
  • 專訪第一代車間程序員:ET工業大腦數學博士夏分

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

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

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

    sean 評論0 收藏0
  • 微信程序開發中的二三事之網易云信IMSDK DEMO

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

    weij 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<