jQuery noConflict

时间:2011-08-11 13:23:40

标签: jquery

在这个简单的例子中:

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中(函数($){}。

6 个答案:

答案 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的评论)