摘要:本文是重溫基礎(chǔ)系列文章的第二十篇。事件捕獲為截獲事件提供機(jī)會(huì),然后實(shí)際的目標(biāo)接收到事件,最后事件冒泡,對(duì)事件作出響應(yīng)。事件處理事件處理,即響應(yīng)某個(gè)事件。包括導(dǎo)致事件的元素事件類型等其他信息。
本文是 重溫基礎(chǔ) 系列文章的第二十篇。
這是第三個(gè)基礎(chǔ)系列的第一篇,歡迎持續(xù)關(guān)注呀!
重溫基礎(chǔ) 系列的【初級(jí)】和【中級(jí)】的文章,已經(jīng)統(tǒng)一整理到我的【Cute-JavaScript】的JavaScript基礎(chǔ)系列中。
今日感受:電影有時(shí)候看的是緣分。
系列目錄:
【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理)
【重溫基礎(chǔ)】1-14篇
【重溫基礎(chǔ)】15.JS對(duì)象介紹
【重溫基礎(chǔ)】16.JSON對(duì)象介紹
【重溫基礎(chǔ)】17.WebAPI介紹
【重溫基礎(chǔ)】18.相等性判斷
【重溫基礎(chǔ)】19.閉包
本章節(jié)復(fù)習(xí)的是JS中的事件,事件冒泡捕獲代理模擬等等。
前置知識(shí):
JavaScript與HTML的交互式通過(guò)事件來(lái)實(shí)現(xiàn)的,是文檔或?yàn)g覽器窗口中發(fā)生的一些特定的交互瞬間。
事件流描述的是從頁(yè)面中接收事件的順序,通常有這樣兩種完全相反的事件流概念:事件冒泡流(IE團(tuán)隊(duì)提出)和事件捕獲流(網(wǎng)景團(tuán)隊(duì)提出)。
1.1 事件冒泡冒泡事件(Event Bubbling):事件開(kāi)始時(shí)由最具體的元素接收(文檔中嵌套層次最深的那個(gè)節(jié)點(diǎn)),然后逐層向上傳播到較為不具體的節(jié)點(diǎn)(文檔),看下示例代碼:
leo 事件冒泡 點(diǎn)擊
點(diǎn)擊頁(yè)面中
document 由此可見(jiàn),元素綁定的事件會(huì)通過(guò)DOM樹(shù)向上傳播,每層節(jié)點(diǎn)都會(huì)發(fā)生,直到document對(duì)象,如圖展示了冒泡過(guò)程: 事件捕獲(Event Capturing):讓不太具體的節(jié)點(diǎn)更早接收事件,而最具體的節(jié)點(diǎn)最后接收事件,即在事件到達(dá)預(yù)定目標(biāo)之前捕獲到,看下示例代碼(HTML代碼和前面一樣),事件捕獲的過(guò)程是這樣的: document
看得出,document對(duì)象最新接收事件,然后沿DOM樹(shù)依次向下,直到最后的實(shí)際目標(biāo) 注意:由于老版本的瀏覽器不支持,因此很少人使用事件捕獲,不過(guò)如果特殊需求還是可以使用事件捕獲,建議還是使用事件冒泡。 “DOM2級(jí)事件”規(guī)定的事件流包含三個(gè)階段:事件捕獲階段,處于目標(biāo)階段和事件冒泡階段。 在DOM事件流中,實(shí)際目標(biāo)( 注意:目前主流瀏覽器都支持DOM事件流,只有IE8和之前版本不支持。 事件處理,即響應(yīng)某個(gè)事件。我們把事件處理的函數(shù),稱為“事件處理程序”。 HTML事件處理程序 DOM0級(jí)事件處理程序 DOM2級(jí)事件處理程序 IE事件處理程序 跨瀏覽器事件處理程序 某個(gè)元素支持的事件,都可以用一個(gè)與相應(yīng)事件處理程序同名的HTML特性來(lái)指定,這個(gè)特性的值應(yīng)該是能夠執(zhí)行的JavaScript代碼。比如: 也可以把需要執(zhí)行的具體事件多帶帶定義出來(lái),可以放置與多帶帶.js文件,也可以在文檔內(nèi)用標(biāo)簽引入: 我們通過(guò)這樣指定事件處理程序,可以有一個(gè)局部變量event來(lái)獲取事件對(duì)象本身,在這個(gè)函數(shù)內(nèi)部,this值等于這個(gè)變量event。 另外,HTML中指定事件處理程序,會(huì)有2個(gè)缺點(diǎn): 存在時(shí)間差 可能出現(xiàn)這樣的情況:HTML元素觸發(fā)事件,但是事件處理程序還未定義(函數(shù)的定義在HTML最底下定義),就會(huì)出現(xiàn)報(bào)錯(cuò),這與HTML代碼加載順序有關(guān)。 作用域鏈的異常 由于不同瀏覽器JavaScript引擎遵循的標(biāo)識(shí)符解析規(guī)則存在差異,導(dǎo)致訪問(wèn)非限定對(duì)象成員時(shí)出錯(cuò),表現(xiàn)為事件處理程序的作用域鏈在不同瀏覽器結(jié)果不同。 HTML和JavaScript代碼緊密耦合 這常常就是很多開(kāi)發(fā)人員放棄HTML事件處理程序的原因。 通過(guò)賦值形式,將一個(gè)函數(shù)賦值給一個(gè)事件處理程序?qū)傩?。每個(gè)元素(包含window和document)都有自己的事件處理屬性,這些屬性通常全部小寫(xiě),如onclick,將這種屬性的值設(shè)置成一個(gè)函數(shù),就可以指定事件處理程序: 使用DOM0級(jí)方法指定事件處理程序,被認(rèn)為是元素的方法。此時(shí)的事件處理程序是在元素的作用域執(zhí)行,那么,this就引用當(dāng)前元素,可以訪問(wèn)元素的任何屬性和方法: 我們也可以通過(guò)設(shè)置事件處理程序?qū)傩詠?lái)刪除DOM0級(jí)的事件處理程序。 有2個(gè)方法: 添加事件處理程序:addEventListener()
刪除事件處理程序:removeEventListener()
所有的DOM節(jié)點(diǎn)都包含這兩個(gè)方法,并且它們都接收三個(gè)參數(shù): 處理的事件名稱 事件處理程序的函數(shù) 布爾值(true:事件捕獲階段調(diào)用,false:事件冒泡階段調(diào)用) 與DOM0級(jí)方法一樣,這里的事件處理程序也會(huì)是在元素的作用域中執(zhí)行,因此this也是指向元素,可以訪問(wèn)元素的任何屬性和方法。 使用DOM2級(jí)方法,可以添加多個(gè)事件處理程序,并按照添加順序觸發(fā): 注意:通過(guò)addEventListener()添加的事件只能通過(guò)removeEventListener()移除,并且兩者傳入的參數(shù)一致,這就意味著通過(guò)addEventListener()添加的匿名函數(shù)不能被移除,看下面代碼: 沒(méi)有效果是因?yàn)檫@兩個(gè)方法傳入的函數(shù),是完全不同的,為了達(dá)到刪除事件處理程序的效果,我們可以將處理函數(shù)多帶帶定義出來(lái): IE實(shí)現(xiàn)兩種方法: attachEvent()和detachEvent()。這兩個(gè)方法接收相同的兩個(gè)參數(shù):事件處理程序名稱和事件處理程序函數(shù)。 注意:這里的第一個(gè)參數(shù)是onclick而不是DOM的addEventListener()的click。 IE的attachEvent()和DOM0級(jí)方法區(qū)別: DOM0級(jí)方法,作用域在所屬元素的作用域。 attachEvent(),作用域在全局作用域,即this指向window。 和DOM0級(jí)方法一樣,detachEvent()只能移除使用attachEvent()添加的方法,為了避免無(wú)法移除,也是需要將處理的函數(shù)多帶帶定義出來(lái): 在做跨瀏覽器事件處理程序,我們可以有兩種方式: 使用能夠隔離瀏覽器差異的JavaScript庫(kù) 多帶帶手寫(xiě)一個(gè)處理方法 我們多帶帶受寫(xiě)一個(gè)處理方法也不難,只需關(guān)注好事件冒泡階段,我們可以創(chuàng)建一個(gè)方法,區(qū)分使用DOM0級(jí)方法、DOM2級(jí)方法或IE方法即可,默認(rèn)采用DOM0級(jí)方法。 當(dāng)觸發(fā)一個(gè)DOM上的事件時(shí),都會(huì)產(chǎn)生一個(gè)事件對(duì)象event,并作為參數(shù)傳入事件處理程序,這個(gè)對(duì)象包含所有與事件相關(guān)的信息。包括導(dǎo)致事件的元素、事件類型等其他信息。 無(wú)論指定事件處理程序時(shí)使用什么方法(DOM0級(jí)方法或DOM2級(jí)方法),都會(huì)傳入event對(duì)象: event對(duì)象包含與創(chuàng)建它的特定事件相關(guān)的屬性和方法,常常有如下成員: 我們可以使用event中的對(duì)象和方法: 阻止事件的默認(rèn)行為 立即停止事件在DOM的傳播 通過(guò)調(diào)用event.stopPropagation()方法避免彈框出現(xiàn)兩次。 訪問(wèn)IE中的事件對(duì)象event,方法有多種,取決于事件處理程序的方法: DOM0級(jí)方法,使用window.event
IE的attachEvent方法,event作為參數(shù)傳入(也可以使用window.event) 雖然DOM和IE中event對(duì)象不同,但我們也可以和前面的 跨瀏覽器事件處理程序 處理一樣,通過(guò)他們之間的區(qū)別,實(shí)現(xiàn)映射: Web瀏覽器中的事件類型有很多,DOM3級(jí)事件規(guī)定有以下幾類事件類型:
UI事件:當(dāng)用戶與頁(yè)面上元素交互時(shí)觸發(fā);
焦點(diǎn)事件:當(dāng)元素失去或獲取焦點(diǎn)時(shí)觸發(fā);
鼠標(biāo)事件:當(dāng)用戶通過(guò)鼠標(biāo)在頁(yè)面操作時(shí)觸發(fā);
滾輪事件:當(dāng)使用鼠標(biāo)滾輪(或類似設(shè)備)時(shí)觸發(fā);
文本事件:當(dāng)在文檔中輸入文本時(shí)觸發(fā);
鍵盤(pán)事件:當(dāng)用戶通過(guò)鍵盤(pán)操作時(shí)觸發(fā);
合成事件:當(dāng)為IME輸入字符時(shí)觸發(fā);
變動(dòng)事件:當(dāng)?shù)讓覦OM結(jié)構(gòu)變動(dòng)時(shí)觸發(fā); 具體每個(gè)方法的詳細(xì)介紹,可以查看W3school HTML DOM Event 對(duì)象 簡(jiǎn)單理解就是講一個(gè)響應(yīng)事件委托到另一個(gè)元素。 下面我們?cè)?strong>DOM樹(shù)層級(jí)更高的元素上添加一個(gè)事件處理函數(shù),來(lái)做事件委托,我們這么重寫(xiě)這段代碼: 最適合采用事件委托技術(shù)的事件包括:click/mousedown/mouseup/keyup/keydown/keypress,雖然mouseover和mouseout事件也有冒泡,但因?yàn)椴缓锰幚硭鼈儾⑶医?jīng)常需要重新計(jì)算元素位置。 可以看出,事件委托有以下優(yōu)點(diǎn): 減少內(nèi)存消耗 動(dòng)態(tài)綁定事件 JavaScript的事件模擬主要用來(lái)在任意時(shí)刻觸發(fā)特定事件。 在document對(duì)象上使用createEvent()方法創(chuàng)建一個(gè)event對(duì)象。 UIEvents : 一般化的UI事件(鼠標(biāo)和鍵盤(pán)事件都繼承自UI事件)(DOM3級(jí)中UIEvent) MouseEvents : 一般化的鼠標(biāo)事件(DOM3級(jí)中MouseEvent) MutationEvents : 一般化的DOM滾動(dòng)事件(DOM3級(jí)中MutationEvent) HTMLEvents : 一般化的HTML事件(DOM3級(jí)中HTMLEvent) 創(chuàng)建event之后,我們需要使用dispatchEvent()方法去觸發(fā)這個(gè)事件,需要傳入一個(gè)參數(shù),參數(shù)是需要觸發(fā)事件的event對(duì)象。 所有支持事件的DOM節(jié)點(diǎn)都支持這個(gè)方法。事件觸發(fā)之后,事件就能照樣冒泡并引發(fā)響應(yīng)事件處理程序的執(zhí)行。 使用createEvent()方法傳入MouseEvents創(chuàng)建一個(gè)鼠標(biāo)事件,返回的對(duì)象有一個(gè)initMouseEvent()方法,用于指定與該鼠標(biāo)事件相關(guān)的信息,有15個(gè)參數(shù): type : 字符串,表示觸發(fā)的事件類型,如click
bubble : 布爾值,表示是否冒泡,為了精確模擬鼠標(biāo)事件,通常設(shè)置為true cancelable :布爾值,表示是否可以取消,為了精確模擬鼠標(biāo)事件,通常設(shè)置為true view : 與事件關(guān)聯(lián)的視圖,基本都設(shè)置為document.defaultView
detail : 整數(shù),與事件有關(guān)的詳細(xì)信息,基本設(shè)置為0 screenX : 整數(shù),事件相對(duì)屏幕的X坐標(biāo) screenY : 整數(shù),事件相對(duì)屏幕的Y坐標(biāo) clientX : 整數(shù),事件相對(duì)視口的X坐標(biāo) clientY : 整數(shù),事件相對(duì)視口的Y坐標(biāo) ctrlKey : 布爾值,表示是否按下Ctrl鍵,默認(rèn)false altKey : 布爾值,表示是否按下Alt鍵,默認(rèn)false shiftKey : 布爾值,表示是否按下Shift鍵,默認(rèn)false metaKey : 布爾值,表示是否按下Meta鍵,默認(rèn)false button : 整數(shù),表示按下哪個(gè)鼠標(biāo)鍵,默認(rèn)0 relatedTarget : 對(duì)象,表示與事件相關(guān)的對(duì)象,只在mouseover和mouseout時(shí)使用 案例: DOM3級(jí)規(guī)定,使用createEvent()方法傳入KeyboardEvent創(chuàng)建一個(gè)鍵盤(pán)事件,返回的對(duì)象有一個(gè)initKeyEvent()方法,有8個(gè)參數(shù): type : 字符串,表示觸發(fā)的事件類型,如keydown
bubble : 布爾值,表示是否冒泡,為了精確模擬鍵盤(pán)事件,通常設(shè)置為true cancelable :布爾值,表示是否可以取消,為了精確模擬鍵盤(pán)事件,通常設(shè)置為true view : 與事件關(guān)聯(lián)的視圖,基本都設(shè)置為document.defaultView
key : 整數(shù),表示按下的鍵的鍵碼 localtion : 整數(shù),表示按下哪里的鍵,默認(rèn)0表示主鍵盤(pán),1表示左,2表示右,3表示數(shù)字鍵盤(pán),4表示移動(dòng)設(shè)備(即虛擬鍵盤(pán)),5表示手柄 modifiers : 字符串,空格分隔的修改件列表,如"shift" repeat : 整數(shù),在一行中按了多少次這個(gè)鍵 由于DOM3級(jí)不提倡使用keypress事件,因此只能用這個(gè)方式來(lái)模擬keyup/keydown事件。 模擬按住Shift和A鍵的案例: 如模擬變動(dòng)事件和HTML事件。 模擬變動(dòng)事件
通過(guò)createEvent()傳入MutationEvents參數(shù)創(chuàng)建,返回一個(gè)initMutationEvent()方法,這個(gè)方法接收參數(shù)包括:type/bubbles/cancelable/relatedNode/preValue/newValue/attrName/attrChange,下面模擬一個(gè)案例: 模擬HTML事件
通過(guò)createEvent()傳入HTMLEvents參數(shù)創(chuàng)建,返回一個(gè)initEvent()方法,下面模擬一個(gè)案例: 通過(guò)createEvent()傳入CustomEvent參數(shù)創(chuàng)建,返回一個(gè)initCustomEvent()方法,有4個(gè)參數(shù): type : 字符串,表示觸發(fā)的事件類型,如keydown
bubble : 布爾值,表示是否冒泡,為了精確模擬鍵盤(pán)事件,通常設(shè)置為true cancelable :布爾值,表示是否可以取消,為了精確模擬鍵盤(pán)事件,通常設(shè)置為true detail : 對(duì)象,任意值,保存在event對(duì)象的detail屬性中 案例: IE8及之前的版本模擬事件和DOM中模擬思路相似:想創(chuàng)建event對(duì)象再指定信息,最后觸發(fā)。 《JavaScript高級(jí)程序設(shè)計(jì)》第13章 事件 本部分內(nèi)容到這結(jié)束 歡迎關(guān)注微信公眾號(hào)【前端自習(xí)課】每天早晨,與您一起學(xué)習(xí)一篇優(yōu)秀的前端技術(shù)博文 . 文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/108871.html 摘要:歡迎您的支持系列目錄復(fù)習(xí)資料資料整理個(gè)人整理重溫基礎(chǔ)篇重溫基礎(chǔ)對(duì)象介紹重溫基礎(chǔ)對(duì)象介紹重溫基礎(chǔ)介紹重溫基礎(chǔ)相等性判斷重溫基礎(chǔ)閉包重溫基礎(chǔ)事件本章節(jié)復(fù)習(xí)的是中的高階函數(shù),可以提高我們的開(kāi)發(fā)效率。
本文是 重溫基礎(chǔ) 系列文章的第二十一篇。 今日感受:想家。
本人自己整理的【Cute-JavaScript】資料,包含:【ES6/ES7/ES8/ES9】,【JavaScript基礎(chǔ)... 摘要:內(nèi)存泄露內(nèi)存泄露概念在計(jì)算機(jī)科學(xué)中,內(nèi)存泄漏指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存。判斷內(nèi)存泄漏,以字段為準(zhǔn)。
本文是 重溫基礎(chǔ) 系列文章的第二十二篇。 今日感受:優(yōu)化學(xué)習(xí)方法。
系列目錄:
【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理)
【重溫基礎(chǔ)】1-14篇
【重溫基礎(chǔ)】15.JS對(duì)象介紹
【重溫基礎(chǔ)】16.JSON對(duì)象介紹
【重溫基礎(chǔ)】1... 摘要:本文是重溫基礎(chǔ)系列文章的第七篇。系列目錄復(fù)習(xí)資料資料整理個(gè)人整理重溫基礎(chǔ)語(yǔ)法和數(shù)據(jù)類型重溫基礎(chǔ)流程控制和錯(cuò)誤處理重溫基礎(chǔ)循環(huán)和迭代重溫基礎(chǔ)函數(shù)重溫基礎(chǔ)表達(dá)式和運(yùn)算符重溫基礎(chǔ)數(shù)字本章節(jié)復(fù)習(xí)的是中的時(shí)間對(duì)象,一些處理的方法。
本文是 重溫基礎(chǔ) 系列文章的第七篇。今日感受:做好自律。
系列目錄:
【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理)
【重溫基礎(chǔ)】1.語(yǔ)法和數(shù)據(jù)類型... 摘要:本文是重溫基礎(chǔ)系列文章的第十七篇。系列目錄復(fù)習(xí)資料資料整理個(gè)人整理重溫基礎(chǔ)篇重溫基礎(chǔ)對(duì)象介紹重溫基礎(chǔ)對(duì)象介紹本章節(jié)復(fù)習(xí)的是中的關(guān)于相關(guān)知識(shí),介紹的比較多。表示在給定的時(shí)間的相關(guān)設(shè)備的位置。所有現(xiàn)代瀏覽器均支持對(duì)象和使用。
本文是 重溫基礎(chǔ) 系列文章的第十七篇。今日感受:挑戰(zhàn)。
系列目錄:
【復(fù)習(xí)資料】ES6/ES7/ES8/ES9資料整理(個(gè)人整理)
【重溫基礎(chǔ)】1-14篇
【... 摘要:本文是重溫基礎(chǔ)系列文章的第十四篇。元,是指程序本身。有理解不到位,還請(qǐng)指點(diǎn),具體詳細(xì)的介紹,可以查看維基百科元編程。攔截,返回一個(gè)布爾值。
本文是 重溫基礎(chǔ) 系列文章的第十四篇。 這是第一個(gè)基礎(chǔ)系列的最后一篇,后面會(huì)開(kāi)始復(fù)習(xí)一些中級(jí)的知識(shí)了,歡迎持續(xù)關(guān)注呀! 接下來(lái)會(huì)統(tǒng)一整理到我的【Cute-JavaScript】的JavaScript基礎(chǔ)系列中。
今日感受:獨(dú)樂(lè)樂(lè)不如眾樂(lè)樂(lè)... 閱讀 2164·2021-11-24 09:39 閱讀 1656·2021-10-11 10:59 閱讀 2575·2021-09-24 10:28 閱讀 3459·2021-09-08 09:45 閱讀 1344·2021-09-07 10:06 閱讀 1749·2019-08-30 15:53 閱讀 2145·2019-08-30 15:53 閱讀 1477·2019-08-30 15:53
事件捕獲為截獲事件提供機(jī)會(huì),然后實(shí)際的目標(biāo)接收到事件,最后事件冒泡,對(duì)事件作出響應(yīng)。按照前面的HTML代碼,整個(gè)流程是這樣的:
事件處理程序的名稱一般都以on開(kāi)頭,如click事件的事件處理程序就是onclick,load事件的事件處理程序就是onload。
我們將事件處理程序,分為這么幾類:function fun(){
alert("hello leo");
}
var leo = document.getElementById("leo");
leo.onclick = function(){
alert("hello leo!");
}
var leo = document.getElementById("leo");
leo.onclick = function(){
alert(this.id); // "leo"
}
leo.onclick = null;
2.3 DOM2級(jí)事件處理程序
var leo = document.getElementById("leo");
leo.addEventListener("click",function(){
alert(this.id); // "leo"
},false);
var leo = document.getElementById("leo");
leo.addEventListener("click",function(){
alert(this.id); // "leo"
},false);
leo.addEventListener("click",function(){
alert("hello leo!"); // "hello leo!"
},false);
var leo = document.getElementById("leo");
leo.addEventListener("click",function(){
alert(this.id); // "leo"
},false);
// 沒(méi)有效果
leo.removeEventListener("click",function(){
// do some thing
},false);
var leo = document.getElementById("leo");
var fun = function(){
alert(this.id);
}
leo.addEventListener("click",fun,false);
// 有效果
leo.removeEventListener("click",fun,false);
2.4 IE事件處理程序
由于IE8和更早版本只支持事件冒泡,所以通過(guò)attachEvent()添加的事件處理程序會(huì)被添加到冒泡階段。var leo = document.getElementById("leo");
leo.attachEvent("onclick",function(){
alert("hello leo"); // "leo"
},false);
// attachEvent也支持添加多個(gè)事件處理程序
leo.attachEvent("onclick",function(){
alert("hello world"); // "leo"
},false);
兩者事件處理程序的作用域不同。var leo = document.getElementById("leo");
var fun = function(){
alert(this.id);
}
leo.attachEvent("onclick",fun,false);
// 有效果
leo.detachEvent("onclick",fun,false);
2.6 跨瀏覽器事件處理程序
var my_event = {
addMyEvent: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;
}
};
removeMyEvent: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;
}
}
}
3.事件對(duì)象
var leo = document.getElementById("leo");
leo.onclick = function(event){
alert(event.type); // "click"
}
leo.addEventListener("click",function(event){
alert(event.type); // "click"
},false);
var leo = document.getElementById("leo");
leo.onclick = function(event){
// 只有當(dāng) event 中的 cancelable 屬性為true的事件
event.preventDefault();
}
var leo = document.getElementById("leo");
leo.onclick = function(event){
alert("leo");
event.stopPropagation();
}
document.body.onclick = function(event){
alert("hello leo");
}
3.2 IE中的事件對(duì)象
var leo = document.getElementById("leo");
leo.onclick = function(){
var event = window.event;
alert(event.type); // "click"
}
var leo = document.getElementById("leo");
leo.attachEvent("onclick",function(event){
alert(event.type); // "click"
},false);
3.3 跨瀏覽器的事件對(duì)象
var my_event = {
myAddFun : function(element, type, handler){
// do some thing
},
// 返回對(duì)event的引用
getMyEvent : function(event){
return event?event:window.event;
},
// 返回事件的目標(biāo)
getMyTarget : function(event){
return event.target || event.srcElement;
},
// 取消事件的默認(rèn)行為
preventDefault : function(event){
if(event.preventDefault){
event.preventDefault();
}else {
event.returnValue = false;
}
},
myRemoveFun : function(element, type, handler){
// do some thing
},
// 阻止事件流
stopPropagetion : function(event){
if(event.stopPropagetion){
event.stopPropagetion();
}else {
event.cancelBubble = true;
}
}
}
var leo = document.getElementById("leo");
leo.onclick = function(event){
alert("leo");
event = my_event(event);
my_event.stopPropagation(event);
}
leo.onclick = function(event){
alert("hello world");
}
4.事件類型
或者查看《JavaScript高級(jí)程序設(shè)計(jì)(第三版)》的第362頁(yè)開(kāi)始。
我后面會(huì)多帶帶整理一篇,介紹這些事件的文章。
事件委托利用事件冒泡,指定一個(gè)事件處理程序來(lái)管理某一類型的所有事件,比如我們通過(guò)一個(gè)函數(shù)來(lái)代替其他三個(gè)函數(shù):
var btn1 = document.getElementById("btn1");
var btn2 = document.getElementById("btn2");
var btn3 = document.getElementById("btn3");
// my_event 在前面定義了
my_event.myAddFun(btn1, "click", function(event){
alert("btn1點(diǎn)擊");
});
my_event.myAddFun(btn2, "click", function(event){
alert("btn2點(diǎn)擊");
});
my_event.myAddFun(btn3, "click", function(event){
alert("btn3點(diǎn)擊");
});
var btn = document.getElementById("btn");
my_event.myAddFun(btn, "click", function(event){
event = my_event.getMyEvent(event);
var target = my_event.getMyTarget(event);
switch(target.id){
case "btn1":
alert("btn1點(diǎn)擊");
break;
case "btn2":
alert("btn2點(diǎn)擊");
break;
case "btn3":
alert("btn3點(diǎn)擊");
break;
}
});
createEvent()接收一個(gè)參數(shù),即要?jiǎng)?chuàng)建的事件類型的字符串。
DOM2級(jí)中,所有這些字符串都使用英文復(fù)數(shù)形式,DOM3級(jí)中都變成單數(shù),也可以是下面中的字符串:var btn = document.getElementById("btn");
var myEvent = document.createEvent("MouseEvents");
myEvent.initMouseEvent(
"click", true, true, document.defaultView,
0, 0, 0, 0, 0,
false, false, false, false, 0, null
)
btn.dispatchEvent(myEvent);
6.1.2 模擬鍵盤(pán)事件
var btn = document.getElementById("btn");
var myEvent;
// 以DOM3級(jí)方式創(chuàng)建
if(document.implementation.hasFeature("KeyboardEvents", "3.0")){
myEvent = document.createEvent("KeyboardEvent");
myEvent.initKeyboardEvent(
"keydown", true, true, document.defaultView,
"a", 0, "Shift", 0
);
}
btn.dispatchEvent(myEvent);
6.1.3 模擬其他事件
var btn = document.getElementById("btn");
var myEvent = document.createEvent("MutationEvents");
myEvent.initMutationEvent(
"DOMNodeInserted", true, false, someNode, "", "", "", 0
);
btn.dispatchEvent(myEvent);
var btn = document.getElementById("btn");
var myEvent = document.createEvent("HTMLEvents");
myEvent.initEvent("focus", true, false);
btn.dispatchEvent(myEvent);
6.1.4 自定義DOM事件
var btn = document.getElementById("btn");
var myEvent;
// my_event在前面定義 2.6 跨瀏覽器事件處理程序
my_event.addMyEvent(btn, "myevent", function(event){
alert("btn detail ", event.detail);
});
my_event.addMyEvent(document, "myevent", function(event){
alert("document detail ", event.detail);
});
// 以DOM3級(jí)方式穿件
if(document.implementation.hasFeature("CustomEvents", "3.0")){
myEvent = document.createEvent("CustomEvent");
myEvent.initCustomEvent(
"myevent", true, false, "hello leo",
);
btn.dispatchEvent(myEvent);
}
6.2 IE中的事件模擬
區(qū)別在于,IE中使用document.createEventObject()方法創(chuàng)建event對(duì)象,并且不接收參數(shù),返回一個(gè)通用event對(duì)象,我們要做的就是給這個(gè)event對(duì)象添加信息,最后在目標(biāo)上調(diào)用fireEvent()方法,并接受兩個(gè)參數(shù)(事件處理程序的名稱和event對(duì)象)。
在調(diào)用fireEvent()方法會(huì)自動(dòng)添加srcElement和type屬性,我們需要手動(dòng)添加其他屬性,下面模擬一個(gè)click事件:var btn = document.getElementById("btn");
var myEvent = document.createEventObject();
myEvent.screenX = 100;
myEvent.screenY = 0;
myEvent.clientX = 100;
myEvent.clientY = 0;
myEvent.ctrlKey = false;
myEvent.altKey = false;
myEvent.shiftKey = false;
myEvent.button = 0;
btn.fireEvent("onclick", event);
參考文章
Author
王平安
E-mail
pingan8787@qq.com
博 客
www.pingan8787.com
微 信
pingan8787
每日文章推薦
https://github.com/pingan8787...
JS小冊(cè)
js.pingan8787.com
相關(guān)文章
【重溫基礎(chǔ)】21.高階函數(shù)
【重溫基礎(chǔ)】22.內(nèi)存管理
【重溫基礎(chǔ)】7.時(shí)間對(duì)象
【重溫基礎(chǔ)】17.WebAPI介紹
【重溫基礎(chǔ)】14.元編程
發(fā)表評(píng)論
0條評(píng)論
Blackjun
男|高級(jí)講師
TA的文章
閱讀更多
千鋒重慶Java學(xué)習(xí)分享之Java工具類整理
深夜學(xué)姐問(wèn)我在Vue中Echarts柱狀圖如何自定義頂部亮點(diǎn)
騰訊云輕量首購(gòu)特惠,1核2G5M首年50元,可選上海/北京/成都/廣州機(jī)房
字節(jié)跳動(dòng)加碼物流業(yè)務(wù),對(duì)標(biāo)菜鳥(niǎo)網(wǎng)絡(luò)
阿里云優(yōu)惠券(代金券)在哪領(lǐng)取?如何使用阿里云優(yōu)惠券(代金券)?
動(dòng)畫(huà)歷程之滾動(dòng)的坑
利用canvas繪畫(huà)二級(jí)樹(shù)形結(jié)構(gòu)圖
PHP仿微信多圖片預(yù)覽上傳功能