摘要:從開始已經(jīng)支持事件捕獲了。刪除通過級方法指定的事件處理程序,只要將事件處理程序的屬性值設(shè)置為即可。如果是,則可以使用這個方法取消事件的進一步捕獲或冒泡,同時阻止任何事件處理程序被調(diào)用取消事件的進一步捕獲或冒泡。
從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-->是否可以取消事件的默認行為
currentTarget-->Boolean-->事件處理程序當(dāng)前正在處理事件的那個元素
defaultPrevented-->Boolean-->為true 表示已經(jīng)調(diào)用了preventDefault()
detail-->Integer-->與事件相關(guān)的細節(jié)信息
eventPhase-->Integer-->調(diào)用事件處理程序的階段:1表示捕獲階段,2表示“處于目標(biāo)”,3表示冒泡階段
preventDefault()-->Function-->取消事件的默認行為。如果cancelable是true,則可以使用這個方法
stopImmediatePropagation()-->Function-->取消事件的進一步捕獲或冒泡,同時阻止任何事件處理程序被調(diào)用
stopPropagation()-->Function-->取消事件的進一步捕獲或冒泡。如果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://www.ezyhdfw.cn/yun/83937.html
摘要:然而,雖然先生對無所不知,被譽為世界的愛因斯坦,但他的語言精粹并不適合初學(xué)者學(xué)習(xí)。即便如此,在后面我還是會建議把當(dāng)做補充的學(xué)習(xí)資源。但目前為止,依然是學(xué)習(xí)編程的好幫手。周正則表達式,對象,事件,閱讀權(quán)威指南第,,,章。 既然你找到這篇文章來,說明你是真心想學(xué)好JavaScript的。你沒有想錯,當(dāng)今如果要開發(fā)現(xiàn)代網(wǎng)站或web應(yīng)用(包括互聯(lián)網(wǎng)創(chuàng)業(yè)),都要學(xué)會JavaScript。而面對泛...
摘要:從數(shù)學(xué)博士到阿里云工程師,夏分一直學(xué)以致用。入職后的第個月,夏分接手了第一個項目,用工業(yè)大腦幫一家風(fēng)電企業(yè)提前預(yù)測風(fēng)電機組故障。一個萬千瓦的風(fēng)電場,平均每年維護費用高達萬元,還會以平均的速率逐年遞增。 從數(shù)學(xué)博士到阿里云工程師,夏分一直學(xué)以致用。加入阿里云接手的第一個ET工業(yè)大腦項目,因為數(shù)據(jù)傳輸問題丟失大量數(shù)據(jù),導(dǎo)致機器誤判拉響警報,這讓他意識到自己不能只坐在電腦前做碼農(nóng),也要下到車...
摘要:對微信小程序進行全局配置,決定頁面文件的路徑窗口表現(xiàn)設(shè)置網(wǎng)絡(luò)超時時間設(shè)置多等。 微信小程序知識總結(jié)及案例集錦 微信小程序的發(fā)展會和微信公眾號一樣,在某個時間點爆發(fā) 學(xué)習(xí)路徑 微信小程序最好的教程肯定是官方的文檔啦,點擊這里直達 微信官方文檔 認真跟著文檔看一遍,相信有vue前端經(jīng)驗的看下應(yīng)該就能上手了,然后安裝 微信小程序開發(fā)者工具 新建一個quick start項目,了解代碼結(jié)構(gòu),...
摘要:傳統(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...
閱讀 3209·2021-09-30 09:47
閱讀 2080·2021-09-22 16:04
閱讀 2348·2021-09-22 15:44
閱讀 2612·2021-08-25 09:38
閱讀 604·2019-08-26 13:23
閱讀 1290·2019-08-26 12:20
閱讀 2870·2019-08-26 11:59
閱讀 1142·2019-08-23 18:40