從jQuery的緩衝到事件監聽

來源:互聯網
上載者:User

標籤:blog   http   java   使用   資料   width   

不知道大家有沒有發現,用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的註冊的事件逐一執行就可以了。這其實是一種通用的事件處理機制,事件處理機制是一種典型的觀察者設計模式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.