深入理解在JS中通過(guò)四種設(shè)置事件處理程序的方法
所有的JavaScript事件處理程序的作用域是在其定義時(shí)的作用域而非調(diào)用時(shí)的作用域中執(zhí)行,并且它們能存取那個(gè)作用域中的任何一個(gè)本地變量。但是HTML標(biāo)簽屬性注冊(cè)處理程序就是一個(gè)例外。看下面四種方式:
第一種方式(HTML標(biāo)簽屬性):
<input type="button" id="btn1" value="測(cè)試" onclick="alert(this.id);" />
上面的代碼是通過(guò)設(shè)置HTML標(biāo)簽屬性為給button 添加了點(diǎn)擊事件,當(dāng)點(diǎn)擊button 按鈕時(shí)會(huì)彈出這個(gè)button的id,即btn1。
這種通過(guò)HTML屬性來(lái)注冊(cè)事件處理程序是一個(gè)例外。它們被轉(zhuǎn)換為能存取全局變量的頂級(jí)函數(shù)而非任何本地變量。由于歷史的原因,它們運(yùn)行在一個(gè)修改后的作用域鏈中。通過(guò)HTML屬性定義的事件處理程序能像本地變量一樣使用目標(biāo)對(duì)象、容器對(duì)象(form)對(duì)象和document對(duì)象的屬性。它會(huì)被瀏覽器轉(zhuǎn)換為類似如下的代碼:
function (event){
with(document){
with(this.form||{}){
with(this){
/*具體的事件處理代碼*/
}
}
}
}
關(guān)于with的用法,可以自行查閱,這里后面有文章講解。讀者先自行了解一下。提供一個(gè)連接(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/with)
這種方式現(xiàn)在已經(jīng)不推薦使用。
第二種方式(調(diào)用函數(shù))
<input type="button" id="btn2" value="測(cè)試" onclick="test()" />
<script type="text/javascript">
function test(){
alert(this.id);
}
</script>
這段代碼彈出來(lái)的是undefined。
這種設(shè)置方式是通過(guò)調(diào)用全局函數(shù)來(lái)進(jìn)行的,這時(shí)this指向的是window,而非這個(gè)button的調(diào)用者,可以通過(guò)輸出console.log(this==window);來(lái)進(jìn)行驗(yàn)證
第三種方式(調(diào)用函數(shù))
<input type="button" id="btn3" value="測(cè)試" />
<script type="text/javascript">
var btn3 = document.getElementById("btn3");
btn3.onclick = function () {
alert(this.id);
};
</script>
這段代碼彈出來(lái)的是btn3。
這種事件處理程序在事件目標(biāo)上定義,所以它們作為這個(gè)對(duì)象的方法來(lái)調(diào)用(但是下面在IE里面有個(gè)例外)。這就是說(shuō)在事件處理程序內(nèi),this關(guān)鍵字指的是事件目標(biāo)。
當(dāng)使用addEventListener()注冊(cè)時(shí),調(diào)用的處理程序使用事件目標(biāo)作為它們的this值。但是對(duì)于還用attachment()注冊(cè)的處理程序作為函數(shù)調(diào)用,它們的this值是全局(window)對(duì)象。就是說(shuō)的第四中方式
第四種方式(通過(guò)addEventListener和attachment):
<input type="button" id="btn3" value="測(cè)試" onclick="test()" />
var btn = document.getElementById("btn3");
var handler = function () { console.log(this.id); };
if (btn.addEventListener) {
console.log("addEventListener");
btn.addEventListener("click", handler, false);
}
else if (btn.attachEvent) {//IE9之前的版本
console.log("attachEvent");
btn.attachEvent("onclick",handler);
}
在IE5-IE8 版本輸出的是undefined。(此時(shí)調(diào)用的是attachement)
IE9以后的版本輸出的btn3.(修復(fù)了上面的問(wèn)題,增加了通用的addEventListener)。
如果想修復(fù)IE5-8里面的那個(gè)問(wèn)題,可以使用下面的方法。
/*
*target:目標(biāo)對(duì)象,button之類的
*type:"click"字符串事件名稱,無(wú)需帶on
*handler:調(diào)用的處理程序
*/
function addEvent(target,type,handler){
if (target.addEventListener) {
target.addEventListener(type, handler, false);
}
else if (target.attachEvent) {//IE9之前的版本
btn.attachEvent("on"+type,function(event){
return hanlder.call(target,event);//把處理程序作為事件目標(biāo)的方法調(diào)用,更改this指向。
});
}
}
以上所述是小編給大家介紹的在JS中通過(guò)四種設(shè)置事件處理程序的方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- JavaScript中的事件處理程序
- JS事件流與事件處理程序?qū)嵗治?/a>
- JavaScript常見事件處理程序?qū)嵗偨Y(jié)
- JavaScript事件處理程序詳解
- JavaScript的事件代理和委托實(shí)例分析
- js中的事件委托或是事件代理使用詳解
- JavaScript事件代理和委托詳解
- js事件委托和事件代理案例分享
- JavaScript通過(guò)事件代理高亮顯示表格行的方法
- JS實(shí)現(xiàn)為動(dòng)態(tài)添加的元素增加事件功能示例【基于事件委托】
- javascript事件委托的方式綁定詳解
- JS事件處理機(jī)制及事件代理(事件委托)實(shí)例詳解
相關(guān)文章
15個(gè)用于開發(fā)的TypeScript高級(jí)技巧分享
這篇文章主要來(lái)和大家分享一下15個(gè)用于開發(fā)的TypeScript高級(jí)技巧,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下2023-07-07
JavaScript實(shí)現(xiàn)下拉菜單的顯示和隱藏
這篇文章主要介紹了JavaScript實(shí)現(xiàn)下拉菜單的顯示和隱藏的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01
JavaScript數(shù)組基于交換的排序示例【冒泡排序】
這篇文章主要介紹了JavaScript數(shù)組基于交換的排序,結(jié)合實(shí)例形式分析了JavaScript排序算法中的冒泡排序簡(jiǎn)單實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-07-07
8個(gè)開發(fā)者必須知道的JavaScript深層概念(推薦)
JavaScript有一個(gè)名為“調(diào)用堆?!保–all Stack)的簡(jiǎn)單列表,它逐一管理任務(wù)(堆棧算法),但是當(dāng)異步任務(wù)被傳遞時(shí),JavaScript會(huì)把它彈出到web API,瀏覽器就會(huì)處理它,這篇文章主要介紹了8個(gè)開發(fā)者必須知道的JavaScript深層概念,需要的朋友可以參考下2022-10-10
javascript實(shí)現(xiàn)限制上傳文件大小
這篇文章主要介紹了javascript實(shí)現(xiàn)限制上傳文件大小的方法和示例,需要的朋友可以參考下2015-02-02
微信小程序和公眾號(hào)實(shí)現(xiàn)簽到頁(yè)面
這篇文章主要為大家詳細(xì)介紹了微信小程序和公眾號(hào)實(shí)現(xiàn)簽到頁(yè)面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
利用JS實(shí)現(xiàn)簡(jiǎn)單的瀑布流加載圖片效果
今天學(xué)習(xí)了一個(gè)瀑布流加載效果,很多網(wǎng)站都有瀑布流效果,下面通過(guò)本文給大家分享利用JS實(shí)現(xiàn)簡(jiǎn)單的瀑布流加載圖片效果,需要的朋友參考下吧2017-04-04

