在这个简单的例子中:
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中(函数($){}。
答案 0 :(得分:3)
试试这个:
( 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做一些奇怪的事情 - 我以前从未尝试过它!
答案 1 :(得分:2)
为什么不改变你的功能来做到这一点:
var myFunction = function(obj) {
console.log(jQuery(obj));
}
你也可以这样做:
var $j = jQuery.noConflict();
var myFunction = function(obj) {
console.log($j(obj));
}
然后你可以在任何地方使用$ j只使用$。
答案 2 :(得分:2)
解决方案不是包装myFunction()
,而是包装其内容。
var myFunction = function(obj) {
(function( $ ) {
console.log($(obj));
})( jQuery );
};
答案 3 :(得分:1)
var myFunction = function(obj) {
console.log(jQuery(obj));
}
noConflict
只是意味着您无法使用$
,这是jQuery
的简写。您不需要将所有内容包装在onLoad处理程序(最后一个示例)中,只是因为您进入了noConflict
模式。
使用您喜欢的任何方式将现有$
转换为jQuery
。选项包括:
答案 4 :(得分:1)
不要使用var,因为它将是ready()函数的局部变量。使用window.myFunction,直接定义myFunction,或者在.ready()之外创建var。
答案 5 :(得分:1)
您可以命名外部脚本:
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的评论)