MooTools和jQuery冲突 - 尽管美元安全模式

时间:2010-05-11 16:14:20

标签: jquery drupal mootools conflict dollar-sign

我正在尝试获取一些预先存在的MooTools代码,以便在Drupal站点内正常运行。我知道MooTools代码可以自行运行。一旦我在页面中加载MooTools库,jQuery就会停止运行。

我在jQuery之后包含MooTools,(根据MooTools的开发人员)应该阻止Moo从已经加载的jQuery库中窃取已定义的$。

我已经将我的Moo代码中$的所有引用转换为document.id。

当我加载页面时,Moo代码可以工作但jQ代码却没有。似乎Moo仍在从jQ中偷走$变量并为自己重新定义它。出于测试目的,我正在加载的Moo代码是一个简单的12 Accordion脚本。如果我解决了这个问题,我需要使用更复杂的。

Drupal广泛使用jQuery,因此使用jQ的no_conflict模式不是一个可行的选择。根据我的理解,鉴于美元安全模式,这应该是可能的。

我正在使用MooTools Core 1.2.4和MooTools更多1.2.4.4和jQuery 1.2.6(也尝试过1.4.2)。

5 个答案:

答案 0 :(得分:3)

不是使用$来访问jQuery函数,而是始终使用jQuery()

使用.ready()时,您甚至可以传递自己的标识符,例如:

jQuery(document).ready(function(myIdentifier){

   myIdentifier(); // this is the jQuery reference!

});

答案 1 :(得分:3)

奇怪的是,这是应该发生的事情,说实话。由于mootools 1.2.3(?)(可能是1.2.1),如果它已经在页面上定义,它将不会接管$的赋值。也就是说,如果加载顺序如下所述:

的jquery mootools的

...然后moootools将自动进入兼容模式并恢复为document.id。唯一不会出现这种情况的例子是jquery是否以noConflict方式加载,这会阻止它将jQuery分配给$并且没有理由让mootools不抓它。

无论如何,这就是理论。如果您看到不同的行为,那么浏览器就会出现问题。你是懒惰加载还是非阻塞/并行加载脚本?

这里的最佳做法通常是将jquery留在本机模式(没有noConflict)并将$重新分配给document.id来处理像这样的范围内的mootool:

<div id="foo"></div>

然后:

$("#foo"); // jquery

(function($) {
    $("foo"); // mootools.
})(document.id);

最近有很多关于这个问题的问题,只需阅读最新的mootools问题。如果没有,请将URL发布到您的项目中。

显然,你可以通过console.log($)检查/确认这个: http://www.jsfiddle.net/AxVqy/ - &gt;测试用例

答案 2 :(得分:1)

为什么不使用jQuery代替$? 如果由于任何原因你不能这样做noConflict();并不意味着你必须停止使用$ for jQuery你可以做这样的事情:

<script type="text/javascript" src="mootools.js"></script>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
  $.noConflict();
  jQuery(document).ready(function($) {
    // Code that uses jQuery's $ 
  });
  // Code that uses mootools $ 
</script>

使用带有插件的jQuery时可能会遇到问题,只需将$(function(){}替换为jQuery(document).ready(function($) {});

请注意我首先讨厌mootools,你也可以围绕每段代码执行类似的操作:

(function($) {
    $("id"); // mootools.
})(document.id);


(function($) {
    $("#id"); // jQuery.
})(jQuery);

我遇到类似的问题,找到加载所有或一个或任何不同库组合的解决方案。一旦我想到如何做到这一点,我相信我可以与你分享,你一定能够做到这一点。但上面的解决方案应该适合你,我已经设法使用它来加载jQuery和mootools以及我想要的任何订单。

答案 3 :(得分:0)

这更多地取决于您的案例中使用的插件。 jQuery本身可能工作正常,但如果插件不是由他们的推荐书写的,那么它将无法正常工作。

答案 4 :(得分:0)

如果我必须使用两者,我首先包括jQuery,然后是Mootools(1.3)。如果您不需要打扰jQuery,它就没有冲突,因为Mootools兼容性会自动启动,然后为Mootools定义$,为快速快捷方式定义jQuery,即(function($){ /*stuff*/ })(document.id)等。