Странный прототип Chrome / конфликт jQuery
У нас есть приложение с унаследованным кодом, которое опирается на прототип, но мы обнаружили, что оно слишком «тяжелое» для большинства мест, где мы хотим его использовать, и обнаружили, что jQuery лучше подходит для нашей работы. Итак, мы переходим на jQuery для новой функциональности.
Тем временем у нас есть несколько страниц, которые должны загрузить обе библиотеки:
<script language="javascript" type="text/javascript"
src="prototype-1.5.1.2.js"></script>
<script language="javascript" type="text/javascript"
src="jquery-1.3.2.js"></script>
<script language="javascript" type="text/javascript">
$j = jQuery.noConflict();
</script>
(обратите внимание на более старую версию прототипа, мы обнаружили проблемы при обновлении, которые мы не хотим исправлять, когда все равно прекращаем работу)
Это работает в IE6, IE7, IE8-as-7 и FX3, но загрузить его в Chrome и все jQuery не удается.
Загрузка консоли разработчика javascript отображает следующие ошибки:
Uncaught Error: NOT_SUPPORTED_ERR: DOM Exception 9 http://.../prototype-1.5.1.2.js (line 1272)
Uncaught TypeError: Object #<an Object> has no method 'ready' http://.../lib.js (line 161)
Uncaught TypeError: Object #<an Object> has no method 'slideUp' http://.../page.aspx (line 173)
... and so on - all the failures are missing jQuery methods
Так что это похоже на конфликт в прототипе, который приводит к сбою создания объекта jQuery.
Конкретной проблемой с прототипом является Prototype.BrowserFeatures.XPath, который имеет значение true, когда это не должно быть, так как XPath document.evaluate не поддерживается.
Хорошо теперьперезагрузите страницу с открытой консолью javascript - все работает! WTF? Закройте консоль, перезагрузите компьютер, и снова произойдет сбой.
Ошибка возникает только тогда, когда загрузка страницы происходит без открытой консоли javascript. Почему это может иметь значение? Это очень похоже на ошибку в Chrome.
Кто-нибудь может объяснить, что происходит? Почему ошибка в прототипе может вызвать сбой инициализации jQuery? Почему загрузка страницы с открытой консолью заставляет ее работать?
Кто-нибудь знает хороший обходной путь? (кроме обновления до prototype-1.6.0.3.js, которое исправляет эту проблему, но устраняет загрузку устаревшего кода в другом месте)