成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

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

  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> 

 

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

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

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

一般來說,最好的做法是在頁面卸載之前 ,先通過onunload事件處理程序移除所有事件處理程序。在此,事件委托技術再次表現出它的優勢——需要跟蹤的事件程序越少,移除它們就越容易,對這種類似的操作,我們可把它想象成:只要是通過onload事件處理程序添加的東西,最后都要通過onunload事件處理程序將它們移除。

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

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

【編輯推薦】

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

2011-06-16 14:38:18

JavaScript事件委托

2015-11-06 13:59:01

JavaScript事件處理

2010-09-16 09:37:21

JavaScript事

2009-08-12 18:28:09

C#事件處理程序

2009-06-17 09:48:11

javascript手事件參考

2017-08-28 15:21:29

異步處理回調函數異步編程

2017-03-14 13:51:23

AndroidView事件分發和處理

2021-11-11 11:24:54

JavaScript模型事件

2025-03-19 10:22:09

JavaScript編程語言開發

2010-10-08 10:03:52

JavaScript圖像

2021-09-02 10:24:54

JavaScript前端語言

2009-10-27 11:39:03

VB.NET事件處理程

2011-05-20 14:22:11

.NET

2025-02-13 13:14:49

JavaScriptnullundefined

2021-02-06 10:27:45

C#函數參數

2018-11-21 12:27:21

JavaScript 貨幣值區域

2011-08-10 16:57:15

iPhone事件程序包

2013-09-13 13:15:28

AndroidWebViewJavaScript

2020-09-25 11:10:51

運維故障排查監控

2020-08-19 08:29:22

JavaScript 對象函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久av | 欧美999 | 爱爱小视频 | 日本精品一区 | 精品国产乱码久久久久久1区2区 | 中文字幕精品一区二区三区精品 | 国产一区2区 | 中国xxxx性xxxx产国 | 亚洲网站在线观看 | 欧美在线视频一区二区 | 91精品国产综合久久精品 | 久久国产成人 | 成人在线视频免费观看 | 日本高清不卡视频 | 亚洲人成人网 | 天天综合永久入口 | 中文字幕在线精品 | 精品一区二区三区免费视频 | 毛片黄| 99国产精品久久久久 | 国产一在线观看 | 欧美成视频 | 成人综合伊人 | 在线观看亚洲精品视频 | 91影院在线观看 | 国产精品一区二区在线观看 | 国产精品美女久久久久aⅴ国产馆 | 久久久久久久久中文字幕 | 亚洲国产高清高潮精品美女 | 亚洲视频第一页 | 综合色播| 波多野结衣二区 | 亚洲精品综合 | 亚洲国产乱码 | 亚洲播放| 久久精品99国产精品 | 九九热国产精品视频 | 在线看亚洲 | 在线看亚洲 | 久久噜噜噜精品国产亚洲综合 | 欧美国产日韩在线 |