прототип и JQuery мирное сосуществование? - PullRequest
11 голосов
/ 06 января 2009

Я очень мало знаю о 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) привело меня к выводу, что это был конфликт между prototype и 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. Я пытался назвать это из разных мест, но безрезультатно. Я не думаю в этом проблема, потому что а) функция noConflict относится исключительно к переменной $, которая здесь не является проблемой, и б) я бы ожидайте WordPress, чтобы разобраться в этом для меня, потому что это может ...

Наконец, используя отладчик Venkman, я определил, что element, указанное в сообщении об ошибке, действительно HTMLDocument, но также не имеет dispatchEvent. Не уверен, как это могло произойти, учитывая, что это стандартный метод DOM?

Ответы [ 4 ]

11 голосов
/ 06 января 2009

У многих библиотек есть неприятный трюк, который мне очень понравился, и, похоже, один из них - прототип.

Mootools делает это, если я прав, и это предполагает перегрузку многих прототипов базовых классов, их исправление обезьянами.

И аналогично, я также столкнулся со странным поведением, когда присутствовали mootools и jQuery, обычно умирает jQuery, потому что он вызывал какой-то объектный метод, который каким-то образом был перегружен / пропатчен Mootools.

Также, как ни странно, удаление mootools из списка использования скриптов привело к тому, что все работало намного быстрее, что я пришел к выводу из-за меньшего загрязнения объекта.

Теперь я могу ошибаться, но из своего опыта я пришел к выводу, что такие библиотеки просто не любят сосуществовать друг с другом, и, видя, как мне кажется, что код mootools ухудшает скорость выполнения обычных задач, я всасывал и переносил весь код, основанный на mootools, в jQuery (я уверяю вас, что это была трудоемкая сделка), и в результате код был fast и не было странных ошибок, которые были необъяснимое.

Я рекомендую вам рассмотреть миграцию как минимум Один из ваших вариантов.

Еще одна вещь, при написании:

Я склонен использовать этот синтаксис со всем моим кодом, управляемым jQuery, для некоторой безопасной инкапсуляции в случае, если кто-то каким-либо образом нарушит '$'.

Код выполнения Это ожидает документа. Уже перед выполнением:

 jQuery(function($){ 
      code_with_$_here; 
 }); 

jQuery Plugins

(function($){ 
    code_with_$_here; 
})(jQuery); 

С их помощью людям , использующим любой jQuery, который вы напишете, будет легче использовать его без особых проблем с конфликтом.

Это в основном оставляет их, чтобы удостовериться, что их код не делает ничего действительно волшебного.

6 голосов
/ 06 января 2009

Стоит прочитать эту статью на сайте JQuery о Использование JQuery с другими библиотеками . Он имеет дело не только с опцией noConflict.

5 голосов
/ 06 января 2009

Я думаю, что вы должны хорошо искать, потому что все плагины jQuery имеют версию прототипа, а все плагины прототипа имеют версию jQuery. Если вы действительно не можете найти то, что смотрите, и не можете использовать только одну библиотеку, посмотрите здесь на

jQuery.noConflict();

Но опять же, я думаю, что нет смысла загружать более 15-20 КБ для каждой библиотеки:)

0 голосов
/ 12 января 2009

Спасибо за предложения всем. В конце я думаю, что объяснение Кента было самым близким, которое в основном составляло «Прототип сломан». (Извините, если я неправильно вас обобщаю:)

Что касается опции jQuery.noConflict - я уже упоминал об этом в вопросе. имеет значение, когда вы используете этот метод, и я очень мало контролирую это. Как я уже сказал, я попытался запустить его в нескольких разных местах (в частности, в заголовке страницы, а также из моего файла сценария), но безрезультатно. Итак, как бы нам ни хотелось, «просто используйте noConflict» - это , а не ответ на этот вопрос, по крайней мере, без дополнительной информации.

Кроме того, jQuery.noConflict , кажется, относится к переменной $, и код вокруг точки ошибки вообще не имеет отношения к этой переменной. Конечно, они могут быть связаны косвенно, я не отслеживал это.

Так что в основном я переписал скрипт, используя jQuery вместо Prototype, у которого действительно были свои проблемы. Во всяком случае, я опубликовал всю историю войны в своем блоге , если вам интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...