мирное сосуществование прототипа и jQuery?
-
03-07-2019 - |
Вопрос
Я очень мало знаю о 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);
Ошибка исчезнет, если я отключу некоторые другие плагины, и это (плюс поиск в Google) привело меня к выводу, что это конфликт между прототипом и jQuery (который используется некоторыми другими плагинами).
Во-вторых, я следую рекомендуемой WordPress практике использования wp_enqeue_script
чтобы добавить зависимость от моего JavaScript к библиотеке прототипов, следующим образом:
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
метод.Я пробовал звонить из разных мест, но безрезультатно.Я не думать в этом проблема, потому что а) noConflict
функция относится исключительно к $
переменная, в которой, похоже, нет проблемы, и б) я бы ожидать WordPress поможет мне разобраться с этим, потому что он может...
Наконец, с помощью отладчика Venkman я определил, что element
ссылка на которую содержится в сообщении об ошибке, действительно является HTMLDocument
но также не хватает dispatchEvent
.Не знаете, как такое могло произойти, учитывая, что это стандартный метод DOM?
Решение 4
Спасибо всем за предложения.В конце концов, я думаю, что объяснение Кента было наиболее близким и сводилось к следующему: «Прототип сломан».(Извините, если я неправильно вас резюмирую :)
Для jQuery.noConflict
вариант - я уже упоминал об этом в вопросе.Это имеет значение когда вы запускаете этот метод, и я почти не могу это контролировать.Как я уже сказал, я пробовал запустить его в нескольких разных местах (в частности, в заголовке страницы, а также из моего файла сценария), но безрезультатно.Итак, как бы нам всем этого ни хотелось, «просто используйте noConflict
" является нет ответ на этот вопрос, по крайней мере, не без дополнительной информации.
Кроме, jQuery.noConflict
кажется быть о $
переменная, а код вокруг точки ошибки вообще не имеет отношения к этой переменной.Конечно, они могут быть связаны косвенно, я этого не отслеживал.
В итоге я переписал сценарий, используя jQuery вместо Prototype, что на самом деле имело свои проблемы.В любом случае я опубликовал всю история войны в моем блоге, если вам будет интересно.
Другие советы
Есть неприятный трюк, который используют многие библиотеки, и который мне особенно понравился, и похоже, что прототип — один из них.
Mootools делает это, если я прав, и включает в себя перегрузку многих прототипов базовых классов и их исправление.
Точно так же я столкнулся со странным поведением, когда присутствовали mootools и jQuery, обычно jQuery умирал, потому что вызывал какой-то объектный метод, который был каким-то образом перегружен или исправлен с помощью Mootools.
Кроме того, загадочным образом удаление mootools из списка использования скриптов привело к все бежал намного быстрее, что, как я пришел к выводу, произошло из-за меньшего загрязнения объектов.
Я могу ошибаться, но на основе своего опыта я пришел к выводу, что такие библиотеки просто не любят сосуществовать друг с другом, и, видя, как код mootools, по моему мнению, снижает скорость, с которой выполняются обычные вещи, я поддался и весь код, основанный на mootools, был портирован на jQuery (уверяю вас, это отнимает много времени), и в результате получился код, который был быстрый и не было странных ошибок, которые были бы необъяснимы.
Я рекомендую вам рассматривать миграцию как минимум Один из ваших вариантов.
Еще одна вещь, когда пишу:
Я склонен использовать этот синтаксис со всем своим кодом, управляемым jQuery, для некоторой безопасной инкапсуляции на случай, если кто-то каким-либо образом сломает '$'.
Код времени выполнения Перед выполнением ожидается document.ready:
jQuery(function($){
code_with_$_here;
});
Плагины jQuery
(function($){
code_with_$_here;
})(jQuery);
Используя их, людям будет легче с использованием любой написанный вами jQuery, чтобы иметь возможность использовать его без особых проблем с конфликтами.
По сути, это позволит им убедиться, что их код не делает ничего действительно волшебного.
Стоит прочитать эту статью на сайте JQuery о Использование JQuery с другими библиотеками.Он касается не только опции noConflict.
Я думаю, вам следует хорошо поискать, потому что все плагины jQuery имеют версию прототипа, а все плагины-прототипы имеют версию jQuery.Если вы действительно не находите то, что ищете, и не можете использовать только одну библиотеку, посмотрите здесь в
jQuery.noConflict();
Но опять же, думаю, нет смысла загружать каждую библиотеку более 15-20кб :)