js使用函數(shù)綁定技術(shù)改變事件處理程序的作用域
function eventHandler() {
alert("當(dāng)前作用域是 input 元素本身");
}
<input type="button" value="單擊我" onclick="eventHandler(this)"/>
第二種方式就是將一個函數(shù)賦值給一個事件處理程序?qū)傩?。這種方式首先的獲取到這個元素對象,一般代碼如下:
<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">
//定義一個注冊事件的方法
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元素注冊一個 click 事件處理程序都有一個缺點就是這個處理程序的作用域(this)始終處于input對象。在面向?qū)ο缶幊痰臅r候,就需要明確的指定this在特定的作用域下面。 為了改變this的作用域,就得用到j(luò)s的一種綁定函數(shù)技術(shù)。
所謂“綁定函數(shù)”就是要創(chuàng)建一個函數(shù),可以在特定環(huán)境中以指定參數(shù)調(diào)用另一個函數(shù),他能很好的與事件處理程序一起使用,以便在將函數(shù)作為變量傳遞的同時保持函數(shù)的作用域(也是this的執(zhí)行環(huán)境)。綁定函數(shù)的定義形式如下代碼:
function bind(fn,scope) {
return fn.apply(scope||this,arguments);
}
這個綁定函數(shù)接受兩個參數(shù),第一個是需要執(zhí)行的函數(shù),第二個是特定的執(zhí)行環(huán)境,并返回一個在給定作用域中調(diào)用給定函數(shù),并將所有參數(shù)一同傳遞過去。利用綁定函數(shù)技術(shù)和DOM2級的事件處理程序就能很好的為元素注冊一個在特定作用域下執(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 || {};//這里為需要注冊事件處理程序的對象定義一個保存事件的hash對象,并把事件處理程序和作用域保存在該事件類型的隊列里面
(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)文章
JS短信驗證碼倒計時功能的實現(xiàn)(沒有驗證碼,只有倒計時)
最近接了個項目,其中有這樣的需求:當(dāng)用戶想要獲取驗證碼時,就點擊免費獲取驗證碼 ,然后開始倒計時,倒計時期間按鈕文字為剩余時間x秒,且不可按狀態(tài),倒計時結(jié)束后,按鈕更改為點擊重新發(fā)送,下面給大家分享js短信驗證碼倒計時實現(xiàn)代碼2016-10-10原生js實現(xiàn)查找/添加/刪除/指定元素的class
查找、添加、刪除、指定元素的class使用原生js實現(xiàn)不可思議吧,感興趣的朋友可以參考下哈,希望可以幫助到你2013-04-04從0到1學(xué)習(xí)JavaScript編寫貪吃蛇游戲
這篇文章主要為大家詳細介紹了JavaScript編寫貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-07-07