jquery插件,不在实例之间共享其配置

时间:2009-04-13 20:51:20

标签: jquery oop jquery-plugins

我正在使用一个看起来像这样的jquery插件:

(function($){
    var options;
    $.fn.main(opts){
        options = opts;
        //rest of code
    }
    $.fn.otherFunc(){
        //does something with options
    }
}(jQuery));

这里的问题是,如果我在页面上使用此插件5次,则选项变量会被覆盖,因此所有5个实例共享这些选项。这很糟糕,我希望每个插件实例都有自己的配置。

有没有非hackish jQuery方法来实现这个目标吗?

修改

我应该补充一点,我会在$ .fn.main中考虑$(this)的附加选项作为expando有点hackish,因为$ .fn.otherFunc可能不会从main函数调用$(this),所以我不能访问我的东西!

2 个答案:

答案 0 :(得分:2)

如果你将相同的插件应用于这样的几个元素

$("#div1, #div2, #div3, #div4, #div5").main(opts);

你应该用不同的选项将它分成5个不同的选项 - 即:

var opts1 = {...};
$("#div1").main(opts1);

var opts2 = {...};
$("#div2").main(opts2);

// etc.

另外,在$.fn.otherFunc添加一个paraemter,以接收应该处理的选项对象。

编辑:如果您未在otherFunc内拨打main(),则应考虑为何要在他们之间共享选项。在这种情况下,如果你发布了你原来的问题(即你试图解决的现实世界问题),我们可能会提供一个更好的解决方案,而不是让两个不同的插件共享选项,而不是将它们合并为一个。

答案 1 :(得分:1)

您的示例中给出的代码有语法错误,我猜这会更好用:

(function($){
    var options;
    $.fn.main = function(opts){
        options = opts;
        //rest of code
        alert(options.text);
    }
    $.fn.otherFunc = function(){
        //does something with options
    }
})(jQuery);

$('a:first').main({text:'txt'});
$('a:last').main({text:'some other text'});

在你的代码中,我建议将选项数据添加到DOM元素本身以跟踪选项,毕竟,这就是“行为”所针对的位置,因此将其保留在那里是很自然的,而不是一个单独的对象。