2009-02-25 69 views
7

我想寫一個插件,將幾個方法添加到jQuery包裝對象。基本上,我想初始化它是這樣的:jQuery:是否可以將字段/方法附加到jQuery包裝器對象?

var smart = $('img:first').smartImage(); 

的「SmartImage技術的」插件會附上2種方法被「聰明」的引用的對象,所以我就可以這樣做:

smart.saveState(); 
// do work 
smart.loadState(); 

不幸的是,我想不出如何將這兩種方法附加到包裝對象。我的代碼如下典型jQuery插件圖案:

(function($) 
{ 
    $.fn.smartImage = function() 
    { 
     return this.each(function() 
     { 
      $(this).saveState = function() { /* save */ } 
      $(this).loadState = function() { /* load */ } 
     } 
    } 
} 

後我請SmartImage技術(),既不「saveState和」也不「LoadState的」被定義。我究竟做錯了什麼?

回答

5

你不能以你已經演示的方式附加方法/屬性,因爲正如你所說,jQuery對象只是它包含的任何DOM元素的包裝。你當然可以附加方法/屬性,但當它們再次被jQuery選中時,它們將不會保留。

var a = $('.my-object'); 
a.do_something = function(){ alert('hiya'); } 
a.do_something(); // This alerts. 

var b = $('.my-object'); 
b.do_something(); // Freak-out. 

如果你想有一個方法,jQuery對象上存在恢復它時,第二次,它需要被分配到jQuery.fn。所以,你可以定義您的輔助方法,將其分配給jQuery.fn,並使用jQuery的數據設置,以保持狀態,你...

$.fn.setup_something = function() 
{ 
    this.data('my-plugin-setup-check', true); 
    return this; 
} 

$.fn.do_something = function() 
{ 
    if (this.data('my-plugin-setup-check')) 
    { 
     alert('Tada!'); 
    } 
    return this; 
} 

var a = $('.my-object').setup_something(); 
a.do_something(); // Alerts. 
$('.my-object').do_something(); // Also alerts. 

我建議你看看http://docs.jquery.com/Internals/jQuery.datahttp://docs.jquery.com/Core/data#name

+0

我不知道這個'數據'地圖的事情,事實證明正是我想要的。謝謝! – 2009-02-26 15:17:48

5

你實際上是在smartImage()函數中返回一個jQuery對象。這是編寫jQuery插件的正確方法,以便您可以將其與其他jQuery函數進行鏈接。

我不確定是否有辦法做到你想要的。我會推薦以下內容:

(function($) { 
    var smartImageSave = function() { return this.each(function() { }); }; 
    var smartImageLoad = function() { return this.each(function() { }); }; 

    $.fn.extend({ "smartImageSave":smartImageSave, 
        "smartImageLoad":smartImageLoad }); 
}); 

var $smart = $("img:first"); 
$smart.smartImageSave(); 
$smart.smartImageLoad(); 

這是一種我熟悉併成功使用的技術。

2

我不完全知道爲什麼你這樣設計你的插件 - 你可能要考慮沿jonstjohn的建議線的東西 - 但你要問什麼,下面應該是類似於:

jQuery.fn.extend({ 
    smartImage: function() { 
     return { 
      saveState: function() { /* save */ }, 
      loadState: function() { /* load */ } 
     }; 
    } 
}); 
相關問題