在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ HTML/ 淺談 JavaScript 之事件綁定
淺談 JavaScript 之事件綁定
淺談 javascript 中字符串 String 與數(shù)組 Array
淺談 javascript 中基本包裝類(lèi)型
淺談 JavaScript Math 和 Number 對(duì)象
淺談 Javascript 的靜態(tài)屬性和原型屬性
淺談 JavaScript 中定義變量時(shí)有無(wú) var 聲明的區(qū)別
淺談 JavaScript Array 對(duì)象
淺談 JavaScript 函數(shù)參數(shù)的可修改性問(wèn)題
淺談 javascript 中的 instanceof 和 typeof
淺談 JavaScript 中 Date (日期對(duì)象),Math 對(duì)象
淺談 Javascript 執(zhí)行順序
淺談 javascript 函數(shù)屬性和方法
淺談 JavaScript 中面向?qū)ο蠹夹g(shù)的模擬
淺談 javascript 的原型繼承
淺談 javascript 事件取消和阻止冒泡
根據(jù)一段代碼淺談 Javascript 閉包
淺談 Javascript 面向?qū)ο缶幊?/span>
淺談 javascript 六種數(shù)據(jù)類(lèi)型以及特殊注意點(diǎn)
淺談 Javascript 變量作用域問(wèn)題
淺談 javascript 函數(shù)內(nèi)部屬性
淺談 javascript 中自定義模版
淺談 JavaScript 字符集
淺談 javascript 面向?qū)ο缶幊?/span>
淺談 JavaScript 框架分類(lèi)
淺談 JavaScript 中的 Math.atan() 方法的使用
淺談 Javascript 數(shù)組與字典
淺談 JavaScript 數(shù)據(jù)類(lèi)型及轉(zhuǎn)換
淺談 javascript 的調(diào)試
淺談 Javascript 嵌套函數(shù)及閉包
淺談 javascript 回調(diào)函數(shù)
淺談 JavaScript Date 日期和時(shí)間對(duì)象
淺談 Javascript 中的 Function 與 Object
淺談 JavaScript 數(shù)據(jù)類(lèi)型
淺談 javascript 中 this 在事件中的應(yīng)用
淺談 javascript 中的閉包
淺談 javascript 函數(shù)劫持
淺談 Javascript 中深復(fù)制
淺談 JavaScript 函數(shù)節(jié)流
淺談 JavaScript 中的 String 對(duì)象常用方法
淺談 JavaScript 事件的屬性列表
淺談 JavaScript 函數(shù)與棧
淺談 JavaScript 的事件
淺談 javascript 中的作用域
淺談 JavaScript 的執(zhí)行效率
淺談 Javascript 事件模擬
淺談 JavaScript function 函數(shù)種類(lèi)
淺談 javascript 歸并方法
淺談 javascript 迭代方法
淺談 JavaScript 編程語(yǔ)言的編碼規(guī)范
淺談 JavaScript 實(shí)現(xiàn)面向?qū)ο笾械念?lèi)
淺談 Javascript 鼠標(biāo)和滾輪事件
淺談 Javascript Base64 加密解密
淺談 Javascript 中勻速運(yùn)動(dòng)的停止條件
淺談 javascript 實(shí)現(xiàn)八大排序
淺談 javascript 的分號(hào)的使用
淺談 javascript 中 createElement 事件
淺談 javascript 的數(shù)據(jù)類(lèi)型檢測(cè)
淺談 javascript 對(duì)象模型和 function 對(duì)象
淺談 Javascript 如何實(shí)現(xiàn)勻速運(yùn)動(dòng)
淺談 JavaScript 字符串與數(shù)組
淺談 javascript 面向?qū)ο蟪绦蛟O(shè)計(jì)
淺談 Javascript 事件處理程序的幾種方式

淺談 JavaScript 之事件綁定

其實(shí)沒(méi)有什么新的知識(shí)點(diǎn),只是為了方便其他有需要的朋友們翻閱,對(duì)自己而言也算是一個(gè)積累,所以只能算是閑談 JavaScript,老鳥(niǎo)們可以盡情飄過(guò)。

在進(jìn)入正題之前,先提個(gè)問(wèn)題熱熱身吧。

現(xiàn)在有如下 HTML 結(jié)構(gòu)

<div id="wrap">  
 <input type="button" value="按鈕一" />  
 <input type="button" value="按鈕二" />  
 <input type="button" value="按鈕三" />  
 <input type="button" value="按鈕四" />  
 <input type="button" value="按鈕五" />  
</div>  

以及如下 JavaScript 代碼

var wrap = document.getElementById('wrap'),   
    inputs = wrap.getElementsByTagName('input');   

for (var i = 0, l = inputs.length; i <l; i++) {   
    inputs[i].onclick = function () {   
        alert(i);   
    }   
}  

請(qǐng)問(wèn),這樣執(zhí)行的結(jié)果是什么?

/ 分割線 /

如果你的回答是 “點(diǎn)擊按鈕時(shí), alert 當(dāng)前按鈕的索引值 i”,那你就中了我的圈套了。大家不妨試試,無(wú)論你點(diǎn)擊哪個(gè)按鈕,它都會(huì) alert(5)。

這個(gè)看似理所當(dāng)然的結(jié)果為什么會(huì)和實(shí)際情況不同呢?其實(shí)也是很好理解的。 因?yàn)?onclick 只是事件綁定,而不是執(zhí)行,當(dāng)我們執(zhí)行 onclick 事件的時(shí)候,這時(shí)的 i 已經(jīng)是循環(huán)以后的值了,照這樣看,每個(gè)按鈕都 alert(5) 也就不足為奇了。

那么,如果我們要怎么實(shí)現(xiàn) “點(diǎn)擊按鈕時(shí),alert 當(dāng)前按鈕的索引值 i” 呢?這里就要用到 JavaScript 中暗藏玄機(jī)的一個(gè)概念 “閉包”。我們可以用閉包的方式改寫(xiě)以上 JS,把 for 循環(huán)中的 i 值保存在內(nèi)存中,代碼如下

var wrap = document.getElementById('wrap'),   
    inputs = wrap.getElementsByTagName('input');   

for (var i = 0, l = inputs.length; i <l; i++) {   
    (function (cur) {   
        inputs[cur].onclick = function () {   
            alert(cur);   
        }   
    })(i)   
}  

再試試效果?確實(shí)能 alert 出相應(yīng)的索引值了,不過(guò)至此為止還只是開(kāi)胃菜,正題才剛剛開(kāi)始!

以上的方法,我們是通過(guò)循環(huán) + 閉包給 button 按鈕上綁定事件,我們知道,在 JavaScript 中函數(shù)也是對(duì)象,對(duì)象就會(huì)占用內(nèi)存,現(xiàn)在的例子中只有 5 個(gè)按鈕,或許你會(huì)認(rèn)為這樣的性能開(kāi)銷(xiāo)可以忽略不計(jì),但是如果當(dāng)我們有 50 個(gè),甚至 500 個(gè)按鈕的時(shí)候,IE 已經(jīng)哭了,當(dāng)有更多其他性能隱患并發(fā)時(shí),所有的瀏覽器都哭了。

回到剛才的例子,我們可以用 “事件委托” 的方法來(lái)解決這個(gè)因綁定事件隨著按鈕增加而可能導(dǎo)致的性能問(wèn)題。原理很簡(jiǎn)單,利用 Javascript 的事件冒泡,我們可以把事件的綁定從按鈕移到它們的父級(jí)元素上,不管按鈕有多少,它們只有一個(gè)共同的父級(jí)元素,那樣我們只需要綁定一次事件就可以了。

代碼如下

var wrap = document.getElementById('wrap'),   
    inputs = wrap.getElementsByTagName('input');   

wrap.onclick = function (ev) {   
    var ev = ev || window.event,   
    target = ev.target || ev.srcElement;   
    for (var i = 0, l = inputs.length; i <l; i++) {   
        if (inputs[i] === target) {   
            alert(i)   
        }   
    }   
}  

至此,正餐完畢,我們還可以再深入一下,來(lái)些餐后甜點(diǎn)。

除了在性能上,事件委托比閉包的事件綁定更有優(yōu)勢(shì)以外,事件委托還無(wú)需顧及子元素(即被綁定事件的元素)的數(shù)量。比如,我們?cè)?onclick 事件綁定以后,增加一個(gè)按鈕

var newInput = document.createElement('input');   
newInput.setAttribute('type', 'button');   
newInput.setAttribute('value', '按鈕六');   
wrap.appendChild(newInput);  

同樣在最后加了這段代碼的閉包方式和事件委托方式,我們可以看到,閉包實(shí)現(xiàn)的事件綁定中點(diǎn)擊 “按鈕六” 毫無(wú)效果,但是在事件委托中實(shí)現(xiàn)的事件綁定點(diǎn)擊 “按鈕六” 則會(huì)有 alert。相反,如果我們要?jiǎng)h除一個(gè)按鈕,閉包的方式仍會(huì)在內(nèi)存中保存已刪除按鈕的 onclick 事件(除非手動(dòng)設(shè)為 null),事件委托則不會(huì)對(duì)內(nèi)存造成多余的負(fù)擔(dān),就為這個(gè)原因,我們也應(yīng)該多加利用事件委托的方式來(lái)綁定同一層級(jí)的多個(gè)元素。