Jquery + Прототип конфликта - PullRequest
0 голосов
/ 19 марта 2010

Я недавно унаследовал сайт, который испортился разными способами. Я скорее парень из 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 + prototype не играют хорошо, и перестановка скриптов могла бы решить эту проблему, однако, поскольку я не трогал эти разделы, я не уверен, с чего мне вообще нужно начинать отладки. Предыдущий разработчик включил файл head.inc, который загружает прототип, scriptaculous, а затем многие страницы находятся в под-шаблоне, загружающем jquery для таких функций, как lightbox.

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

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

1 Ответ

1 голос
/ 19 марта 2010

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

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

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

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