2

我正在编写一个 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();应该调用 foo[html, body]但是,$(this)在 nspace 内部解析为 nspace ......所以它试图调用nspace.foo();

4

3 回答 3

1

您应该考虑为 jQuery 插件使用经典模式:只定义一种方法:在您的情况下,nspace。在此方法中,您将考虑每种情况。听起来很难,但是一旦你研究了它就很容易。(顺便说一下,在编写 jQuery 插件时你肯定要看看这个)

于 2013-04-02T09:16:01.473 回答
1

你不应该这样做,只是因为我不喜欢有人在编程中说“你不能”(通常是不真实的,尤其是在 Javascript 中)——你可以这样做:

jQuery 对象每次都使用它的原型函数构造,该函数别名为 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);

http://jsfiddle.net/b9chris/7TPZY/

于 2013-04-02T10:03:16.047 回答
0

您不能将对象添加为插件并仍然获取用于获取该对象的 jQuery 对象。当您调用对象中的方法时,您根本没有引用该 jQuery 对象。

把函数直接作为插件:

(function($) {
  $.fn.nspace = function() {
    this.show();
  };
})(jQuery);

用法:

$("html, body").nspace();

(注意,对象是 jQuery 实例,不是选择器或元素,所以不需要使用$(this))。

于 2013-04-02T09:15:53.200 回答