假设我们有以下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
答案 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"
});