命名空间jQuery插件

时间:2011-11-11 13:34:17

标签: javascript jquery jquery-plugins

假设我们有以下jQuery插件(每个插件都在不同的文件中):

  • $.fn.foo
  • $.fn.foo.bar
  • $.fn.foo.baz

我使用标准的jQuery插件模式。第一个实际上是它的命名空间的其余插件的代理或“外观”。 例如,当我打电话给$('#el').foo()时,我也称之为:

var context = this; // context is equal to $('#el')
$(context).foo['bar'].apply(context);
$(context).foo['baz'].apply(context);

如果我只想调用 (没有$.fn.foo$('#el').foo.bar(),则会出现两个问题。第一个问题是没有$.fn.foo命名空间但我可以创建它,所以这实际上没问题。第二个问题是this内的$.fn.foo.bar等于document个对象,但我希望等于$('#el')。我怎样才能做到这一点?

所以,长话短说,两者都应该有效:

$('#el').foo();     // This also calls foo.bar and foo.baz under the hood
$('#el').foo.bar(); // I'm calling foo.bar explicitly

1 个答案:

答案 0 :(得分:1)

我认为您可能只需要遵循不同的插件模式。这是一个很好的repository of jQuery plugin patterns,但您可能想要查看的是namespace pattern - 如果命名空间尚不存在,您将看到最初如何定义命名空间,这样您就可以了更容易从单个命名空间扩展到多个脚本。


更新:嗯,我还在学习,所以我不会说我是这方面的专家,但试图让$('#el').aaa.bbb.ccc()工作对我来说非常麻烦。也许最好不要使用那种格式,而是这样做(demo):

$.aaa.bbb.ccc( $("#el") );

因为这样设置相对容易:

(function() {
    if (!$.aaa) {
        $.aaa = {
            bbb : {
                ccc: function(el, options){
                    alert(el[0].id);
                }
            }
        };
    };
})(jQuery);

$(function() {
    $.aaa.bbb.ccc( $("#el") ); // alerts "el"
});