<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    CONAN ZONE

    你越掙扎我就越興奮

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      0 Posts :: 282 Stories :: 0 Comments :: 0 Trackbacks
    眾所周知, 瀏覽器中內存泄露以及內存無法回收(兩者不是一回事,很多人都把他們弄混淆了),常常是由于對dom元素注冊事件不當引起的.

    通常的解決方案是, 自行實現一套 添加事件, 移除事件 以及刪除dom元素的機制.
    為dom元素添加事件時, 同時記錄 這個事件 以及對應的函數,
    在刪除dom元素時, 先移除dom元素上已經添加的事件 再刪除dom元素本身.

    而當頁面中添加了事件監聽的dom元素很多時, 移除元素變得很麻煩.
    例如 一個div 里面有個form form里有多個元素都添加了事件.
    那么移除這個div時, 就要先去移除他下面每一個元素上的事件 然后再移除這個div.

    這種做法很多時候是必須的, 而且自己寫一個"深度遍歷子節點,并移除其事件"的函數也并不是很困難.

    但是 在很多時候 這種做法是可以避免的, 避免的方法就是, 把事件監聽注冊到更上層的dom元素中.
    并且在事件函數中 通過 event.target/event.srcElement 來 事件發生在哪個元素上,然后來執行相關的方法.
    這樣 在移除元素時 只要移除這個元素以及它上面的事件 就可以了, 而不必執行(或者少量的執行)"移除所有子節點事件"的動作了.


    見下面的例子 :

    Html代碼 復制代碼
    1.  <table width="300" border="1"  onclick="showDetail(event)">    
    2.  <tr>  
    3. <td>1</td>  
    4. <td>Tom</td>  
    5. <td><input type="button" value="詳細信息" userid="1" /></td>  
    6.  </tr>  
    7.  <tr>  
    8. <td>2</td>  
    9. <td>Kate</td>  
    10. <td><input type="button" value="詳細信息" userid="2"  /></td>  
    11.  </tr>  
    12.  <tr>  
    13. <td>3</td>  
    14. <td>John</td>  
    15. <td><input type="button" value="詳細信息"  userid="3" /></td>  
    16.  </tr>  
    17.  </table>  


    在這個例子中, 實際上事件只是注冊在table上, 而沒有在"input type="button"上.

    "showDetail" 可以這樣寫

    Javascript代碼 復制代碼
    1. function showDetail_b(event) {   
    2.     event=event||window.event;   
    3.     var target=event.target||event.srcElement;   
    4.     if ( String(target.tagName).toLowerCase()=='input' &&  target.value=="詳細信息") {   
    5.         showUserDetail(target.getAttribute('userid') );   
    6.     }   
    7. }  



    當然 這種做法不是絕對的, 有時候這么做很可能讓代碼變得臃腫冗長.
    到底是否使用"事件上提"的做法 要根據實際情況來選擇.
    不過 根據我的以往經驗, 在列表(table)中, 使用這種技術非常合適.
    因為 列表有著"行與行之間模型一致"(只是數據不一致,結構一致)的特點.

    例如,下面的效果, 都可以通過在 table上注冊事件來實現:

    1 點擊行, 行變色 (不必在 tr 上注冊點擊事件)
    2 點擊行中的某個按鈕 (不必在 tr 里的 button 上注冊點擊事件)
    3 鼠標經過行時 行變色 (不必在 tr上注冊 mouseover/mouseout 事件, 而是可以在table上注冊mousemove事件)
    4 還有關于單元格的 很多效果.....

    當然,在非列表里 這種做法也有很多的用武之地.
    總之 合理的利用"事件上提"的方法, 可以增強dom元素和事件的可控性, 有效的防止內存泄露和內存無法回收的情況.
    posted on 2008-07-23 23:03 CONAN 閱讀(201) 評論(0)  編輯  收藏 所屬分類: JS
    主站蜘蛛池模板: 久久久久久久久无码精品亚洲日韩 | 亚洲国产成人一区二区三区| 极品色天使在线婷婷天堂亚洲| 成人免费视频一区二区三区| 亚洲午夜电影在线观看| h视频在线免费看| 亚洲免费人成视频观看| 毛片免费全部免费观看| 亚洲欧美日韩综合俺去了| 最新69国产成人精品免费视频动漫| 精品亚洲456在线播放| 麻豆国产人免费人成免费视频| 亚洲国产区男人本色| 免费看小12萝裸体视频国产| 日韩在线一区二区三区免费视频| 亚洲裸男gv网站| 免费成人在线电影| 亚洲成年人电影网站| 国产男女猛烈无遮挡免费视频网站| 亚洲AV无码一区二区三区网址| 全部免费a级毛片| 日韩a级无码免费视频| 在线观看亚洲人成网站| 天天摸天天碰成人免费视频| 国产精品亚洲va在线观看| 精品国产亚洲男女在线线电影 | 美女视频黄a视频全免费| 毛片亚洲AV无码精品国产午夜| 国产国拍精品亚洲AV片| 久久国产色AV免费看| 亚洲综合欧美色五月俺也去| 亚洲国产成人久久精品99| 日本一区二区免费看| 亚洲精品国产av成拍色拍| 黑人大战亚洲人精品一区| 91久久成人免费| 一级特级女人18毛片免费视频| 亚洲毛片在线观看| 四虎影视永久免费观看网址| 国产精品免费观看调教网| 亚洲国产美女精品久久久|