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。