Вопрос

Я очень мало знаю о 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кб :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top