我正在编写一个jQuery插件,理想情况下我想要它自己的命名空间。
到目前为止,这似乎有效(在命名空间嵌套方面)
(function($) {
$.fn.nspace = {
foo: function() {
// Does not work becuase $(this) is not the correct selector.
$(this).show();
}
}
})(jQuery);
所以给出上面的例子,我可以这样调用我的函数:
$("html, body").nspace.foo();
但$(this)
不是[html, body]
...我该如何解决这个问题?
编辑:澄清(根据用户评论)......
$("html, body").nspace.foo();
应该为[html, body]
调用foo但是,nspace中的$(this)
会解析为nspace ...所以它试图调用nspace.foo();
答案 0 :(得分:1)
你应该考虑使用jQuery插件的经典模式:只定义一个方法:在你的情况下,nspace。在此方法中,您将考虑每个案例。听起来很难,但是一旦你研究了that,这很容易。 (顺便说一下,在编写jQuery插件时你一定要看一下)
答案 1 :(得分:1)
你不应该这样做,但仅仅因为我不喜欢有人在编程中说“你不能”(通常是不真实的,特别是在Javascript中) - 这就是你如何做到这一点:
jQuery对象每次使用其prototype.init函数构造,该函数别名为fn.init,因此您可以使用包装函数覆盖它,该函数以不损害任何现有用法的方式添加命名空间对象或图书馆,如:
(function($) {
var baseInit = $.fn.init;
$.fn.init = function(selector, context, rootjQuery) {
// Instantiate jQuery the way it expects
var j = new baseInit(selector, context, rootjQuery);
// Add our extra object/namespace
// Use j inside to refer to the current jQuery object
j.nspace = {
foo: function() {
j.show();
}
};
// Return it all and other libraries are none the wiser
return j;
}
})(jQuery);
答案 2 :(得分:0)
您无法将对象添加为插件,仍然可以获取用于获取对象的jQuery对象。在对象中调用方法时,您根本没有引用该jQuery对象。
直接将该功能作为插件:
(function($) {
$.fn.nspace = function() {
this.show();
};
})(jQuery);
用法:
$("html, body").nspace();
(请注意,对象是jQuery实例,而不是选择器或元素,因此您不需要使用$(this)
)。