【问题标题】:Namespacing jQuery plugins命名空间 jQuery 插件
【发布时间】:2011-11-11 13:34:16
【问题描述】:

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

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

我使用标准的 jQuery 插件模式。第一个实际上是其名称空间的其余插件的代理或“外观”。 例如,当我调用$('#el').foo() 时,我也会在后台调用:

变量上下文 = 这个; // 上下文等于 $('#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(); // 这也会在后台调用 foo.bar 和 foo.baz $('#el').foo.bar(); // 我正在显式调用 foo.bar

【问题讨论】:

  • 没有调用“$(context).foo['baz'].apply(context);”多余的不应该只是 "$(context).foo['baz'];"
  • @Keith 如果他这样称呼它,this 将是文档而不是它被调用的元素。
  • 这种命名空间很流行。请编写一个合理的架构,比如模块化代码,或者使用任何函数式或 OO 模式
  • @KevinB 谢谢你的澄清

标签: javascript jquery jquery-plugins


【解决方案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"
});

【讨论】:

  • 嗯...也许这不是我真正想要的,但它绝对是有用的链接。我只问一个问题:在$('#el').aaa.bbb.ccc() 这样的语句中,this 可以在函数ccc 中等于$('#el')
猜你喜欢
  • 2012-03-02
  • 1970-01-01
  • 2012-09-19
  • 2010-11-19
  • 2012-02-21
  • 2014-03-09
  • 2015-12-01
  • 2012-02-02
  • 1970-01-01
相关资源
最近更新 更多