1

我正在尝试让一些预先存在的 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 More 1.2.4.4 和 jQuery 1.2.6(也尝试过 1.4.2)。

4

5 回答 5

3

代替使用$来访问 jQuery 函数,您总是可以使用jQuery().

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

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

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

});
于 2010-05-11T18:27:36.077 回答
3

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

jQuery mootools

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

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

这里的最佳实践通常是,让 jquery 处于本机模式(无冲突)并将 $ 重新分配给 document.id 以在如下范围内处理 mootools:

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

接着:

$("#foo"); // jquery

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

最近有很多关于这个主题的问题,只需阅读最新的 mootools 问题。否则,请发布一个 URL 到您的项目。

显然,您可以通过 console.log($) 检查/确认这一点:http: //www.jsfiddle.net/AxVqy/ -> testcase

于 2010-05-12T09:04:08.790 回答
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(){}jQuery(document).ready(function($) {});

请注意,我首先加载了 mootools,您也可以围绕每个代码部分执行类似的操作:

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


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

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

于 2010-10-11T18:28:44.833 回答
0

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

于 2010-05-11T18:23:31.060 回答
0

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

于 2010-12-15T03:13:35.667 回答