JQuery & Прототип Конфликт - PullRequest
27 голосов
/ 25 сентября 2008

Я использую плагин jQuery AutoComplete на html-странице, где у меня также есть меню для аккордеона, в котором используется прототип.

Они оба прекрасно работают по отдельности, но когда я пытался реализовать оба компонента на одной странице, я получаю сообщение об ошибке, которое мне не удалось понять.

необработанное исключение: [Exception ... "Компонент возвратил код ошибки: 0x80004005 (NS_ERROR_FAILURE) [nsIDOMViewCSS.getComputedStyle] " nsresult: "0x80004005 (NS_ERROR_FAILURE)" расположение: "кадр JS :: file: /// C: / Documents and Настройки / Администратор / Рабочий стол / сайт / js / jquery-1.2.6.pack.js :: аноним :: строка 11 "данные: нет]

Я обнаружил, что файл, конфликтующий с jQuery, - это «effect.js», который используется в меню аккордеона. Я попытался заменить этот файл более новой версией, но более новая, кажется, нарушает поведение аккордеона.

Я предполагаю, что файл 'effect.js', используемый в аккордеоне, был изменен для получения демонстрационного результата аккордеона. Я также попытался использовать переопределяющие методы, необходимые jQuery, чтобы избежать конфликта с другими библиотеками, и это не сработало.

Я получил демонстрацию аккордеона от stickmanlabs.com .

А автозаполнение jQuery можно получить с сайта jQuery .

Кто-нибудь еще сталкивался с этой проблемой?

Ответы [ 3 ]

117 голосов
/ 26 сентября 2008

Есть два возможных решения: возник конфликт с более старой версией 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>

Надеюсь, это поможет прояснить ситуацию.

10 голосов
/ 25 сентября 2008

jQuery позволяет переименовать функцию jQuery из $ во что-то другое, чтобы избежать конфликтов пространства имен с другими библиотеками.

Вы можете сделать что-то вроде этого

var J = jQuery.noConflict();

Подробности здесь: michaelshadle.com - бесконфликтный режим jQuery: еще одна причина, почему он лучший

8 голосов
/ 27 сентября 2008

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

Вы можете использовать Prototype (ну, на самом деле, Scriptaculous) Ajax.Autocompleter и ditch jQuery, или вы можете использовать jQuery's Accordion и избавиться от Prototype.

Использование обеих библиотек не очень хорошая идея, потому что:

  1. Они могут вызвать конфликты.
  2. Включая их обоих, вы заставляете своих пользователей загружать их обоих. Что не является дружественным подходом.
...