我正在尝试获取一些预先存在的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)。
答案 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)
等。