Прототип и мирное сосуществование jQuery?
Я очень мало знаю о JavaScript, но, несмотря на это, я пытаюсь что-то собрать в своем блоге Wordpress. Он не работает, и я не знаю, как его разрешить, и эй, что для чего нужен StackOverflow, правильно?
Во-первых, сообщение об ошибке:
Error: element.dispatchEvent is not a function
Source File: http://.../wp-includes/js/prototype.js?ver=1.6
Line: 3936
Это происходит при загрузке страницы. Мой обработчик загрузки страницы зарегистрирован таким образом:
Event.observe(window, 'load', show_dates_as_local_time);
Ошибка исчезнет, если я отключу некоторые другие плагины, и это (плюс googling) привело меня к выводу, что это конфликт между прототипом и jQuery (который используется некоторыми другими плагинами).
Во-вторых, я следую рекомендованной WordPress практике использования wp_enqeue_script
, чтобы добавить зависимость от моего JavaScript к библиотеке Prototype, так как следующим образом:
add_action( 'wp_print_scripts', 'depo_theme_add_javascript' );
function depo_theme_add_javascript() {
wp_enqueue_script('friendly_dates', 'javascript/friendly_dates.js', array('prototype'));
}
Теперь я также знаю, что существуют некоторые потенциальные конфликты между jQuery и Prototype, которые разрешаются с помощью метода jQuery noConflicts
. Я пробовал называть это из разных мест, но ничего хорошего. Я не думаю, что это проблема, потому что a) функция noConflict
относится только к переменной $
, которая, похоже, не является проблемой здесь, и b) я ожидал бы, что wordpress разобрал бы ее для меня потому что он может...
Наконец, используя отладчик Venkman, я определил, что element
, на который ссылается сообщение об ошибке, действительно является HTMLDocument
, но также отсутствует dispatchEvent
. Не знаете, как это может произойти, учитывая стандартный метод DOM?
Ответы
Ответ 1
Спасибо за все предложения. В конце концов, я думаю, что объяснение Кента было самым близким, что в основном сводилось к тому, что "Прототип сломан". (Извините, если я неправильно суммирую вас:)
Что касается опции jQuery.noConflict
- я уже упоминал об этом в вопросе. Это имеет значение, когда вы запускаете этот метод, и у меня очень мало контроля над этим. Как я уже сказал, я попытался запустить его в нескольких разных местах (в частности, в заголовке страницы, а также из моего файла script). Так что, как нам всем хотелось бы, "просто используйте noConflict
" - это не ответ на этот вопрос, по крайней мере, без дополнительной информации.
Кроме того, jQuery.noConflict
похоже на переменную $
, а код вокруг точки ошибки вообще не имеет отношения к этой переменной. Конечно, они могут быть косвенными, я не отслеживал это.
Итак, в основном я закончил переписывание script с использованием jQuery вместо Prototype, у которого действительно были свои проблемы. В любом случае, я опубликовал всю статью war story на моем блоге, если вы заинтересованы.
Ответ 2
Существует довольно неприятный трюк, который многие библиотеки делают, к чему я привык, и похоже, что прототип является одним из них.
Mootools делает это, если я прав, и это связано с перегрузкой многих прототипов в базовых классах, обезьяна их исправляет.
И аналогичным образом я также столкнулся с странным поведением, когда присутствовали mootools и jQuery, обычно jQuery умирает, потому что он вызывает какой-то объектный метод, который каким-то образом перегружен/обезьяна, исправленная Mootools.
Кроме того, таинственным образом, выбирая mootools из списка использования script, привело к тому, что все работает намного быстрее, и я пришел к выводу, что это связано с меньшим загрязнением объектов.
Теперь я мог ошибаться, но из своего опыта я пришел к выводу, что такие библиотеки просто не любят сосуществовать друг с другом, и видя, как код mootools казался мне деградировать скорость, с которой делались обычные вещи, я втянул и портировал весь код на основе mootools на jQuery (долговременная сделка, которую я заверяю вас), а результат был быстрым кодом и не имел странных ошибок, которые были необъяснимы.
Я рекомендую вам рассмотреть миграцию как минимум Один ваших параметров.
Еще одна вещь, когда вы пишете:
Я обычно использую этот синтаксис со всем кодом, управляемым jQuery, для немного безопасного инкапсуляции в случае, если кто-то каким-то образом сломает "$".
Код выполнения
Это ждет document.ready перед выполнением:
jQuery(function($){
code_with_$_here;
});
Плагины jQuery
(function($){
code_with_$_here;
})(jQuery);
Использование этих способов облегчит людям, использующим любой jQuery, с которым вы собираетесь писать, чтобы иметь возможность использовать его без значительной проблемы с конфликтом.
Это будет в основном оставить их, чтобы убедиться, что их код не делает ничего действительно волшебного.
Ответ 3
Стоит прочитать эту статью на сайте JQuery о Использование JQuery с другими библиотеками. Он имеет дело не только с параметром noConflict.
Ответ 4
Я думаю, вам следует искать ну, потому что все плагины jQuery имеют прототипную версию, а все прототипы-плагины имеют версию jQuery.
Если вы действительно не находите то, что вы смотрите, и вы не можете использовать только одну библиотеку, посмотрите здесь в
jQuery.noConflict();
Но опять же, я думаю, что нет смысла загружать более 15-20 кб для каждой библиотеки:)