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

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

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

    我是FE,也是Fe

    前端來源于不斷的點滴積累。我一直在努力。

    統計

    留言簿(15)

    閱讀排行榜

    評論排行榜

    從jQuery的緩存到事件監聽

    很久以前,我還在cnblogs里面逛的時候就提出過一個問題(剛找了半天沒找到)。不知道大家有沒有發現,用jQuery選擇器"選擇"之后的DOM上會添加jQuery*********屬性。

    <DIV id=d1 jQuery1294122065250="1">abc </DIV>

    首先jQuery1294122065250中的"1294122065250"其實是一個時間戳。看看jQuery的源代碼。

    var expando = "jQuery" + now(), uuid = 0, windowData = {};

    由于使用了閉包,這樣每一個jQuery對象都有一個expando屬性。
    屬性值jQuery1294122065250="1"的"1"其實是jQuery的緩存的key。

    首先了解一下jQuery緩存的相關API:

    • data(name):返回元素上儲存的相應名字的數據
    • data(name,value):在元素上存放數據,同時也返回value。
    • jQuery.data(element,key,value):在元素上存放數據,返回jQuery對象。注意:這是一個底層方法。你應當使用.data()來代替。
    • jQuery.data([element],[key]): 查詢在元素上存放的數據。如果不指定參數,則會返回元素上面存放的所有數據,以Object的形式返回。注意:這是一個底層方法。你應當使用.data()來代替。
    • removeData(data):移除元素上的緩存。

    把jQuery.data方法是底層方法,data方法調用了該方法。要了解Query的緩存,最好的方法莫過于調試一下jQuery代碼了。

    <script type="text/javascript">
        $(
    function(){
            
    var $d1= $("#d1");
            $d1.data(
    "key","value");
            
    var v = $d1.data("key");

            $d1.click(
    function(){
                alert(
    "click");
            });
            
    for (var k in jQuery.cache){
                alert(k
    +"\n"+jQuery.cache[k]);
            }
            
    debugger;
        });
    </script>
    <div id="d1" class="">
        abc
    </div>

    上面是一個簡單的jQuery代碼。在執行完$d1.data("key","value");后。經過調試后可以發現

    jQuery是一個全局變量:
    // Define a local copy of jQuery
    var jQuery = function( selector, context ) {
            
    // The jQuery object is actually just the init constructor 'enhanced'
            return new jQuery.fn.init( selector, context );
        },

        
    // Map over jQuery in case of overwrite
        _jQuery = window.jQuery,

        
    // Map over the $ in case of overwrite
        _$ = window.$,


    jQuery.data存放著所有的緩存key就是上面提到的DOM屬性jQuery*********的值。
    下面是讀取緩存data函數的關鍵代碼:
    data: function( elem, name, data ) {
            
    var id = elem[ expando ], cache = jQuery.cache, thisCache;

            thisCache 
    = cache[ id ];

            
    return typeof name === "string" ? thisCache[ name ] : thisCache;
        },

    經過調試id 與jQuery********屬性一致。直接通過jQuery.cache獲取緩存值。

    有緩存就必然會有清除緩存,不清除緩存意味著很有可能IE內存泄漏。
    // Prevent memory leaks in IE
    //
     Window isn't included so as not to unbind existing unload events
    //
     More info:
    //
      - http://isaacschlueter.com/2006/10/msie-memory-leaks/
    if ( window.attachEvent && !window.addEventListener ) {
        window.attachEvent(
    "onunload"function() {
            
    for ( var id in jQuery.cache ) {
                
    if ( jQuery.cache[ id ].handle ) {
                    
    // Try/Catch is to handle iframes being unloaded, see #4280
                    try {
                        jQuery.event.remove( jQuery.cache[ id ].handle.elem );
                    } 
    catch(e) {}
                }
            }
        });
    }
    在window.unload時,jQuery將逐一刪除jQuery.cache中的元素。

    jQuery的事件綁定也利用了jQuery的緩存。上面的代碼監聽了#d1.click事件后,經過調試,可以發現,在緩存key為"events"上記錄了監聽的事件。


    通過上面的調試,發現所謂的事件監聽或者綁定bind,其實就是在緩存中注冊一下處理函數,當事件觸發時,將DOM的注冊的事件逐一執行就可以了。這其實是一種通用的事件處理機制,事件處理機制是一種典型的觀察者設計模式。

    posted on 2011-01-04 15:20 衡鋒 閱讀(4410) 評論(5)  編輯  收藏 所屬分類: javascriptJqueryWeb開發

    評論

    # re: 從jQuery的緩存到事件監聽 2011-01-04 18:39 ugg boots stores

    表示很無奈啊  回復  更多評論   

    # re: 從jQuery的緩存到事件監聽[未登錄] 2011-01-06 18:17 dm1299onion@gmail.com

    博主、你用的是什么測試工具呀?可以看代碼結構?  回復  更多評論   

    # re: 從jQuery的緩存到事件監聽 2011-01-06 22:16 陽衡鋒

    @dm1299onion@gmail.com
    這不是什么測試工具和代碼結構,只是IE8 的開發者工具調試了一下javascript。截圖是javascript面板的監視面板。  回復  更多評論   

    # re: 從jQuery的緩存到事件監聽 2011-01-12 15:32 窩窩影視

    jQuery算是 知道了!  回復  更多評論   

    # re: 從jQuery的緩存到事件監聽 2011-09-16 08:28 tbw

    不錯 又學了一招了   回復  更多評論   

    主站蜘蛛池模板: 最近中文字幕无吗免费高清| 99免费在线视频| 成人网站免费观看| 亚洲中文无码线在线观看| 精品福利一区二区三区免费视频 | 国产一区二区三区亚洲综合| 午夜两性色视频免费网站| 亚洲精品成a人在线观看夫| 免费观看的av毛片的网站| 亚洲av永久中文无码精品综合| 国产极品粉嫩泬免费观看 | 亚洲AV无码专区亚洲AV伊甸园| 久久免费高清视频| 久久精品国产亚洲AV无码偷窥| 1000部拍拍拍18勿入免费凤凰福利| 亚洲国产成人精品无码一区二区| 一二三四免费观看在线视频中文版| 亚洲精品伦理熟女国产一区二区| 狠狠久久永久免费观看| 一区二区三区精品高清视频免费在线播放| 免费在线不卡视频| 国产成人免费AV在线播放| 亚洲高清视频免费| 日本一道本高清免费| 国产免费播放一区二区| 亚洲精品456在线播放| 女人18一级毛片免费观看| 搜日本一区二区三区免费高清视频| 亚洲中文久久精品无码| jjizz全部免费看片| 亚洲av成人一区二区三区观看在线| 国产精品亚洲αv天堂无码| 99re6在线精品视频免费播放| 狠狠色伊人亚洲综合网站色| 免费国产成人午夜私人影视| 一级毛片aaaaaa免费看| 亚洲国产欧洲综合997久久| 亚洲AV永久无码精品一百度影院 | 两个人日本WWW免费版| 亚洲中文字幕AV在天堂| 中文字幕亚洲日韩无线码|