jQuery noConflict

在这个简单的例子中:

var myFunction = function(obj) { console.log($(obj)); } 

我正在使用$。 如果我使用:

 jQuery.noConflict(); var myObj = {X:1}; myFunction(myObj); 

然后$不再有效。

但是,如果我将myFunction包装在里面

 jQuery(function($) { var myFunction = function(obj) { console.log($(obj)); } }); 

然后它不再被发现。 myFunction在一个单独的脚本中,所以我无法将所有东西都包装在一个巨大的jQuery(function($){}中。

试试这个:

 ( function($) { window.myFunction = function(obj) { console.log($(obj)); } })(jQuery); 

单独的文件:

 myFunction({X:1}); 

不同之处在于,您的代码不会在dom准备就绪后立即执行,并且您将函数放在全局上下文(窗口)中,因此它将随处可用。

我不知道你在做什么,但在这种情况下你可能会发现一个更适合你的JQuery插件:

 ( function($) { $.fn.myFunction = function(obj) { console.log(this); } })(jQuery); 

单独的文件:

 jQuery({X:1}).myFunction(); 

当然,$({X:1})可能会用JQuery做一些奇怪的事情 – 我以前从未尝试过!

为什么不改变你的function来做到这一点:

 var myFunction = function(obj) { console.log(jQuery(obj)); } 

你也可以这样做:

 var $j = jQuery.noConflict(); var myFunction = function(obj) { console.log($j(obj)); } 

然后你可以使用$ j你只使用$ $。

解决方案不是包装myFunction()而是包含其内容。

 var myFunction = function(obj) { (function( $ ) { console.log($(obj)); })( jQuery ); }; 
 var myFunction = function(obj) { console.log(jQuery(obj)); } 

noConflict只是意味着你不能使用$ ,这是jQuery的简写。 您不需要将所有内容都包装在onLoad处理程序(最后一个示例)中,因为您进入了noConflict模式。

使用您喜欢的任何方式将现有的$转换为jQuery 。 选项包括:

  • 在文本编辑器中搜索和替换;
  • 各个代码段周围的上下文包装function。

您可以命名您的外部脚本:

 var WEB = function ($) { return { myFunction: function(obj) { console.log($(obj)); } // can add more properties / functions here }; }(jQuery); 

那么你的主脚本可能如下所示:

 jQuery(function($) { var myObj = {X:1}; WEB.myFunction(myObj); }); 

然后你不需要在所有外部代码中更改$ to jQuery,并且主脚本仍然很小。 如果您想模块化您的代码,这很有效。 它还可以防止您通过脚本访问许多函数来污染全局命名空间 – 所有代码都可以在WEB命名空间下进行组织。 您只是向全局命名空间添加单个var(WEB)。

您还可以使用此模式的变体来隐藏有关实现的信息。 请参阅:http://yuiblog.com/blog/2007/06/12/module-pattern/(不要错过CaridyPatiño的评论)

不要使用var,因为它将是ready()函数的局部变量。 使用window.myFunction,直接定义myFunction,或者在.ready()之外创建var。