将正确的jQuery选择器传递给对象

时间:2013-04-02 09:00:57

标签: javascript jquery namespaces

我正在编写一个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();

3 个答案:

答案 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);

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

答案 2 :(得分:0)

您无法将对象添加为插件,仍然可以获取用于获取对象的jQuery对象。在对象中调用方法时,您根本没有引用该jQuery对象。

直接将该功能作为插件:

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

用法:

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

(请注意,对象是jQuery实例,而不是选择器或元素,因此您不需要使用$(this))。