Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将正确的jQuery选择器传递给对象_Javascript_Jquery_Namespaces - Fatal编程技术网

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

Javascript 将正确的jQuery选择器传递给对象,javascript,jquery,namespaces,Javascript,Jquery,Namespaces,我正在编写一个jQuery插件,理想情况下,我希望它位于自己的名称空间中 到目前为止,这似乎是可行的(就名称空间嵌套而言) 根据上面的例子,我可以这样调用我的函数: $("html, body").nspace.foo(); 但是$(这个)不是[html,body]…我如何解决这个问题 编辑:以澄清(基于用户评论) $(“html,body”).nspace.foo()应该为[html,body]调用foo,但是,$(这个)在nspace内部解析为nspace…所以它试图调用nspace.fo

我正在编写一个jQuery插件,理想情况下,我希望它位于自己的名称空间中

到目前为止,这似乎是可行的(就名称空间嵌套而言)

根据上面的例子,我可以这样调用我的函数:

$("html, body").nspace.foo();
但是
$(这个)
不是
[html,body]
…我如何解决这个问题

编辑:以澄清(基于用户评论)


$(“html,body”).nspace.foo()
应该为
[html,body]
调用foo,但是,
$(这个)
在nspace内部解析为nspace…所以它试图调用
nspace.foo()

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

将函数直接作为插件放置:

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

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

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

您应该考虑使用jQuery插件的经典模式:仅定义一种方法:在您的情况下,nStult.在这个方法中,您将考虑每种情况。听起来很难,但一旦你调查过了,就很容易了。
(顺便说一句,在编写jQuery插件时,你一定要注意这一点)

你不应该这样做,只是因为我不喜欢有人在编程时说“你不能”(通常是不真实的,尤其是在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);

我不清楚什么不起作用。您能更具体地说明在foo()函数中希望得到什么吗?根据您的代码,$(this).show()将被调用2次:第一次调用$('html').show(),第二次调用$('body').show()。@Draykos,我的观点是,从$('html,body').nspace()调用$(this)时不是[html,body]$(这)在这个上下文中是对象(nspace),所以它实际上是在尝试执行nspace.foo()$(此)在此上下文中是foo对象:)这是可行的,但它会破坏名称空间,因此我必须添加难看的括号,如:$(“选择器”).nspace().foo()@series0ne:是的,你不能这样命名插件的名称空间(除非你使用属性getter,但不是所有浏览器都支持它们)。谢谢,这很有效!只是想知道为什么你“不应该”这么做?我希望将插件组织到自己的“名称空间”中的原因是:1,插件为jQuery添加了很多内容。2、新特性都是相关的,所以给它们命名是有意义的。3,一些新功能可能使用与jQuery函数相同的名称(例如position()),另一件事,使用您在VS2012中的示例,如果我尝试调用j.each(function(){$(this).click();});它可以工作,但当我调用$(this)时,VS intellisense不显示jQuery函数。你知道为什么吗?这没什么大不了的,但基本上每次有人调用$('blah'),他们都在运行你的代码,将你的命名空间和函数添加到他们的对象中。这是一个小的性能打击,但无论如何,还是有一个。@series0ne我在VS2012中测试了这个,它确实为j。您是否记得在JS文件的顶部添加///或jquery的任何路径?或者你的意思是其他地方——把一个jsfiddle放在一起,在不起作用的地方添加一条评论?@series0ne我现在明白了;是的,额外的层混淆了VS JS Intellisense解析器;您可能需要添加一个-vsdoc.js和vsdoc注释来帮助它。
(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);