2012-04-20 25 views
18

Tengo una aplicación web bastante compleja a la que me gustaría agregarle una IU de recolección de fechas.jQuery datepicker sin entrada

El problema con el que me estoy encontrando es que no he podido deducir de los documentos cómo realmente tomar el control de cómo y cuándo aparece el marcador de fecha. No hay elementos de formulario implicados (y no, no voy a agregar un campo de formulario secreto), por lo que el enfoque simple listo para usar simplemente no funcionará.

Espero que alguien pueda proporcionar una pequeña guía sobre un patrón que me permita invocar el datepicker programáticamente. Creo que sé cómo utilizaría los eventos personalizados de datepicker para inicializarlo y posicionarlo, y para recuperar el valor elegido cuando el usuario lo descarta. Solo me cuesta crear una instancia de un marcador de fecha, ya que no lo estoy emparejando con un elemento.

Esto es lo que no es de trabajo:

function doThing(sCurrent, event) { // sCurrent is the current value; event is an event I'm using for positioning information only 
    var bIsDate = !isNaN((new Date(sCurrent)).getTime()); 

    jQuery.datepicker('dialog', 
     (bIsDate ? new Date(sOriginal) : new Date()), // date 
     function() { console.log('user picked a date'); }, // onSelect 
     null, // settings (i haz none) 
     event // position 
    ); 

} 

La razón es que "jQuery.datepicker" no es una función. (Estoy haciendo lo incorrecto.)

No estoy casado con el enfoque de 'diálogo' - fue mi mejor intento de invocar uno sin referencia a un elemento de formulario.

estoy usando jQuery 1.4.3 y 1.8.6 jQueryUI

Respuesta

9

He leído a través del código de selector de fecha, y parece que, como está escrito, el selector de fechas debe ser unido a una etiqueta de entrada, div, o el intervalo.

tanto, si su única objeción es que el uso de un elemento de formulario, luego adjuntar a un div o palmo es probablemente su mejor apuesta, y hay un ejemplo de cómo hacerlo aquí: https://stackoverflow.com/a/1112135

Si eres buscando otra forma de controlar el datepicker, entonces puede que tengas que extender el código datepicker para hacer lo que quieres que haga, y si vas por esa ruta, entonces recomiendo comenzar echando un vistazo al método privado _inlineDatepicker en el datepicker código, que es el método que asocia el selector de fecha a una etiqueta div o span.

+0

¡Gracias por excavar! También he echado un vistazo, y aunque todavía no lo he hecho funcionar, descubrí que el complemento realmente genera una ENTRADA oculta cuando se llama al método "dialog", escondiéndolo detrás del datepicker visible cuando está activo.Parece una especie de hokey, pero confirma lo que muchas otras publicaciones de SO sugieren: el plugin en realidad solo está diseñado para el caso estándar. Puede que tenga que arreglar eso. – Tom

+0

Después de un buen tiempo de prueba, este fue el único patrón admitido. Alguien necesita mejorar el marcador de fecha para que sea más flexible. Tal vez ese alguien soy yo. Una batalla a la vez, sin embargo. – Tom

+0

También se usan los resultados de div/span en datepicker en línea (siempre se muestra) ... Pregunta no relacionada sobre este problema (todavía no hay respuesta) - http://stackoverflow.com/questions/17371859/jquery-ui-datepicker-force-non- inline-popup-mode-on-span-or-div –

0

tiene que definir Campo de entrada dinámicamente luego coloque el selector de fechas que su clase recién creada Sin campo no creo que por lo que funciona.

<input type="hidden" id="yourField" /> 

y utilizar

$("#yourField").datepicker({ 
     buttonImage: '../yourImage.png', 
     buttonImageOnly: true, 
     changeMonth: true, 
     changeYear: true, 
     showOn: 'both', 
    }); 
+0

Lo sentimos, pero no hay INPUT en esta parte de la aplicación, y no voy a agregar uno simplemente porque es la manera más obvia de asociar este comportamiento. Siento que estaba bastante claro al respecto en mi publicación. – Tom

14

Desde la página del plugin: http://jqueryui.com/demos/datepicker/#inline

<script> 
    $(function() { 
     $("#datepicker").datepicker(); 
    }); 
</script> 


<div class="demo"> 
    Date: <div id="datepicker"></div> 
</div><!-- End demo --> 

visualización del selector de fechas incrustado en la página en lugar de en una superposición. Simplemente llame a .datepicker() en un div en lugar de una entrada.