Конфликт jQuery и Prototype
Я использую плагин jQuery AutoComplete на странице html, где у меня также есть меню аккордеона, в котором используется прототип.
Они работают отлично по отдельности, но когда я пытался реализовать оба компонента на одной странице, я получаю сообщение об ошибке, которое я не смог понять.
исключение uncaught: [Исключение... "Возвращенный код отказа компонента: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMViewCSS.getComputedStyle]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" местоположение: "JS frame:: file:///C:/Documents and Настройки/Администратор/Рабочий стол/веб-сайт/js/jquery-1.2.6.pack.js:: anonymous:: строка 11" data: no]
Я обнаружил, что файл, конфликтующий с jQuery, является "effects.js", который используется в меню аккордеона. Я попытался заменить этот файл более новой версией, но новичок, похоже, нарушил поведение аккордеона.
Моя догадка заключается в том, что файл "effects.js", используемый в аккордеоне, был изменен для получения демонстрационного выхода аккордеона. Я также попытался использовать переопределяющие методы jQuery, чтобы избежать конфликтов с другими библиотеками, и это не сработало.
Я получил аккордеонную демонстрацию от stickmanlabs.com.
И автозаполнение jQuery можно получить из сайта jQuery.
Кто-нибудь еще испытал эту проблему?
Ответы
Ответ 1
Существует два возможных решения: возник конфликт с более старой версией Scriptaculous и jQuery (Scriptaculous пытался неправильно протолкнуть собственный прототип Array) - сначала попробуйте обновить свою копию Scriptaculous.
Если это не сработает, вам нужно будет использовать noConflict()
(как указано выше). Однако есть улов. Поскольку вы включаете плагин, вам нужно будет делать включения в определенном порядке, например:
<script src="jquery.js"></script>
<script src="jquery.autocomplete.js"></script>
<script>
jQuery.noConflict();
jQuery(document).ready(function($){
$("#example").autocomplete(options);
});
</script>
<script src="prototype.js"></script>
<script src="effects.js"></script>
<script src="accordion.js"></script>
Надеюсь, это поможет прояснить ситуацию.
Ответ 2
jQuery позволяет переименовать функцию jQuery из $
в другое, чтобы избежать конфликтов пространства имен с другими библиотеками.
Вы можете сделать что-то вроде этого
var J = jQuery.noConflict();
Подробности здесь: michaelshadle.com - jQuery no-conflict mode: еще одна причина, по которой это лучше всего
Ответ 3
Я действительно не вижу причины использовать обе библиотеки одновременно в этом случае.
Вы можете использовать Prototype (ну, Scriptaculous) на самом деле) Ajax.Autocompleter и ditch jQuery, или вы можете использовать jQuery Accordion и избавиться от прототипа.
Использование обеих библиотек сразу не очень хорошая идея, потому что:
- Они могут вызывать конфликты.
- Включая их обоих, вы заставляете своих пользователей загружать их обоих. Это не удобный подход.