欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js使用函數(shù)綁定技術(shù)改變事件處理程序的作用域

 更新時間:2011年12月26日 23:46:20   作者:  
在html頁面里面為某個元素的事件指定處理程序有很多種方式
第一種,也是 最常見的,就是直接在html標(biāo)簽里面通過指定事件處理程序同名的HTML屬性來注冊事件,代碼如下:
復(fù)制代碼 代碼如下:

function eventHandler() {
alert("當(dāng)前作用域是 input 元素本身");
}
<input type="button" value="單擊我" onclick="eventHandler(this)"/>

第二種方式就是將一個函數(shù)賦值給一個事件處理程序?qū)傩?。這種方式首先的獲取到這個元素對象,一般代碼如下:
復(fù)制代碼 代碼如下:

<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。注冊事件的代碼如下:
復(fù)制代碼 代碼如下:

<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>

input對象的Click事件執(zhí)行環(huán)境截圖
通過以上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ù)的定義形式如下代碼:

復(fù)制代碼 代碼如下:

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ù)。具體的處理方式如下:
首先修改先前定義的注冊事件的方法如下代碼:
復(fù)制代碼 代碼如下:

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í)行了。
復(fù)制代碼 代碼如下:

<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對象下面。

this在window對象下的執(zhí)行環(huán)境截圖

在前面介紹的通過綁定函數(shù)注冊事件是為元素對象創(chuàng)建了一個事件的hash對象用來保存事件處理程序,這個hash對象在元素移除事件處理程序的時候起到了非??傄笥遥鶕?jù)他就能準(zhǔn)確的移除對應(yīng)的事件處理程序。移除事件處理程序的代碼如下:
復(fù)制代碼 代碼如下:

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)利。

相關(guān)文章

  • 詳解javascript 正則表達式之分組與前瞻匹配

    詳解javascript 正則表達式之分組與前瞻匹配

    本文主要講解javascript 的正則表達式中的分組匹配與前瞻匹配的,需要對正則的有基本認識,本人一直對兩種匹配模棱不清,還有不清楚的朋友跟隨腳本之家小編一起看看吧
    2018-05-05
  • JS短信驗證碼倒計時功能的實現(xiàn)(沒有驗證碼,只有倒計時)

    JS短信驗證碼倒計時功能的實現(xiàn)(沒有驗證碼,只有倒計時)

    最近接了個項目,其中有這樣的需求:當(dāng)用戶想要獲取驗證碼時,就點擊免費獲取驗證碼 ,然后開始倒計時,倒計時期間按鈕文字為剩余時間x秒,且不可按狀態(tài),倒計時結(jié)束后,按鈕更改為點擊重新發(fā)送,下面給大家分享js短信驗證碼倒計時實現(xiàn)代碼
    2016-10-10
  • 原生js實現(xiàn)查找/添加/刪除/指定元素的class

    原生js實現(xiàn)查找/添加/刪除/指定元素的class

    查找、添加、刪除、指定元素的class使用原生js實現(xiàn)不可思議吧,感興趣的朋友可以參考下哈,希望可以幫助到你
    2013-04-04
  • 如何只用echarts做個仿3d地圖功能

    如何只用echarts做個仿3d地圖功能

    由于業(yè)務(wù)需求,需要繪制3d地圖,所以下面這篇文章主要給大家介紹了關(guān)于如何只用echarts做個仿3d地圖功能的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • 詳解js中class的多種函數(shù)封裝方法

    詳解js中class的多種函數(shù)封裝方法

    這篇文章主要介紹了詳解js中class的多種函數(shù)封裝方法,介紹了不同函數(shù)的封裝方法,感興趣的朋友可以參考一下
    2016-01-01
  • js獲取元素的標(biāo)簽名實現(xiàn)方法

    js獲取元素的標(biāo)簽名實現(xiàn)方法

    下面小編就為大家?guī)硪黄猨s獲取元素的標(biāo)簽名實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • js實現(xiàn)點擊向下展開的下拉菜單效果代碼

    js實現(xiàn)點擊向下展開的下拉菜單效果代碼

    這篇文章主要介紹了js實現(xiàn)點擊向下展開的下拉菜單效果代碼,涉及javascript鼠標(biāo)事件控制頁面元素樣式變換的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • 從0到1學(xué)習(xí)JavaScript編寫貪吃蛇游戲

    從0到1學(xué)習(xí)JavaScript編寫貪吃蛇游戲

    這篇文章主要為大家詳細介紹了JavaScript編寫貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Dropify.js圖片寬高自適應(yīng)的方法

    Dropify.js圖片寬高自適應(yīng)的方法

    本篇文章主要介紹了Dropify.js圖片寬高自適應(yīng)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • JS刪除String里某個字符的方法

    JS刪除String里某個字符的方法

    這篇文章主要介紹了JS刪除String里某個字符的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下
    2019-06-06

最新評論