js使用函數(shù)綁定技術(shù)改變事件處理程序的作用域
function eventHandler() {
alert("當(dāng)前作用域是 input 元素本身");
}
<input type="button" value="單擊我" onclick="eventHandler(this)"/>
第二種方式就是將一個(gè)函數(shù)賦值給一個(gè)事件處理程序?qū)傩浴_@種方式首先的獲取到這個(gè)元素對象,一般代碼如下:
<input id="myEventHandlerScope" type="button" value="單擊我"/>
<script type="text/javascript">
function eventHandler() {
alert("當(dāng)前作用域是 input 元素本身");
}
var mybtn = document.getElementById("myEventHandlerScope");
mybtn.onclick = eventHandler;
</script>
第三種方式,就是理由DOM2級別的事件處理方法 addEventListener和removeEventListener,針對ie瀏覽器對應(yīng)的方法是attachEvent 和 detachEvent。注冊事件的代碼如下:
<input id="myEventHandlerScope" type="button" value="單擊我"/>
<script type="text/javascript">
//定義一個(gè)注冊事件的方法
function addHandler(obj, type, handler) {
if (obj.addEventListener) {
obj.addEventListener(type, handler, false);
} else if (obj.attachEvent) {
obj.attachEvent("on" + type, handler);
} else {
obj["on" + type] = handler;
}
}
function eventHandler() {
alert("當(dāng)前作用域是 input 元素本身");
}
var mybtn = document.getElementById("myEventHandlerScope");
addHandler(mybtn,'click',eventHandler);//為對象注冊事件
</script>
通過以上3種方式為input元素注冊一個(gè) click 事件處理程序都有一個(gè)缺點(diǎn)就是這個(gè)處理程序的作用域(this)始終處于input對象。在面向?qū)ο缶幊痰臅r(shí)候,就需要明確的指定this在特定的作用域下面。 為了改變this的作用域,就得用到j(luò)s的一種綁定函數(shù)技術(shù)。
所謂“綁定函數(shù)”就是要?jiǎng)?chuàng)建一個(gè)函數(shù),可以在特定環(huán)境中以指定參數(shù)調(diào)用另一個(gè)函數(shù),他能很好的與事件處理程序一起使用,以便在將函數(shù)作為變量傳遞的同時(shí)保持函數(shù)的作用域(也是this的執(zhí)行環(huán)境)。綁定函數(shù)的定義形式如下代碼:
function bind(fn,scope) {
return fn.apply(scope||this,arguments);
}
這個(gè)綁定函數(shù)接受兩個(gè)參數(shù),第一個(gè)是需要執(zhí)行的函數(shù),第二個(gè)是特定的執(zhí)行環(huán)境,并返回一個(gè)在給定作用域中調(diào)用給定函數(shù),并將所有參數(shù)一同傳遞過去。利用綁定函數(shù)技術(shù)和DOM2級的事件處理程序就能很好的為元素注冊一個(gè)在特定作用域下執(zhí)行的事件處理函數(shù)。具體的處理方式如下:
首先修改先前定義的注冊事件的方法如下代碼:
function addHandler(obj, type, handler, scope) {
function fn(event) {
var evt = event ? event : window.event;
evt.target = event.target || event.srcElement;
return handler.apply(scope || this,arguments);
}
obj.eventHash = obj.eventHash || {};//這里為需要注冊事件處理程序的對象定義一個(gè)保存事件的hash對象,并把事件處理程序和作用域保存在該事件類型的隊(duì)列里面
(obj.eventHash [type] = obj.eventHash [type] || []).push({ "name": type, "handler": handler, "fn": fn, "scope": scope });
if (obj.addEventListener) {
obj.addEventListener(type, fn, false);
} else if (obj.attachEvent) {
obj.attachEvent("on" + type, fn);
} else {
obj["on" + type] = fn;
}
}
使用修改后的注冊事件方法就可以使元素的事件處理程序在指定的環(huán)境里面執(zhí)行了。
<input id="myEventHandlerScope" type="button" value="單擊我"/>
<script type="text/javascript">
function eventHandler() {
this;
alert("當(dāng)前作用域是 window 元素本身");
}
var mybtn = document.getElementById("myEventHandlerScope");
addHandler(mybtn, 'click', eventHandler,window);
</script>
執(zhí)行上面這段代碼,處理程序eventHandler的this作用域就處在了window對象下面。
function removeHandler (obj, type, handler, scope) {
obj.eventHash = obj.eventHash || {};
var evtList = obj.eventHash [type] || [], len = evtList.length;
if (len > 0) {
for (; len--; ) {
var curEvtObj = evtList[len];
if (curEvtObj.name == type && curEvtObj.handler === handler && curEvtObj.scope === scope) {
if (obj.removeEventListener) {
obj.removeEventListener(type, curEvtObj.fn, false);
} else if (obj.detachEvent) {
obj.detachEvent("on" + type, curEvtObj.fn);
} else {
obj["on" + type] = null;
}
evtList.splice(len, 1);
break;
}
}
}
}
到這里就介紹完了使用函數(shù)綁定技術(shù)注冊特定執(zhí)行環(huán)境的事件處理程序。同樣,利用函數(shù)綁定還能使回調(diào)函數(shù)在給定的執(zhí)行環(huán)境里面執(zhí)行。
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
- 深入Javascript函數(shù)、遞歸與閉包(執(zhí)行環(huán)境、變量對象與作用域鏈)使用詳解
- javascript 函數(shù)及作用域總結(jié)介紹
- 關(guān)于javascript 回調(diào)函數(shù)中變量作用域的討論
- js 函數(shù)的執(zhí)行環(huán)境和作用域鏈的深入解析
- js函數(shù)內(nèi)變量的作用域分析
- JavaScript匿名函數(shù)之模仿塊級作用域
- javascript函數(shù)作用域?qū)W習(xí)示例(js作用域)
- javascript的函數(shù)作用域
- 淺談JavaScript的函數(shù)及作用域
- JavaScript函數(shù)作用域鏈分析
- 詳談JavaScript 匿名函數(shù)及閉包
- JavaScript 函數(shù)用法詳解【函數(shù)定義、參數(shù)、綁定、作用域、閉包等】
相關(guān)文章
詳解javascript 正則表達(dá)式之分組與前瞻匹配
本文主要講解javascript 的正則表達(dá)式中的分組匹配與前瞻匹配的,需要對正則的有基本認(rèn)識,本人一直對兩種匹配模棱不清,還有不清楚的朋友跟隨腳本之家小編一起看看吧2018-05-05JS短信驗(yàn)證碼倒計(jì)時(shí)功能的實(shí)現(xiàn)(沒有驗(yàn)證碼,只有倒計(jì)時(shí))
最近接了個(gè)項(xiàng)目,其中有這樣的需求:當(dāng)用戶想要獲取驗(yàn)證碼時(shí),就點(diǎn)擊免費(fèi)獲取驗(yàn)證碼 ,然后開始倒計(jì)時(shí),倒計(jì)時(shí)期間按鈕文字為剩余時(shí)間x秒,且不可按狀態(tài),倒計(jì)時(shí)結(jié)束后,按鈕更改為點(diǎn)擊重新發(fā)送,下面給大家分享js短信驗(yàn)證碼倒計(jì)時(shí)實(shí)現(xiàn)代碼2016-10-10原生js實(shí)現(xiàn)查找/添加/刪除/指定元素的class
查找、添加、刪除、指定元素的class使用原生js實(shí)現(xiàn)不可思議吧,感興趣的朋友可以參考下哈,希望可以幫助到你2013-04-04js獲取元素的標(biāo)簽名實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猨s獲取元素的標(biāo)簽名實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10js實(shí)現(xiàn)點(diǎn)擊向下展開的下拉菜單效果代碼
這篇文章主要介紹了js實(shí)現(xiàn)點(diǎn)擊向下展開的下拉菜單效果代碼,涉及javascript鼠標(biāo)事件控制頁面元素樣式變換的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09從0到1學(xué)習(xí)JavaScript編寫貪吃蛇游戲
這篇文章主要為大家詳細(xì)介紹了JavaScript編寫貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07