jQuery UI Datepicker no funciona

30 oct 2011, 23:09:17
Vistas: 64.5K
Votos: 4

Quiero agregar un datepicker en una página personalizada pero no funciona. La versión de WP es 3.2.1. Estas son las cadenas de inicialización que usé en el código de 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');

Estos enqueues generan este código:

<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' />

En el body de la página, uso este código:

<script type="text/javascript">
    jQuery('#datepicker').datepicker({
        dateFormat : 'yy-mm-dd'
    });
</script>
<div class="row"><label for="day">Fecha</label><input type="text" id="datepicker" name="day" class="text" /></div>

El datepicker no funciona. No sé cómo depurar este problema. No hace nada, como si jQuery ni siquiera estuviera presente.

ACTUALIZACIÓN:

Con su ayuda logré depurar el código. Coloqué el script después del div y lo cambié a:

<script type="text/javascript">
jQuery(document).ready(function() {
    jQuery('#datepicker').datepicker({
        dateFormat : 'yy-mm-dd'
    });
});
</script>

Este código me da un error al llamar al método datepicker, el error indica:

Uncaught TypeError: Object [object Object] has no method 'datepicker'

Si escribo jQuery('#datepicker') en la consola de javascript, obtengo esto:

[<input type=​"text" id=​"datepicker" name=​"day" class=​"text">​]

No obtengo otros errores excepto ese, todas las referencias a jQuery parecen funcionar bien.

ACTUALIZACIÓN 2:

¡Finalmente lo hice funcionar! Tuve que colocar 'wp_print_scripts' en lugar de 'init', y tuve que reposicionar algo de código de inicialización de otro plugin que estaba en conflicto. El único problema restante son los temas... si uso el tema básico dentro de googlecode, funciona. Si uso otros temas (integrados en wp o enlazados con wp_enqueque_style) el tema no se cargará... si reviso el HTML generado, no hay señal de la línea que debería cargar el tema de jQuery.

6
Comentarios

Esto parece correcto a nivel de WP (cargas adecuadas, salida, llamada jQuery no abreviada) y por lo tanto probablemente no sea específico de WordPress. ¿Algún detalle más relacionado con WP? De lo contrario, sería mejor preguntar en StackOverflow.

Rarst Rarst
30 oct 2011 23:22:10

Si tu "página personalizada" es una página de administración, entonces necesitas cargarla de manera un poco diferente. Consulta: http://codex.wordpress.org/Plugin_API/Action_Reference/admin_enqueue_scripts

Tom Auger Tom Auger
31 oct 2011 00:24:34

¿Qué otros detalles de WP necesitas? Pregunta y responderé. La página no es específica del Admin. Es solo una página de WP, creada usando una plantilla de página personalizada que contiene el código que estoy usando.

Terix Terix
31 oct 2011 09:16:57

Además, solo porque el enqueue haya colocado las etiquetas SCRIPT o STYLE necesarias en tu head, no significa necesariamente que se hayan cargado realmente (las URLs podrían estar mal - ¡me ha pasado docenas de veces!). Nuevamente, usa Firebug o Google Chrome y revisa tus estadísticas de red - si ves errores rojos 404, significa que no se encontró el script o archivo CSS en la dirección especificada.

Tom Auger Tom Auger
31 oct 2011 14:58:37

todos los scripts y estilos se encuentran, solo obtengo el error más abajo, en la llamada real al método datepicker()

Terix Terix
31 oct 2011 22:57:15

para tu información, init no es el lugar correcto para hacer enqueues, deberían ir en la acción wp_enqueue_scripts (es para enqueues). Tampoco necesitas las primeras dos líneas de enqueue porque las estás estableciendo como dependencias para el datepicker.

t31os t31os
1 nov 2011 00:31:52
Mostrar los 1 comentarios restantes
Todas las respuestas a la pregunta 4
5

A menudo cometo errores al escribir. Por eso, comenzaría depurando copiando y pegando los enlaces a los scripts JS en tu navegador para asegurarme de que se cargan.

Luego, en Chrome, ve al Menú de Configuración -> Herramientas -> Consola JavaScript. Aquí podrás escribir/ejecutar tu JavaScript directamente. Comenzaría escribiendo jQuery en la consola para asegurarme de que jQuery está realmente cargado. Luego intenta hacer jQuery('#datepicker'); si devuelve corchetes vacíos [], entonces tu selector está fallando. Si funciona, intenta abrir el datepicker - probablemente verás un error en la consola JS.

Como otros han sugerido, creo que el problema es que el script se ejecuta antes de que el elemento se renderice realmente. Sugeriría hacer lo siguiente:

<script type="text/javascript">
jQuery(document).ready(function() {
    jQuery('#datepicker').datepicker({
        dateFormat : 'yy-mm-dd'
    });
});
</script>

Esto forzará al script a ejecutarse después de que toda la página se haya cargado.

== EJEMPLO ==

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
}
31 oct 2011 17:11:38
Comentarios

Seguí tus consejos e hice algunos pasos: ahora tengo el error que está impidiendo que mi código funcione. Dice: Uncaught TypeError: Object [object Object] has no method 'datepicker' en la línea jQuery('#datepicker').datepicker

Terix Terix
31 oct 2011 22:33:05

Si ese es el caso, entonces el script datepicker no se está incluyendo correctamente, o es el script incorrecto. Actualizaré mi publicación con código que funcione.

v0idless v0idless
31 oct 2011 23:14:13

Esto me está volviendo loco... ¡sigo teniendo el mismo error! Cambié el código según tu sugerencia, cuando escribo jQuery('#datepicker') obtengo el div como antes, pero sigo recibiendo exactamente el mismo error. Probé con un archivo HTML vacío, colocando el HTML de salida de los wp_enqueues, y con esta página de prueba funciona, así que hay algo dentro de WordPress que está interfiriendo con datepicker(), pero no tengo idea de cómo solucionar esto...

Terix Terix
1 nov 2011 09:34:20

Entonces lo que haría es configurar tu tema a twentyeleven, y desactivar todos los demás plugins. Actívalos uno por uno hasta encontrar cuál está causando que el datepicker falle.

v0idless v0idless
1 nov 2011 14:32:08

¡Finalmente logré que funcione! Tuve que usar 'wp_print_scripts' en lugar de 'init', y además reubicar cierto código de inicialización de otro plugin que estaba causando conflicto. El único problema restante son los temas... si uso el tema básico de googlecode, funciona. Si uso otros temas (incrustados o enlazados con wp_enqueque_style) el tema no se carga.

Terix Terix
2 nov 2011 09:20:47
0

Para aquellos que depuran un datepicker que "no funciona" - en mi caso fue un problema con mi CSS de reset, específicamente con esto:

html, body { overflow: auto; }

Mi datepicker estaba bien, pero seguía apareciendo en la parte superior de la pantalla. :)

27 abr 2013 21:47:52
2

En tu ejemplo, el código jQuery se coloca antes de que se cree el div del 'datepicker'. Por lo tanto, no hará nada. Debes colocar el bloque script después del div 'row', o usar jQuery(document).ready() en su lugar.

31 oct 2011 00:27:17
Comentarios

Coloqué el script después del '<div>' pero no cambió nada. He hecho una página de prueba, HTML simple, con solo el HTML generado desde la página de WordPress, y aún no funciona. ¿Cómo puedo depurarlo?

Terix Terix
31 oct 2011 09:22:08

Asegúrate de tener Firebug, Google Chrome, o usar Internet Explorer con las Herramientas para desarrolladores activadas (F12). Debes revisar la consola de errores y buscar errores de JavaScript. Siéntete libre de publicar un enlace y lo revisaremos.

Tom Auger Tom Auger
31 oct 2011 14:56:32
2

Incluye tu script personalizado también a través de wp_enqueue_script() y haz referencia a las otras librerías, así no tendrás problemas con la línea de tiempo; tu script personalizado para solicitar las librerías del datepicker se cargará después de que todos los demás scripts estén listos; funciona bien incluso en futuras versiones de WP.

31 oct 2011 03:08:16
Comentarios

¿quieres decir poner el código jquery dentro de un archivo js y llamarlo?

Terix Terix
31 oct 2011 09:23:20

@bueltge eso solo resolvería el problema si Terix lo llamara así: wp_enqueue_script( 'do-date', 'http://www.xxxxxxxx.it/wp-content/themes/greyzed/js/do_date.js' , array('jquery-ui-datepicker'), 1, true ) - el último 'true' es importante para que coloque el script en el footer, es decir, después de que se haya creado el div. Aún así, prefiero usar document.ready(), independientemente.

Tom Auger Tom Auger
31 oct 2011 15:01:53