jQuery и Mootools на одной странице

Опубликовано Четверг, 11 февраля, 201025 комментариевВеб-разработка

Использование jQuery + Mootools на одной странице

Ну вот, наконец, я ее все-таки дописал. Рассказать я сегодня хочу о том как подружить jQuery и Mootools. Многие спросят "нафига?". Мой ответ — надо. Надо было вот и искал решение, искал и нашел и теперь хочу поделиться. Вдруг еще кому понадобиться.

Начну издалека. Когда-то давно на www.yahoo.com я обнаружил возможность менять цветовую схему сайта. Тогда мне это показалось страшнейшим шаманством и я даже не стал пробовать разбираться. Много позже я наткнулся на еще один буржуйский сайт где можно было менять фоновую картинку. И вот это я уже никак не смог проигнорировать. Кстати, именно это можно сейчас наблюдать в правом верхнем углу странички — переключение фоновой картинки. Попереключайте, станица совершенно по по-другому воспринимается.

Дело в том что это самое переключение бакгроунда реализовано на Mootools, а вкладки и слайдер в сайдбаре — jQuery. Значит наше задача – сделать так чтобы они работали вместе и не создавали никаких проблем.

Так вот. В JQuery есть замечательная функция — jQuery.noConflict();. Вот именно ее мы и будем курить.

Так как библиотека jQuery и практически все плагины к ней по умолчанию используют $ для вызова функций это создает неразрешимое противоречие если подключена не только jQuery, а например еще Mootools или Prototype. Единственным решением является переопределения вызова $-функции.

 <html>
 <head>
   <script src="mootools.js"></script>
   <script src="jquery.js"></script>
   <script>
     jQuery.noConflict();

     // Вызов через jQuery(...)
     jQuery(document).ready(function(){
       jQuery("div").hide();
     });

     // Для Mootools оставляем $(...)
     $('someid').hide();
   </script>
 </head>
 <body>
 ...
 </body>
 </html>

Существует еще один вариант, который позволяет немного сократить код:

 <html>
 <head>
   <script src="mootools.js"></script>
   <script src="jquery.js"></script>
   <script>
      var $j = jQuery.noConflict();
     // Вызов через $j(...)
     $j(document).ready(function(){
       $j("div").hide();
     });
     // Для Mootools оставляем $(...)
     $('someid').hide();
   </script>
 </head>
 <body>
 ...
 </body>
 </html>

Вы можете определить свои собственные альтернативные названия (например, jq, $j).

И, наконец, третий вариант. Самый простой и позволяющий не заморачиваться с переопределением:

 <html>
 <head>
   <script src="mootools.js"></script>
   <script src="jquery.js"></script>
   <script>
     jQuery.noConflict();
     jQuery(document).ready(function($){
       $("div").hide();
     });
     // Для Mootools $(...)
     $('someid').hide();
   </script>
 </head>
 <body></body>
 </html>

Вот собственно и все. Я использую первый вариант т.к. мне так удобней. Вы же можете воспользоваться любым из этих трех.

Удачи.


Обмен постовыми


2leep.com

25 комментариев к записи “jQuery и Mootools на одной странице”

  1. Sonic сказал: (permalink)
    12 февраля 2010 в 20:01

    Удобная вещь! Очень часто встречаю ее в буржуйских шаблонах для joomla.

  2. amac сказал: (permalink)
    14 февраля 2010 в 17:32

    Скачал jQuery и Mootools. Буду разбираться.

  3. fenris сказал: (permalink)
    28 февраля 2010 в 13:21

    Козюлькин, ну тут я думаю, от прямоты рук все зависит. У меня работает. У тебя видимо не будет.
    Как я уже говорил — переключение фона это mootools, а вкладки в сайдбаре — jquery.

    Кто не верит — добро пожаловать в исходники страницы

  4. Козюлькин сказал: (permalink)
    28 февраля 2010 в 18:05

    пиздеж не будет работать никогда

  5. Алексей сказал: (permalink)
    01 марта 2010 в 19:55

    Данные методы в мозиле работают, а в ie6 не работают. В чём может быть проблема?

  6. fenris сказал: (permalink)
    01 марта 2010 в 20:24

    В ie6 все работает нормально. Проверяйте код.

  7. Алексей сказал: (permalink)
    02 марта 2010 в 8:05

    Нет, в ie6 работает — но не нормально. Я причину вчера до 4 ночи искал и нашёл её в том, чего здесь не написано. А именно: 1 — библиотека mootools должна подключаться перед jquery, 2 — а сам скрипт mootools должен идти уже после скрипта jquery. Вроде мелочи и бред, но только после таких экспериментов у меня всё заработало в ie6.
    P.S. Кстати данный сайт также имеет глюк в ie6 — фон меняется нормально, а в навигационном меню ячейка выделения уезжает влево от надписи (прикрепил бы изображение глюка, если бы нашёл как это сделать)

  8. fenris сказал: (permalink)
    02 марта 2010 в 8:10

    Я знаю об этом баге, мне его просто ловить лень :)
    А вот про порядок подключения я как-то не подумал…

  9. Outsorser сказал: (permalink)
    03 апреля 2010 в 3:31

    Алексей прав — я тоже долго мучался в свое время: порядок подключения библиотек и скриптов имеет значение.
    У меня все работает при подключении в таком порядке:
    1. Стили CSS
    2. Библиотека Mootools
    3. Файл скриптов Mootools
    4. Библиотека Jquery
    5. Файл скриптов Jquery

  10. fenris сказал: (permalink)
    16 апреля 2010 в 10:40

    Однако, все работает. И этот блог тому живой пример :)

  11. A1an сказал: (permalink)
    16 апреля 2010 в 10:06

    мало верится что сразу так заработает

  12. Borey сказал: (permalink)
    21 декабря 2010 в 23:36

    Просто ОГРОМНОЕ спасибо. Очень помогло!!!:)

  13. Anatolii сказал: (permalink)
    04 марта 2011 в 2:41

    тут описан еще один метод без noConflict() за счет загрузки jQuery перед prototype http://docs.jquery.com/Using_jQuery_with_Other_Li…

    <script src="jquery.js"></script>
    <script src="prototype.js"></script>
    <script>
    // Use jQuery via jQuery(…)
    jQuery(document).ready(function(){
    jQuery("div").hide();
    });

    // Use Prototype with $(…), etc.
    $('someid').hide();
    </script>

  14. Артур сказал: (permalink)
    03 мая 2011 в 16:15

    Что-то не работает.От jquery мне необходимо jquery Lightbox, a от mootools — тени. Вот что у меня:
    <script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="js/jquery.lightbox-0.5.js"></script>
    <link rel="stylesheet" type="text/css" href="css/jquery.lightbox-0.5.css" media="screen" />
    <script type="text/javascript"> здесь скрипт jquery а именно lightbox </script>
    <script src="./shadows/mootools-1.2-core.js" type="text/javascript"></script>
    <script src="./shadows/moocanvas.js"></script>
    <script src="./shadows/mooCanvasShadow.js"></script>

    <script type="text/javascript"> здесь скрипт mootools а именно установка тени — Moocanvasshadow</script>
    Куда вставлять этот скрипт, который предотвращает конфликт?

  15. fenris сказал: (permalink)
    04 мая 2011 в 6:37

    для начла попробуйте обединить все спецэффекты :) т.е. код такой:
    <script src="./shadows/mootools-1.2-core.js" type="text/javascript"></script>
    <script src="./shadows/moocanvas.js"></script>
    <script src="./shadows/mooCanvasShadow.js"></script>
    <script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript" src="js/jquery.lightbox-0.5.js"></script>

    <script>
    jQuery.noConflict();
    jQuery(document).ready(function($){
    $("div").hide(); //здесь скрипт jquery а именно lightbox
    });
    // Для Mootools $(…)
    $('someid').hide(); //здесь скрипт mootools — Moocanvasshadow
    </script>

  16. Senser сказал: (permalink)
    28 мая 2011 в 18:01

    Я вот тоже не совсем понимаю как это реализуется, вина тому по видимому почти нулевые знания javasript-а. У меня задача следующая: реализовать одновременную работу сss-табов, которые вспомогательно реализуются через jquary библиотеку следующим образом:
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script&gt;
    <script type="text/javascript">
    $(function () {
    var tabContainers = $('div.tabs > div');
    tabContainers.hide().filter(':first').show();

    $('div.tabs ul.tabNavigation a').click(function () {
    tabContainers.hide();
    tabContainers.filter(this.hash).show();
    $('div.tabs ul.tabNavigation a').removeClass('selected');
    $(this).addClass('selected');
    return false;
    }).filter(':first').click();
    });
    </script>

    Т..е способ скрытия вкладок-табов. Все прекрасно работает, благо html-сss хорошо знаю, но вот понадобилось на этой странице подключить mootools библиотеку, которая отвечает за плавное отображение картинок с текстом и тут возник конфликт между двумя инструментами. В итоге галерея на mootools работает а табы нет.

    Пробовал третий вариант, но не могу понять что именно добавлять в $('someid').hide(); пробовал добавлять id ссылок, которые отвечают за работу табов, но в таком случае табы работают а mootools -галерея нет.

  17. fenris сказал: (permalink)
    28 мая 2011 в 20:13

    туда надо вставлять то, что должен делать mootools

  18. Senser сказал: (permalink)
    29 мая 2011 в 1:09

    Спасибо, уже разобрался как сделать.

  19. deus34 сказал: (permalink)
    29 июня 2011 в 18:55

    А как подружить с этим зверем fancybox?

  20. fenris сказал: (permalink)
    30 июня 2011 в 10:18

    кого с кем дружить будем? fancybox — на jquery, так что читаем инструкцию и радуемся

  21. Руслан сказал: (permalink)
    16 сентября 2011 в 19:10

    Давно искал в интернете способ совмещения работы Mootools и jQuery, но ничего полезного не нашел. Хорошо, что попался Ваш блог. Попробую сделать как написано в посте.

  22. Роман сказал: (permalink)
    18 октября 2011 в 6:33

    Огромнейшее человеческое спасибо

  23. Kira сказал: (permalink)
    07 ноября 2011 в 11:03

    Подскажите, пожалуйста, почему, когда я ввожу jQuery.noConflict() — у меня перестаёт работать jQuery . По идее, ведь так не должно быть. Когда убираю — опять работает. Вот мой кусочек кода:
    <script type="text/javascript">
    jQuery(document).ready(function(){
    jQuery('#slider').nivoSlider();
    });
    </script>
    В такой конструкции работает, а:
    <script type="text/javascript">
    jQuery.noConflict();
    jQuery(document).ready(function(){
    jQuery('#slider').nivoSlider();
    });
    </script>
    Уже не работает. Не пойму в чем дело.

  24. fenris сказал: (permalink)
    07 ноября 2011 в 11:46

    Внимательность — наше все :) В вашем случаи надо:
    <script type="text/javascript">
    jQuery.noConflict();
    jQuery(document).ready(function($){
    $('#slider').nivoSlider();
    });
    // дальше код mootools
    </script>

    Должно работать.

  25. Kira сказал: (permalink)
    07 ноября 2011 в 14:04

    С кодом Mootools тоже пробовала — не работает. И не понятно-то, почему без Query.noConflict() — скрипт jquerly работает, а вместе нет.
    Пришлось заворачиваться и делать все (как мне кажется) не совсем правильно:
    <script type="text/javascript" src="<?php echo $templateUrl; ?>/js/jquery.js"></script>
    <script type="text/javascript">jQuery.noConflict();</script>
    <script type="text/javascript" src="<?php echo $templateUrl; ?>/script.js"></script>
    <script type="text/javascript" src="<?php echo $templateUrl; ?>/js/jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="<?php echo $templateUrl; ?>/js/jquery.nivo.slider.js"></script>
    <script type="text/javascript" src="<?php echo $templateUrl; ?>/js/jquery.nivo.slider.pack.js"></script>
    <script type="text/javascript">
    jQuery(document).ready(function(){
    jQuery('#slider').nivoSlider();
    });
    </script>
    Т.е., 2 раза объявляю jquerly — но это как-то тупо. Но, работает. По-другому — никак.


Оставить комментарий

Comments are filtered through Akismet for spam detection. I delete nasty comments - your opinions are welcome but please keep them polite and constructive.

XHTML: Можно использовать эти теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Отображается рядом с Вашими комментариями

Неотображается на сайте.

Если у Вас есть сайт, укажите его адрес.