2010-05-11 32 views
1

我试图让一些预先存在的MooTools代码在Drupal站点内正常工作。我知道MooTools代码可以独立运作。一旦我在页面中加载MooTools库,jQuery就停止运行。MooTools和jQuery的冲突 - 尽管美元安全模式

我在jQuery之后加入了MooTools,它(根据MooTools的开发者)应该防止Moo从已经加载的jQuery库中窃取已定义的$。

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

当我加载页面时,Moo代码有效,但jQ代码没有。看来Moo仍然在从jQ中窃取$变量并重新定义它自身。出于测试目的,我正在加载的Moo代码是一个简单的12手风琴脚本。如果我解决了这个问题,我需要使用更复杂的。

Drupal广泛使用jQuery,所以使用jQ的no_conflict模式不是一个可行的选择。据我所知,这应该是可能的美元安全模式。

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

回答

0

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

3

除了使用$来访问jQuery函数,您始终可以使用jQuery()

使用.ready()时,您甚至可以通过自己的识别码,例如:

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

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

}); 
3

奇,这是的东西应该发生,是诚实的。由于mootools 1.2.3(?)(可能是1.2.1),如果它已经在页面上定义,它不会接管赋值$。也就是说,如果装载的顺序描述:

jQuery的 mootools的

...然后moootools将自动进入兼容模式并恢复到document.id。唯一的情况是,如果jquery以noConflict模式加载,这将阻止它将jQuery分配给$,并且不会让mootools不抓住它。

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

最好的做法在这里通常是,离开的jQuery在本机模式(W/O noConflict),并重新分配至$ document.id照顾的mootools的一个范围,像这样:

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

,然后:

$("#foo"); // jquery 

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

最近有很多关于这个问题的问题,只是通读了最新的mootools问题。否则,请将网址发布到您的项目中。

很明显,你可以控制台。日志($)检查/确认: http://www.jsfiddle.net/AxVqy/ - > testcase

1

为什么不使用jQuery而不是$? 如果因任何原因,你不能做到这一点noConflict();并不意味着你必须停止使用$ 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(){}与我第一次loadeed mootools的jQuery(document).ready(function($) {});

通知,你也可以做这样的事情周围的每段代码:

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


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

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

0

如果我必须同时使用,我首先包含jQuery,然后包含Mootools(1.3)。如果您不需要打扰jQuery,则不会因为Mootools兼容性自动启动而发生冲突,那么可以为Mootools和jQuery定义$以便快速切换,即(function($){ /*stuff*/ })(document.id)等。