摘要:事件流事件流描述的是頁(yè)面接收事件的順序的事件流是冒泡流而的事件流是事件捕獲流事件冒泡是指事件開(kāi)始時(shí)由最具體的元素,然后向上傳播到較為不具體的節(jié)點(diǎn)所有現(xiàn)代瀏覽器都支持事件冒泡則將事件一直冒泡到對(duì)象事件捕獲是不太具體的節(jié)點(diǎn)應(yīng)該更早接收到事件而具
事件流
事件流描述的是頁(yè)面接收事件的順序.IE的事件流是冒泡流,而 Netscape Communicator的事件流是事件捕獲流.
事件冒泡是指事件開(kāi)始時(shí)由最具體的元素,然后向上傳播到較為不具體的節(jié)點(diǎn).所有現(xiàn)代瀏覽器都支持事件冒泡,IE9,Firefox,chrome,safari則將事件一直冒泡到window對(duì)象.
事件捕獲是不太具體的節(jié)點(diǎn)應(yīng)該更早接收到事件,而具體的節(jié)點(diǎn)應(yīng)該最后接收到事件.
DOM事件流
DOM2級(jí)事件流規(guī)定的事件流包括三個(gè)階段: 事件捕獲階段 處于目標(biāo)階段 事件冒泡階段
以on+事件名(例如onclick)作為事件目標(biāo)的屬性,屬性值為事件處理程序,在html中定義的事件處理程序可以包含要執(zhí)行的具體動(dòng)作,也可以調(diào)用頁(yè)面其他地方定義的腳本.
function showMessage(){ alert("Hello world!"); }DOM0級(jí)事件處理程序
DOM0級(jí)事件處理程序是在js中處理的,它的優(yōu)勢(shì)是簡(jiǎn)單,目前所有瀏覽器支持良好,并且不會(huì)與html代碼產(chǎn)生耦合.
var btn = document.getElementById("btn"); btn.onclick = function(){ alert("clicked me!"); };
這里是把事件處理程序賦值給了DOM對(duì)象的屬性,這個(gè)屬性的構(gòu)成是on+事件名,比如onclick`onblur`onload.
DOM2級(jí)事件處理程序DOM2級(jí)事件定義了兩個(gè)方法addEventListener removeEventListener,這兩個(gè)方法都接收三個(gè)參數(shù).第一個(gè)參數(shù)代表事件類(lèi)型;第二個(gè)參數(shù)代表事件處理程序;第三個(gè)參數(shù)是指在冒泡階段還是捕獲階段處理事件處理程序,如果為true代表捕獲階段處理,如果是false代表冒泡階段處理.
IE9,google,F(xiàn)irefox兼容DOM2級(jí)事件處理程序.
var btn = document.getElementById("btn"); //事件處理程序 function handler(){ alert("click!"); } //注冊(cè)事件處理程序 addEventListener("click",handler,false); //注銷(xiāo)事件處理程序 removeEventListener("click",handler,false);
注:添加匿名事件處理程序無(wú)法被注銷(xiāo)
IE事件處理程序IE8及以下瀏覽器不支持DOM2級(jí)事件處理程序,但也自己定義了attachEvent`detachEvent`兩個(gè)方法,這兩個(gè)方法只接受兩個(gè)參數(shù),因?yàn)镮E8及以下版本不支持事件捕獲,所以沒(méi)有第三個(gè)參數(shù).
var btn = document.getElementByID("btn"); //事件處理程序 function handler(){ alert("click!"); } //注冊(cè)事件處理程序 attachEvent("click",handler,false); //注銷(xiāo)事件處理程序 detachEvent("click",handler,false);跨瀏覽器的事件處理程序
綜合以上幾種事件處理程序,我們封裝出了一個(gè)跨瀏覽器的事件處理程序?qū)ο?
var EventUtil ={ //注冊(cè)事件處理程序 addEventHandler: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; } }, //注銷(xiāo)事件處理程序 removeEventHandler: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; } } }; var btn = document.getElementById("btn"), handler=function(event){ alert(this.value); }; EventUtil.addEventHandler(btn,"click",handler);事件對(duì)象
DOM中的事件對(duì)象在觸發(fā)DOM的某個(gè)事件時(shí),會(huì)產(chǎn)生一個(gè)事件對(duì)象,這個(gè)對(duì)象包含著所有與事件相關(guān)的信息。包括導(dǎo)致事件的元素,事件的類(lèi)型,以及其他與特定事件相關(guān)的信息.例如鼠標(biāo)操作導(dǎo)致的事件對(duì)象中,包含鼠標(biāo)位置的信息,鍵盤(pán)定義的事件中包含按下鍵相關(guān)的信息.所有瀏覽器支持event對(duì)象,但支持方式不同.
兼容DOM的瀏覽器會(huì)將一個(gè)event對(duì)象傳入到事件處理程序中.DOM0和DOM2都會(huì)傳入event. html事件處理程序也有event對(duì)象.
var btn = document.getElementById("btn"); btn.onclick = function(event){ alert(event.type); } btn.addEventHandler("click",function(event){ alert(event.type); },false);
觸發(fā)的事件類(lèi)型不一樣,可用的屬性和方法也不一樣.不過(guò)所有事件的event對(duì)象都有公共成員,這里列出幾個(gè)常用的屬性和方法.
屬性
currentTarget 指向某個(gè)元素,事件處理程序發(fā)生在此元素上
target 事件的目標(biāo)
type 事件類(lèi)型
eventPhase 事件所處階段
事件
preventDefault() 取消事件的默認(rèn)行為
stopPropagation() 取消事件的進(jìn)一步冒泡或捕獲
在事件處理程序內(nèi)部,對(duì)象this始終等于currentTarget的值.而target則只包含事件的實(shí)際目標(biāo).
使用DOM0級(jí)事件處理程序時(shí),event對(duì)象作為window對(duì)象的一個(gè)屬性存在;
使用attachEvent()事件處理程序時(shí),event對(duì)象作為參數(shù)傳入.
var EventUtil = { //添加事件 addEventHandler: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; } }, //移除事件 removeEventHandler: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; } }, //獲取事件對(duì)象 getEvent: function (event) { return event ? event : window.event; }, //獲取事件目標(biāo) getTarget:function(event){ return event.target || event.srcElement; }, //阻止默認(rèn)行為 preventDefault:function(event){ if(event.preventDefault){ event.preventDefault(); } else{ event.returnValue = false; } }, //阻止事件冒泡 stopPropagation:function(event){ if(event.stopPropagation) { event.stopPropagation(); } else{ event.cancelBubble=true; } } };
使用以上定義的EventUtil對(duì)象,可以在所有瀏覽器中進(jìn)行進(jìn)行事件的添加,移除,獲取事件對(duì)象,獲取事件目標(biāo),阻止事件冒泡,阻止事件默認(rèn)行為.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/91546.html
摘要:異步任務(wù)必須指定回調(diào)函數(shù),當(dāng)異步任務(wù)從任務(wù)隊(duì)列回到執(zhí)行棧,回調(diào)函數(shù)就會(huì)執(zhí)行。事件循環(huán)主線(xiàn)程從任務(wù)隊(duì)列中讀取事件,這個(gè)過(guò)程是循環(huán)不斷的,所以整個(gè)的這種運(yùn)行機(jī)制又稱(chēng)為。事件循環(huán)事件循環(huán)是指主線(xiàn)程重復(fù)從消息隊(duì)列中取消息執(zhí)行的過(guò)程。 參考鏈接:這一次,徹底弄懂 JavaScript 執(zhí)行機(jī)制https://zhuanlan.zhihu.com/p/...從瀏覽器多進(jìn)程到JS單線(xiàn)程,JS運(yùn)行機(jī)制...
摘要:關(guān)于節(jié)流的實(shí)現(xiàn),有兩種主流的實(shí)現(xiàn)方式,一種是使用時(shí)間戳,一種是設(shè)置定時(shí)器。當(dāng)觸發(fā)事件的時(shí)候,我們?cè)O(shè)置一個(gè)定時(shí)器,再觸發(fā)事件的時(shí)候,如果定時(shí)器存在,就不執(zhí)行,直到定時(shí)器執(zhí)行,然后執(zhí)行函數(shù),清空定時(shí)器,這樣就可以設(shè)置下個(gè)定時(shí)器。 JavaScript 專(zhuān)題系列第二篇,講解節(jié)流,帶你從零實(shí)現(xiàn)一個(gè) underscore 的 throttle 函數(shù) 前言 在《JavaScript專(zhuān)題之跟著und...
摘要:書(shū)接上文瀏覽器內(nèi)核之資源加載與網(wǎng)絡(luò)棧本文介紹的模型之后,深入的核心部分,剖析的解釋器是如何將從網(wǎng)絡(luò)或者本地文件獲取的字節(jié)流轉(zhuǎn)成內(nèi)部表示的結(jié)構(gòu)樹(shù)。事件處理最重要就是事件捕獲和事件冒泡這兩種機(jī)制。 showImg(https://segmentfault.com/img/remote/1460000016215814); 微信公眾號(hào):愛(ài)寫(xiě)bugger的阿拉斯加如有問(wèn)題或建議,請(qǐng)后臺(tái)留言,我...
摘要:事件捕獲的用意在于事件到達(dá)預(yù)定目標(biāo)之前捕獲它。級(jí)事件流規(guī)定的事件流包括三個(gè)階段事件捕獲階段處于目標(biāo)階段和冒泡階段。首先發(fā)生的是事件捕獲,為截獲事件提供了機(jī)會(huì)。最后一個(gè)階段是冒泡階段,可以在這個(gè)階段對(duì)事件作出響應(yīng)。 一.基本概念:事件流是什么?有哪些事件流? 事件流是描述頁(yè)面接收事件的順序 具體的有 事件冒泡 事件捕獲 DOM事件流 事件冒泡又叫IE的事件流,即事件...
摘要:特性這樣指定事件處理程序具有一些獨(dú)到之處。級(jí)事件處理程序通過(guò)獲得要操作對(duì)象的引用,用把一個(gè)函數(shù)賦值給一個(gè)事件處理程序?qū)傩裕热?。以這種方式添加的事件處理程序會(huì)在事件流的冒泡階段被捕獲。級(jí)事件處理程序級(jí)事件定義了兩個(gè)方法,。 一、事件處理程序 響應(yīng)某個(gè)事件的函數(shù)叫做事件處理程序(或事件偵聽(tīng)器),為事件指定處理程序的方式有下面幾種。 1、html特性 這樣指定事件處理程序具有一些獨(dú)到之處...
閱讀 3343·2021-11-24 09:38
閱讀 2218·2021-11-23 09:51
閱讀 1799·2021-10-13 09:39
閱讀 2682·2021-09-23 11:53
閱讀 1466·2021-09-02 15:40
閱讀 3701·2019-08-30 15:54
閱讀 1184·2019-08-30 13:04
閱讀 2626·2019-08-30 11:01