2010-11-05 31 views
1

我有一個JQuery 1.4.2插件,它使用一組選項。這是僞代碼是這樣的:爲什麼我的JQuery插件沒有得到它自己的實例?

(function($) { 
    // Shell for the plugin code 
    $.fn.myPlugIn = function(options) { 
    // Plugin code 
    return this.each(function() { 
     // for each item in selector 
     options = $.extend($.fn.myPlugIn.defaults, options); 
     ...do stuff 
    }); 
    $.fn.myPlugIn.defaults = { 
    header  : null, 
    position : 'absolute', 
    top   : null, 
    left  : null, 
    forinput : null, 
    forAnchor : null, 
    sAjaxSource : null, 
    onClick  : null 
    }; 
    })(jQuery); 

當尋求在單頁上的幾個要素的插件,該選項是不是唯一的 - 由先前的元素選項仍然在選項。

$(document).ready(function() { 
    $("#div1").myPlugIn(
      {forinput: "input1", 
      onClick: function(data){ 
       ... do stuff 
      }, 
    }); 
    $("#div2").myPlugIn({ 
      forAnchor: "link1", 
      onClick: function(data){ 
       ... do stuff 
      }, 
     header: "Parts" 
    }); 

}); 

我在做什麼錯?我預計每次找到插件時,都會使用傳遞給它的選項。相反,它使用第一個實例中的所有選項,並覆蓋第二個實例中的任何重新初始化的屬性。

任何答覆的讚賞。提前感謝閱讀我的文章。

回答

4

您需要的選項合併成一個新的對象該實例,像這樣:

options = $.extend({}, $.fn.myPlugIn.defaults, options); 

$.extend()合併到第一個參數之後的參數傳遞的所有對象,所以目前他們正在合併納入您的$.fn.myPlugIn.defaults默認值,使其受到下一次使用的污染。相反,你想永遠不要混淆默認值(除非有意在別處改變它們)並將選項和默認值合併到另一個新對象中。

1

第二件事就是添加'var options = ...',省略var使其成爲全局變量,這些設置選項爲上次調用的屬性。

+0

這裏不會是全局變量,因爲它是函數的一個參數。 – 2010-11-05 23:06:56

+0

感謝您的回覆! – Griff 2010-11-08 19:02:51

相關問題