2011-02-13 12 views
7

Cuando declaro un selector de fechas con vivo, parece que funciona como se espera hasta que se cambie el mes. Luego, en lugar de ir al mes siguiente o al mes anterior, se salta a enero de 1900 si presiona mes adelante y diciembre de 1899 si presiona mes atrás.acción selector de fechas jQuery extraño

usando

$('.datepicker').live('focus', function() { 
    $(this).datepicker('destroy').datepicker(); 
}); 

¿Alguna idea?

Gracias

+0

¿Puede vincular a una página de ejemplo que demuestre esto? –

+0

Un ejemplo de la condición _ [aquí] (http://jsfiddle.net/Scoobler/qXFpz/) _ – Scoobler

Respuesta

8

creo que una posible razón por la que está viendo el problema es, cuando se utiliza el enfoque para adjuntar a la entrada, entonces estás destruyendo tu datep icker y rehaciendo uno. Sin embargo, cuando hace clic en su entrada, se ejecuta, por lo que destruye el selector de fecha y muestra uno. Sin embargo, al hacer clic en Siguiente o en Anterior, inicialmente perderá el foco en la entrada, pero el script del datepicker lo 'reenfocara' y por lo tanto desactivará el destructor y volverá a crear un datepicker.

que suponga que está utilizando vivir adjuntar un selector de fechas a una entrada dinámica - siempre se puede utilizar $('.datepicker').not('.hasDatePicker').datepicker(); llamada en su success:...... de devolución de llamada de la llamada ajax, donde voy a asumir, va a crear su nueva entrada. Esto tendrá el efecto de la adición de un .datepicker() a cualquier elemento de entrada con la clase datepicker que ya no ha tenido un .datepicker() añade. (Una entrada que ha tenido un .datepicker() añade a ella, también tendrá la clase hasDatePicker añadido a la misma)


Un método alternativo - consonancia con la llamada en vivo - que tiene de pro y el contra de

  • PRO: sólo se necesita que una vez en su código - en lugar de colocarlo varias veces si tiene varias llamadas ajax que puede agregar varias entradas dinámicas.
  • CON: Usted está creando un recurso mucho más poco de hambre de código que se ejecutará cada vez que una entrada recibe el foco, en lugar de aplicar la .datepicker() vez.

Así que para mantener el vivo, se puede hacer lo siguiente:

$('.datepicker').live('focus', function() { 
    $(this).not('.hasDatePicker').datepicker(); 
}); 

verlo en acción here

Esta adjuntará un .datepicker() a cualquier entrada con la clase datepicker cuales no tiene ya tiene .datepicker() adjunto (clase hasDatePicker), esto debería te salvará destruyendo y recreando todos los datapickers.

Esto hace lo mismo que la solución de @ Andrew Whitaker

+0

@Andrew Whitaker, @Scoobler bam! gracias montones chicos –

+0

Esto funcionó para mí, gracias! – adriandz

4

yo era capaz de reproducir tu ejemplo, y registrados en la consola estaba siendo manejado cada vez que focus y parecía que dos veces por cada clic en la entrada. Cambié el caso de que live estaba administrando a focusin y el problema desaparece:

$('.datepicker').live('focusin', function() { 
    $(this).datepicker('destroy').datepicker(); 
}); 

Todavía estoy haciendo algo de investigación para ver lo que está pasando exactamente.

Edit: En la fuente de datepicker, hay varias llamadas manuales focus(), probablemente es una de ellas la que está causando el problema.

Además, gracias a @ comentario de Scoobler continuación, la solución anterior no funcionará con jQuery 1.5, pero parece funcionar para 1.4.4

Además, si su objetivo es aplicar datepickers elementos añadidos a través de AJAX , es posible que desee considerar la comprobación de la existencia de un selector de fechas y continuación aplicar el widget selector de fechas si no existe ya:

$('.datepicker').live('focus', function() { 
    if (!$(this).data("datepicker")) { 
     $(this).datepicker(); 
    } 
}); 
+1

Esto todavía no funciona, al menos para mí, el primer cambio funciona, es decir, muestra feb, haga clic en el mes anterior muestra a jan, como se esperaba, sin embargo, el segundo clic en el mes anterior saltará a nov 1899 _ [verlo aquí] (http://jsfiddle.net/Scoobler/qXFpz/1/) _ ​​ – Scoobler

+0

@Scoobler: Gracias, yo vea el problema: parece ocurrir solo con jQuery 1.5, no con 1.44. Interesante ... –

+0

+1, publiqué una respuesta a lo que creo ___ porque era demasiado largo para hacer un comentario, pero estoy de acuerdo, creo que será debido a perder el foco al hacer clic en el calendario, y luego recuperarlo debido al script del datepicker - es extraño cómo ocurre esto en el v1.5 y no en el v1.4.4 .... – Scoobler

1
$('.datepicker').datepicker('destroy');  
$('.datepicker').removeClass("hasDatepicker").removeAttr('id');  
$('.datepicker').datepicker({dateFormat: "yy-mm-dd"}); 

Esto eliminará por completo el selector de fechas y hacer uno nuevo cada vez que haga clic en el selector de fechas. Esto es principalmente útil para el selector de fecha en un menú desplegable. También encontré que esto es útil para tener múltiples filas de artículos que tienen sus propias fechas.

0

Para el jQuery 1.7+ esta es una buena solución al agregar entradas de fecha dinámicamente

$('.datepicker').on('focusin', function() { 
    $(this).not('.hasDatePicker').datepicker(); 
}); 

trabajado para mí!

Cuestiones relacionadas