JavaScript事件處理的方式(三種)
最近這段時間因為每天要修改網(wǎng)站,為網(wǎng)站做特效,所以看了很多的js接觸事件,自己只會使用一小部分,有時用的時候也比較混亂,現(xiàn)在系統(tǒng)的整理了一下,特此分享到腳本之家平臺供大家參考下!
一、什么是JavaScript事件?
事件(Event)是JavaScript應(yīng)用跳動的心臟,也是把所有東西粘在一起的膠水,當(dāng)我們與瀏覽器中Web頁面進(jìn)行某些類型的交互時,事件就發(fā)生了。
事件可能是用戶在某些內(nèi)容上的點擊、鼠標(biāo)經(jīng)過某個特定元素或按下鍵盤上的某些按鍵,事件還可能是Web瀏覽器中發(fā)生的事情,比如說某個Web頁面加載完成,或者是用戶滾動窗口或改變窗口大小。說白了,事件是文檔或瀏覽器中發(fā)生的特定交互瞬間!
通過使用JavaScript,你可以監(jiān)聽特定事件的發(fā)生,并規(guī)定讓某些事件發(fā)生以對這些事件做出響應(yīng)。
二、事件流
事件流就是描述了頁面中接受事件的順序,在瀏覽器發(fā)展的初期,兩大瀏覽器廠商IE和Netscape互掐,出現(xiàn)了一個坑爹的情況,那就是他們對事件流的解釋出現(xiàn)了兩中截然相反的定義。也就是我們所熟悉的:IE的事件冒泡,Netscape的事件捕獲。先來一張圖,簡要的看下結(jié)構(gòu):

1、事件冒泡
事件冒泡即事件最開始由最具體的元素(文檔中嵌套層次最深的那個節(jié)點)接收,然后逐級向上傳播至最不具體的節(jié)點(文檔)。拿上面的圖來說明,就是當(dāng)點擊text部分時,先由text處的元素接收,然后逐級傳播至window,即執(zhí)行6-7-8-9-10的過程。
2、事件捕獲
事件捕獲即事件最早由不太具體的節(jié)點接收,而最具體的節(jié)點最后接收到事件。同理,在上面的模型中,就是點擊text部分時,先由window接收,然后逐級傳播至text元素,即執(zhí)行1-2-3-4-5的過程。
具體在代碼中怎樣表現(xiàn)呢?后面給出!
三、Javascript事件處理程序的3種方式
產(chǎn)生了事件,我們就要去處理他,Javascript事件處理程序主要有3種方式:
1、HTML事件處理程序
即我們直接在HTML代碼中添加事件處理程序,如下面這段代碼:
<input id="btn" value="按鈕" type="button" onclick="showmsg();">
<script>
function showmsg(){
alert("HTML添加事件處理");
}
</script>
從上面的代碼中我們可以看出,事件處理是直接嵌套在元素里頭的,這樣有一個毛?。壕褪莌tml代碼和js的耦合性太強(qiáng),如果哪一天想要改變js中showmsg,那么不但要再js中修改,還需要到html中修改,一兩處的修改我們能接受,但是當(dāng)你的代碼達(dá)到萬行級別的時候,修改起來就需要勞民傷財了,所以,這個方式我們并不推薦使用。
2、DOM0級事件處理程序
即為指定對象添加事件處理,看下面的一段代碼:
<input id="btn" value="按鈕" type="button">
<script>
var btn= document.getElementById("btn");
btn.onclick=function(){
alert("DOM級添加事件處理");
}
btn.onclick=null;//如果想要刪除btn的點擊事件,將其置為null即可
</script>
從上面的代碼中,我們能看出,相對于HTML事件處理程序,DOM0級事件,html代碼和js代碼的耦合性已經(jīng)大大降低。但是,聰明的程序員還是不太滿足,期望尋找更簡便的處理方式,下面來看第三種處理方法。
3、DOM2級事件處理程序
DOM2也是對特定的對象添加事件處理程序,但是主要涉及到兩個方法,用于處理指定和刪除事件處理程序的操作:addEventListener()和 removeEventListener()。它們都接收三個參數(shù):要處理的事件名、作為事件處理程序的函數(shù)和一個布爾值(是否在捕獲階段處理事件),看下面的一段代碼:
<input id="btn" value="按鈕" type="button">
<script>
var btn=document.getElementById("btn");
btn.addEventListener("click",showmsg,false);//這里我們把最后一個值置為false,即不在捕獲階段處理,一般來說冒泡處
理在各瀏覽器中兼容性較好
function showmsg(){
alert("DOM級添加事件處理程序");
}
btn.removeEventListener("click",showmsg,false);//如果想要把這個事件刪除,只需要傳入同樣的參數(shù)即可
</script>
這里我們可以看到,在添加刪除事件處理的時候,最后一種方法更直接,也最簡便。但是馬海祥提醒大家需要注意的是,在刪除事件處理的時候,傳入的參數(shù)一定要跟之前的參數(shù)一致,否則刪除會失效!
四、事件冒泡和事件捕獲的流程與區(qū)別
說到這里,再給大家來一點代碼來說明下事件冒泡和事件捕獲的流程,同時也讓大家能看出二者的區(qū)別:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-">
<title>Document</title>
<style>
#p{width:px;height:px;border:px solid black;}
#c{width:px;height:px;border:px solid red;}
</style>
</head>
<body>
<div id="p">
i am www.mahaixiang.cn
<div id="c">i like www.mahaixiang.cn</div>
</div>
<script>
var p = document.getElementById('p');
var c = document.getElementById('c');
c.addEventListener('click', function () {
alert('子節(jié)點捕獲')
}, true);
c.addEventListener('click', function () {
alert('子節(jié)點冒泡')
}, false);
p.addEventListener('click', function () {
alert('父節(jié)點捕獲')
}, true);
p.addEventListener('click', function () {
alert('父節(jié)點冒泡')
}, false);
</script>
</body>
</html>
運行上面的代碼,點擊子元素的時候,我們會發(fā)現(xiàn),執(zhí)行的先后順序是:父節(jié)點捕獲--子節(jié)點捕獲--子節(jié)點冒泡--父節(jié)點冒泡。從這個例子中,大家也就明白了,另外,DOM2級事件規(guī)定事件包括三個階段:
1、事件捕獲階段;
2、處于目標(biāo)階段;
3、事件冒泡階段。
首先是捕獲,然后處于目標(biāo)階段(即來到事件的發(fā)出位置),最后才是冒泡,不科學(xué)的是,居然木有DOM1級事件處理程序,大家注意下,別鬧出笑話了!
五、補(bǔ)充
1. IE事件處理程序也對應(yīng)有兩個方法:attachEvent()添加事件,detachEvent()刪除事件,這兩個方法接收相同的兩個參數(shù):事件處理程序名稱與事處理函數(shù)。這里為什么沒有布爾值呢?因為ie8以及更早的版本只支持事件冒泡,所以最后一個參數(shù)默認(rèn)的相當(dāng)于false來處理!(支持IE事件處理程序的瀏覽器有IE,opera)。
2. 事件對象是用來記錄一些事件發(fā)生時的相關(guān)信息的對象,但事件對象只有事件發(fā)生時才會產(chǎn)生,并且只能是事件處理函數(shù)內(nèi)部訪問,在所有事件處理函數(shù)運行結(jié)束后,事件對象就被銷毀!
以上所述是小編給大家介紹的JavaScript事件處理的方式(三種),希望對大家有所幫助!
- javascript 事件處理、鼠標(biāo)拖動效果實現(xiàn)方法詳解
- Ext javascript建立超鏈接,進(jìn)行事件處理的實現(xiàn)方法
- Vue.js每天必學(xué)之方法與事件處理器
- js使用函數(shù)綁定技術(shù)改變事件處理程序的作用域
- javascript 基礎(chǔ)篇3 類,回調(diào)函數(shù),內(nèi)置對象,事件處理
- 淺談Javascript事件處理程序的幾種方式
- JavaScript事件處理程序(事件偵聽器)
- JavaScript中的事件處理
- JavaScript事件處理器中的event參數(shù)使用介紹
- JavaScript事件處理程序詳解
相關(guān)文章
JavaScript限制在客戶區(qū)可見范圍的拖拽(解決scrollLeft和scrollTop的問題)(2)
這篇文章主要介紹了JavaScript限制在客戶區(qū)可見范圍的拖拽,解決scrollLeft和scrollTop的問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
javascript日期驗證之輸入日期大于等于當(dāng)前日期
這篇文章主要介紹了javascript日期驗證之輸入日期大于等于當(dāng)前日期,需要的朋友可以參考下2015-12-12
webpack教程之webpack.config.js配置文件
本篇文章主要介紹了webpack教程之webpack.config.js配置文件 ,具有一定的參考價值,有興趣的可以了解一席2017-07-07
uni-app使用countdown插件實現(xiàn)倒計時
這篇文章主要為大家詳細(xì)介紹了uni-app使用countdown插件實現(xiàn)倒計時,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-11-11
js 優(yōu)化次數(shù)過多的循環(huán) 考慮到性能問題
IE沒有我們想象中笨,它知道總的循環(huán)次數(shù)還是一千萬次。因此,得把這一百個十萬次循環(huán)分開執(zhí)行。雖然Javascript是單線程的,但也可以通過setTimeout或setInterval模擬多線程。2011-03-03
javascript輕松實現(xiàn)當(dāng)鼠標(biāo)移開時已彈出子菜單自動消失
本文為大家詳細(xì)介紹下使用javascript實現(xiàn)當(dāng)鼠標(biāo)移開時已彈出子菜單自動消失,具體如下,感興趣的朋友不要錯過2013-12-12
終于解決了IE8不支持?jǐn)?shù)組的indexOf方法
今天,測試報過來一個js bug, 在IE8下有個js錯誤,但是在其它瀏覽器下(Firefox, Chrome, IE9)下面都很正常。后來調(diào)試發(fā)現(xiàn)原因是在IE8下,js數(shù)組沒有indexOf方法。2013-04-04

