jQuery UI Datepicker не работает
Я хочу добавить datepicker на пользовательскую страницу, но он не работает. Версия WP 3.2.1. Вот строки инициализации, которые я использовал в коде WP:
wp_enqueue_script('jquery');
wp_enqueue_script('jquery-ui-core');
wp_enqueue_script('jquery-ui-datepicker', get_bloginfo('template_url') . '/js/jquery-ui-datepicker.min.js', array('jquery','jquery-ui-core'));
wp_enqueue_style('jquery.ui.theme', get_bloginfo('template_url') . '/js/smoothness/jquery-ui-1.8.16.custom.css');
Эти подключения генерируют следующий код:
<script type='text/javascript' src='http://www.xxxxxxxx.it/wp-includes/js/jquery/jquery.js?ver=1.6.1'></script>
<script type='text/javascript' src='http://www.xxxxxxxx.it/wp-includes/js/jquery/ui.core.js?ver=1.8.12'></script>
<script type='text/javascript' src='http://www.xxxxxxxx.it/wp-content/themes/greyzed/js/jquery-ui-datepicker.min.js?ver=3.2.1'></script>
<link rel='stylesheet' id='jquery.ui.theme-css' href='http://www.xxxxxxxx.it/wp-content/themes/greyzed/js/smoothness/jquery-ui-1.8.16.custom.css?ver=3.2.1' type='text/css' media='all' />
В теле страницы я использую этот код:
<script type="text/javascript">
jQuery('#datepicker').datepicker({
dateFormat : 'yy-mm-dd'
});
</script>
<div class="row"><label for="day">Дата</label><input type="text" id="datepicker" name="day" class="text" /></div>
Datepicker не работает. Я не знаю, как отладить эту проблему. Он не делает ничего, как будто jQuery вообще отсутствует.
ОБНОВЛЕНИЕ:
С вашей помощью мне удалось отладить код. Я разместил скрипт после div и изменил его на:
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery('#datepicker').datepicker({
dateFormat : 'yy-mm-dd'
});
});
</script>
Этот код выдает ошибку при вызове метода datepicker, ошибка гласит:
Uncaught TypeError: Object [object Object] has no method 'datepicker'
Если я ввожу jQuery('#datepicker') в консоли JavaScript, я получаю:
[<input type="text" id="datepicker" name="day" class="text">]
Я не получаю никаких других ошибок, кроме этой, все ссылки на jQuery, похоже, работают нормально.
ОБНОВЛЕНИЕ 2:
Наконец-то заработало! Мне пришлось использовать 'wp_print_scripts' вместо 'init', и пришлось переместить некоторый код инициализации другого плагина, который конфликтовал. Единственная оставшаяся проблема - это темы... если я использую базовую тему из googlecode, все работает. Если я использую другие темы (встроенные в wp или подключенные через wp_enqueque_style), тема не загружается... если проверить сгенерированный html, там нет строки, которая должна загружать тему jQuery.

Я часто допускаю ошибки при наборе. Поэтому я бы начал отладку с копирования и вставки ссылок на JS-скрипты в браузере, чтобы убедиться, что они загружаются.
Затем в Chrome перейдите в меню Гаечный ключ -> Инструменты -> Консоль JavaScript. Здесь вы сможете напрямую вводить/выполнять JavaScript-код. Я бы начал с ввода jQuery
в консоль, чтобы убедиться, что jQuery действительно загружен. Затем попробуйте выполнить jQuery('#datepicker')
- если возвращаются пустые скобки []
, значит, ваш селектор не срабатывает. Если сработает, попробуйте открыть datepicker - скорее всего, вы увидите ошибку в JS-консоли.
Как уже отмечали другие, я думаю, проблема в том, что скрипт выполняется до фактической отрисовки элемента. Я бы предложил сделать следующее:
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery('#datepicker').datepicker({
dateFormat : 'yy-mm-dd'
});
});
</script>
Это заставит скрипт выполняться после полной загрузки страницы.
== ПРИМЕР ==
add_action( 'init', 'wp29r01_date_picker' );
function wp29r01_date_picker() {
wp_enqueue_script( 'jquery' );
wp_enqueue_script( 'jquery-ui-core' );
wp_enqueue_script( 'jquery-datepicker', 'http://jquery-ui.googlecode.com/svn/trunk/ui/jquery.ui.datepicker.js', array('jquery', 'jquery-ui-core' ) );
}
add_action( 'wp_footer', 'wp29r01_print_scripts');
function wp29r01_print_scripts() {
?>
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery('#datepicker').datepicker();
})
</script>
<?php
}

Я последовал вашим советам и сделал несколько шагов: теперь у меня есть ошибка, которая останавливает работу моего кода. Она говорит: Uncaught TypeError: Object [object Object] has no method 'datepicker' на строке jQuery('#datepicker').datepicker

Если это так, значит скрипт datepicker не подключен правильно или это неправильный скрипт. Я обновлю свой пост с рабочим кодом.

Это сводит меня с ума... у меня все та же ошибка! Я изменил код согласно вашим рекомендациям, когда я пишу jQuery('#datepicker'), я получаю div как и раньше, но все равно получаю ту же самую ошибку! Я тестировал с пустым HTML-файлом, помещая туда HTML-вывод wp_enqueues, и с этой тестовой страницей все работает, так что есть что-то внутри WordPress, что ломает datepicker(), но я понятия не имею, как это исправить...

Затем я бы порекомендовал установить вашу тему на twentyeleven и отключить все остальные плагины. Включайте их по одному, пока не найдете тот, из-за которого перестает работать datepicker.

Наконец-то у меня получилось! Мне пришлось использовать 'wp_print_scripts' вместо 'init', а также переставить код инициализации другого плагина, который вызывал конфликт. Единственная оставшаяся проблема - это темы... если я использую базовую тему из googlecode, все работает. Если я использую другие темы (встроенные или подключенные через wp_enqueque_style), тема не загружается.

Я поместил скрипт после '<div>', но ничего не изменилось. Я создал тестовую страницу, простой html, только с html-кодом, сгенерированным из wp страницы, но это всё равно не работает. Как я могу отладить это?

Подключайте ваш пользовательский скрипт также через wp_enqueue_script() и ссылайтесь на другие библиотеки, и у вас не будет проблем с временной линией; ваш пользовательский скрипт, запрашивающий библиотеки datepicker, загрузится после того, как все остальные скрипты будут готовы; это работает корректно и в будущих релизах WordPress.

@bueltge это решило бы проблему только если Terix вызывал бы его так: wp_enqueue_script( 'do-date', 'http://www.xxxxxxxx.it/wp-content/themes/greyzed/js/do_date.js' , array('jquery-ui-datepicker'), 1, true )
- последний параметр 'true' важен, чтобы скрипт помещался в подвал, то есть после создания div
. Я всё же предпочитаю использовать document.ready(), независимо от этого.
