Прототип и мирное сосуществование 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, с которым вы собираетесь писать, чтобы иметь возможность использовать его без значительной проблемы с конфликтом.

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

Ответ 4

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

jQuery.noConflict();

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