摘要:從開始已經支持事件捕獲了。刪除通過級方法指定的事件處理程序,只要將事件處理程序的屬性值設置為即可。如果是,則可以使用這個方法取消事件的進一步捕獲或冒泡,同時阻止任何事件處理程序被調用取消事件的進一步捕獲或冒泡。
從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的。你沒有想錯,當今如果要開發現代網站或web應用(包括互聯網創業),都要學會JavaScript。而面對泛...
摘要:從數學博士到阿里云工程師,夏分一直學以致用。入職后的第個月,夏分接手了第一個項目,用工業大腦幫一家風電企業提前預測風電機組故障。一個萬千瓦的風電場,平均每年維護費用高達萬元,還會以平均的速率逐年遞增。 從數學博士到阿里云工程師,夏分一直學以致用。加入阿里云接手的第一個ET工業大腦項目,因為數據傳輸問題丟失大量數據,導致機器誤判拉響警報,這讓他意識到自己不能只坐在電腦前做碼農,也要下到車...
摘要:對微信小程序進行全局配置,決定頁面文件的路徑窗口表現設置網絡超時時間設置多等。 微信小程序知識總結及案例集錦 微信小程序的發展會和微信公眾號一樣,在某個時間點爆發 學習路徑 微信小程序最好的教程肯定是官方的文檔啦,點擊這里直達 微信官方文檔 認真跟著文檔看一遍,相信有vue前端經驗的看下應該就能上手了,然后安裝 微信小程序開發者工具 新建一個quick start項目,了解代碼結構,...
摘要:傳統的網頁編程采用的三劍客來實現,在微信小程序中同樣有三劍客。觀察者模式不難實現,重點是如何在微信小程序中搭配其特有的生命周期來使用。交互事件傳統的事件傳遞類型有冒泡型與捕獲型,微信小程序中自然也有。 本文由作者鄒永勝授權網易云社區發布。 簡介為了更好的展示我們即時通訊SDK強悍的能力,網易云信IM SDK微信小程序DEMO的開發就提上了日程。用產品的話說就是: 云信 IM 小程序 S...
閱讀 3152·2021-09-30 09:47
閱讀 2003·2021-09-22 16:04
閱讀 2274·2021-09-22 15:44
閱讀 2534·2021-08-25 09:38
閱讀 540·2019-08-26 13:23
閱讀 1221·2019-08-26 12:20
閱讀 2808·2019-08-26 11:59
閱讀 1077·2019-08-23 18:40