自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

談JavaScript中的移除空事件處理程序

開發(fā) 前端
所謂空時間處理程序,就是在內(nèi)存中留有的那些過時不用的事件處理程序。本文主要介紹JavaScript怎么移除空事件處理程序,希望對你有幫助,一起來看。

每當(dāng)將事件處理程序指定給元素時,運行中的瀏覽器代碼與支持頁面交互的JavaScript代碼之間就會建立一個連接。這種鏈接越多,頁面執(zhí)行起來就越慢。所前所述,可以采用事件委托技術(shù),限制建立的連接數(shù)量。另外,在不需要的時代移除事件處理程序,也是解決這個問題的一種方案。內(nèi)存中留有那些過時不用的“空事件處理程序”,也是造成Web應(yīng)用程序內(nèi)存與性能問題的主要原因。

在兩種情況下,可能會造成上述問題,第一種情況就是從文檔 中移除帶有事件處理程序的元素時,這可能是通過純粹的DOM操作,例如使用removeChild()和replaceChild()方法,但更多地是發(fā)生在使用innerHTML替換頁面中某一部分的時候。如果帶有事件處理程序的元素被innerHTML刪除了,那么原來添加到元素中的事件處理程序極有可能被當(dāng)作垃圾回收。來看下面的例子:

  1. <div id="myDiv"> 
  2. <input type="button" value="Click Me" id="myBtn"> 
  3. </div> 
  4. <script type="text/javascript"> 
  5. var btn=document.getElementById("myBtn");  
  6. btn.onclick=function(){  
  7. document.getElementById("myDiv").innerHTML="Processing…";  
  8. }  
  9. </script> 

這里,有一個按鈕被包含在<div>元素中,為避免雙擊,單擊這個按鈕時就將按鈕移除并替換成一條消息;這是網(wǎng)站設(shè)計中非常流行的一種做法。但問題在于,當(dāng)按鈕被從頁面中移除時,它還帶著一個事件處理程序呢,在<div>元素中設(shè)置innerHTML可以把按鈕移走,但事件處理各種仍然與按鈕保持著引用聯(lián)系。有的瀏覽器(尤其是IE)在這種情況下不會作出恰當(dāng)?shù)奶幚?,它們很有可能會將對元素和事件處理程序的引用都保存在?nèi)存中。如果你想知道某個元即將被移除,那么最好手工移除事件處理程序。如下面的例子所示:

  1. <div id="myDiv"> 
  2. <input type="button" value="Click Me" id="myBtn"> 
  3. </div> 
  4. <script type="text/javascript"> 
  5. var btn=document.getElementById("myBtn");  
  6. btn.onclick=function(){  
  7. btn.onclick=null;  
  8. document.getElementById("myDiv").innerHTML="Processing…";  
  9. }  
  10. </script> 

 

在此,我們設(shè)置<div>的innerHTML屬性之前,先移除了按鈕的事件處理程序。這樣就確保了內(nèi)存可以被再次利用,而從DOM中移除按鈕也做到了干凈利索。

注:采用事件委托也有解決這個問題。如果事先知道將來有可能使用innerHTML替換掉頁面中的某一部分,那么就可以不直接把事件處理程序添加到該部分的元素中,而通過把事件處理程序指定給最好層次的元素,同樣能夠處理該區(qū)域中的事件。

導(dǎo)致“空事件處理程序”的另一情況,就是卸載頁面中的時候。毫不奇怪,IE在這種情況下依然是問題最多的瀏覽器,盡管其他瀏覽器或多或少也有類似的問題。如果在頁面被卸載之前沒有清理干凈事件處理程序。那它們就會滯留在內(nèi)存中。每次加載完頁面再卸載頁面時(可能是在兩個頁面間來加切換,也可以是單擊了“刷新”按鈕),內(nèi)存中滯留的對象數(shù)目就會增加,因為事件處理程序占用的內(nèi)存并沒有被釋放。

一般來說,最好的做法是在頁面卸載之前 ,先通過onunload事件處理程序移除所有事件處理程序。在此,事件委托技術(shù)再次表現(xiàn)出它的優(yōu)勢——需要跟蹤的事件程序越少,移除它們就越容易,對這種類似的操作,我們可把它想象成:只要是通過onload事件處理程序添加的東西,最后都要通過onunload事件處理程序?qū)⑺鼈円瞥?/p>

注:不要忘了,使用onunload事件處理程序意味著頁面不會被緩存在bfcachek中,如果你在意這個問題,那么就只能在IE中通過onunload來移除事件處理程序了。

本文地址: http://www.yiiyaa.net/1361

【編輯推薦】

  1. JavaScript重構(gòu) 模塊劃分和命名空間
  2. Javascript閉包(closure) 深入淺出
  3. 論Javascript的類繼承
  4. 學(xué)習(xí)Javascript閉包(Closure)
  5. Javascript中閉包的作用域鏈
責(zé)任編輯:于鐵 來源: yiiyaa.net
相關(guān)推薦

2011-06-16 14:38:18

JavaScript事件委托

2015-11-06 13:59:01

JavaScript事件處理

2010-09-16 09:37:21

JavaScript事

2009-06-17 09:48:11

javascript手事件參考

2009-08-12 18:28:09

C#事件處理程序

2017-03-14 13:51:23

AndroidView事件分發(fā)和處理

2017-08-28 15:21:29

異步處理回調(diào)函數(shù)異步編程

2021-11-11 11:24:54

JavaScript模型事件

2025-03-19 10:22:09

JavaScript編程語言開發(fā)

2010-10-08 10:03:52

JavaScript圖像

2021-09-02 10:24:54

JavaScript前端語言

2009-10-27 11:39:03

VB.NET事件處理程

2021-02-06 10:27:45

C#函數(shù)參數(shù)

2011-05-20 14:22:11

.NET

2025-02-13 13:14:49

JavaScriptnullundefined

2018-11-21 12:27:21

JavaScript 貨幣值區(qū)域

2013-09-13 13:15:28

AndroidWebViewJavaScript

2020-08-19 08:29:22

JavaScript 對象函數(shù)

2011-08-10 16:57:15

iPhone事件程序包

2021-10-28 17:05:11

IT運維故障
點贊
收藏

51CTO技術(shù)棧公眾號