MooTools и конфликт jQuery - несмотря на безопасный режим доллара
Я пытаюсь заставить некоторый ранее существующий код MooTools функционировать должным образом на сайте Drupal. Я знаю, что код MooTools работает сам по себе. Как только я загружаю библиотеку MooTools на странице, jQuery перестает работать.
Я включаю MooTools после jQuery, что (по мнению разработчиков MooTools) должно препятствовать тому, чтобы Moo украл уже определенный $ из уже загруженной библиотеки jQuery.
Я преобразовал все ссылки на $ в моем коде Moo в document.id.
Когда я загружаю страницу, код Moo работает, а код jQ - нет. Похоже, что Moo все еще крадет переменную $ у jQ и переопределяет ее для себя. В целях тестирования загружаемый код Moo представляет собой простой скрипт 12 Accordion. Есть более сложные, которые мне нужно использовать, если я решу эту проблему.
Drupal широко использует jQuery, поэтому использование режима no_conflict в jQ нецелесообразно. Из того, что я понимаю, это должно быть возможно с учетом безопасного режима доллара.
Я использую MooTools Core 1.2.4 и MooTools More 1.2.4.4 и jQuery 1.2.6 (также пробовал 1.4.2).
5 ответов
Вместо того, чтобы использовать $
для доступа к функциям jQuery, которые вы всегда можете использовать jQuery()
,
Вы даже можете передать свой собственный идентификатор при использовании .ready()
, пример:
jQuery(document).ready(function(myIdentifier){
myIdentifier(); // this is the jQuery reference!
});
Странно, это не то, что должно происходить, если честно. Так как mootools 1.2.3(?) (Возможно, был 1.2.1), он НЕ будет принимать присвоение $, если оно уже определено на странице. То есть, если порядок загрузки такой, как описано:
JQuery MooTools
... тогда moootools автоматически перейдет в режим совместимости и вернется к document.id. Единственный случай, когда это не будет истиной, - это если jquery загружается в режиме noConflict, что помешает ему назначить jQuery для $ и не даст повода mootools не захватывать его.
Во всяком случае, это теория. Если вы видите другое поведение, значит, что-то не так с браузером. Вы лениво загружаете или неблокируете / параллельно загружаете сценарии?
Обычно здесь рекомендуется оставлять jquery в собственном режиме (без noConflict) и переназначать $ на document.id, чтобы заботиться о mootools в такой области видимости:
<div id="foo"></div>
а потом:
$("#foo"); // jquery
(function($) {
$("foo"); // mootools.
})(document.id);
В последнее время было множество вопросов на эту тему, просто прочитайте последние вопросы о mootools. в противном случае, пожалуйста, опубликуйте URL вашего проекта.
Очевидно, что вы можете console.log($) проверить / подтвердить это: http://www.jsfiddle.net/AxVqy/ -> testcase
Почему ты не используешь 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 вместе с любым заказом, который я хочу.
Если мне нужно использовать оба, я сначала включаю jQuery, а затем Mootools (1.3). Если вам не нужно беспокоиться о jQuery, у него нет конфликтов, так как совместимость Mootools включается автоматически, а затем определите $
для Mootools и JQuery для быстрых ярлыков, т.е. (function($){ /*stuff*/ })(document.id)
и т.п.
Это зависит больше от плагинов, используемых в вашем случае. Сам jQuery может работать нормально, но если плагин не написан по их рекомендации, он не будет работать.