Конфликт Jquery + прототип

Недавно я унаследовал сайт, который испорчен во всех отношениях. Я больше сторонник php, и изначально js работал нормально. Я не вносил изменений в javascript или какие-либо включаемые файлы, но после внесения нескольких изменений в содержимое я получаю сообщения об ошибках от firebug.

a.dispatchEvent is not a function
emptyFunction()protot...ects.js (line 2)
emptyFunction()protot...ects.js (line 2)
fireContentLoadedEvent()protot...ects.js (line 2)

[Break on this error] var Prototype={Version:'1.6.0.2',Brows...pe,Enumerable);Element.addMethods();
protot...ects.js (line 2)
this.m_eTarget.setStyle is not a function

[Break on this error] this.m_eTarget.setStyle( { position: 'relative', overflow:'hidden'} );
protot...ects.js (line 43)
uncaught exception: [Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE)" nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)" location: "JS frame :: js/prototype_effects.js :: anonymous :: line 2" data: no]

Погуглив, я нашел несколько сообщений о том, что иногда jquery + прототип работает плохо, и перестановка скриптов может решить эту проблему, однако, поскольку я не касался этих разделов, я не уверен, где мне вообще нужно начинать отладку. Предыдущий разработчик включил файл head.inc, который загружает прототип, scriptaculous, а затем многие страницы находятся в подшаблоне, загружающем jquery для таких функций, как лайтбокс.

Сайт временно размещен по адресу http://dawn.mikeyhill.com.

Любая помощь приветствуется.


person mikeyhill    schedule 18.03.2010    source источник


Ответы (1)


Библиотека прототипов навязчива: она добавляет всевозможные методы к основному объекту Javascript. Когда объекты затем повторяются через for(var k in o), итерация будет включать эти новые методы (поскольку Javascript пока не поддерживает неитерируемые атрибуты). Вот почему в Prototype итерация всегда выполняется с помощью таких средств, как each(), которые не подвержены этой проблеме.

Проблема в другом коде, который все еще использует старые добрые циклы for-var-in. Этот код сломается. В 99% случаев, когда Prototype не работает с какой-то другой библиотекой, проблема связана с итерацией.

Вы говорите, что не трогали код, и я вам верю, поэтому остается три варианта:

  • Проблема была и раньше, но вы ее не замечали
  • Проблемный код выполняется только в особых случаях (из-за какого-то специального ввода). Предыдущий программист никогда не пробовал этот ввод.
  • Вы находитесь в 1%, где проблема связана с каким-то другим фактором :)
person Itay Maman    schedule 18.03.2010