2009-07-10 15 views
67

Quiero tener JQuery Datepicker abierto cuando el usuario hace clic en una imagen. No hay un campo de entrada donde la fecha seleccionada aparece después; Solo voy a guardar la fecha ingresada en el servidor a través de Ajax.Abra JQuery Datepicker haciendo clic en una imagen sin campo de entrada

Actualmente tengo este código:

<img src='someimage.gif' id="datepicker" /> 

$(document).ready(function() { 
    $("#datepicker").datepicker({ 
      changeMonth: true, 
      changeYear: true, 
     }).click(function() { $(this).datepicker('show'); }); 
}); 

pero no pasa nada cuando hago clic en la imagen. También he intentado guardar el resultado de la llamada datepicker() a una var global y luego llamar a datepicker ('show') desde el evento onclick() de la imagen, pero el mismo resultado.

Respuesta

112

Resulta que un simple campo de entrada oculto hace el trabajo:

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

y luego usar el atributo ButtonImage para su imagen, como si fuera normal:

$("#dp").datepicker({ 
     buttonImage: '../images/icon_star.gif', 
     buttonImageOnly: true, 
     changeMonth: true, 
     changeYear: true, 
     showOn: 'both', 
    }); 

Inicialmente probé un campo de entrada de texto y luego establecí un estilo display:none en él, pero eso hizo que el calendario emergiera de la parte superior del navegador, en lugar de que el usuario hiciera clic ked. Pero el campo oculto funciona como se desee.

+1

Encontró su propia respuesta y la aceptó. +1 –

+0

Funcionó muy bien, gracias! –

+0

+1 Funciona para mí –

23

La documentación de jQuery dice que el datePicker necesita estar conectado a un SPAN o un DIV cuando no está asociado con un cuadro de entrada. Se podría hacer algo como esto:

<img src='someimage.gif' id="datepickerImage" /> 
<div id="datepicker"></div> 

<script type="text/javascript"> 
$(document).ready(function() { 
    $("#datepicker").datepicker({ 
      changeMonth: true, 
      changeYear: true, 
    }) 
    .hide() 
    .click(function() { 
     $(this).hide(); 
    }); 

    $("#datepickerImage").click(function() { 
     $("#datepicker").show(); 
    }); 
}); 
</script> 
+1

Esto funciona, pero extrañamente pierdo algo de funcionalidad con esta publicación mensual. Por ejemplo, no obtengo el efecto de animación de desplazamiento abierto. Más importante aún, el calendario no desaparece cuando hago clic fuera de él. – ep4169

+0

Además, ¿cuál es el propósito de agregar ese método click() a # datepicker? Y, por cierto, quise decir "método", no "mensual". ¡Tengo calendarios en el cerebro! – ep4169

+1

El motivo para agregar el método de clics() al # selector de fechas es ocultarlo, de lo contrario, permanecerá visible. Tenga en cuenta que el comportamiento estándar solo funciona cuando el calendario está asociado a un cuadro de texto. Probablemente podría agregar un controlador .blur() para ocultarlo cuando aleje el mouse del calendario. –

3

HTML:

<div class="CalendarBlock"> 
    <input type="hidden"> 
</div> 

CÓDIGO:

$CalendarBlock=$('.CalendarBlock'); 
$CalendarBlock.click(function(){ 
    var $datepicker=$(this).find('input'); 
    datepicker.datepicker({dateFormat: 'mm/dd/yy'}); 
    $datepicker.focus(); }); 
22

Si está utilizando un campo de entrada y un icono (como en este ejemplo):

<input name="hasta" id="Hasta" type="text" readonly /> 
<a href="#" id="Hasta_icono" ></a> 

se puede conectar el selector de fechas a su icono (en mi caso dentro de la etiqueta A a través de CSS) de esta manera:

$("#Hasta").datepicker(); 
    $("#Hasta_icono").click(function() { 
    $("#Hasta").datepicker("show"); 
    }); 
+0

Exactamente lo que estaba buscando :-) – DilbertDave

7

Para cambiar el "..." cuando se pasa el ratón sobre el icono de calendario, es necesario agregar lo siguiente en las opciones datepicker:

showOn: 'button', 
    buttonText: 'Click to show the calendar', 
    buttonImageOnly: true, 
    buttonImage: 'images/cal2.png', 
1
$(function() { 
    $("#datepicker").datepicker({ 
     //showOn: both - datepicker will come clicking the input box as well as the calendar icon 
     //showOn: button - datepicker will come only clicking the calendar icon 
     showOn: 'button', 
     //you can use your local path also eg. buttonImage: 'images/x_office_calendar.png' 
     buttonImage: 'http://theonlytutorials.com/demo/x_office_calendar.png', 
     buttonImageOnly: true, 
     changeMonth: true, 
     changeYear: true, 
     showAnim: 'slideDown', 
     duration: 'fast', 
     dateFormat: 'dd-mm-yy' 
    }); 
}); 

El código anterior pertenece a this link

2

Tener un campo de entrada oculto genera problemas con el posicionamiento del diálogo datepicker (el diálogo se centra horizontalmente). Puedes alterar el margen del diálogo, pero hay una mejor manera.

Simplemente cree un campo de entrada y "escóndelo" configurando su opacidad en 0 y haciéndola de 1px de ancho. También colóquelo cerca (o debajo) del botón, o donde quiera que aparezca el marcador de fecha.

A continuación, conecte el marcador de fecha al campo de entrada "oculto" y muéstrelo cuando el usuario presiona el botón.

HTML:

<button id="date-button">Show Calendar</button> 
<input type="text" name="date-field" id="date-field" value=""> 

CSS:

#date-button { 
    position: absolute; 
    top: 0; 
    left: 0; 
    z-index: 2; 
    height 30px; 
} 

#date-field { 
    position: absolute; 
    top: 0; 
    left: 0; 
    z-index: 1; 
    width: 1px; 
    height: 32px; // height of the button + a little margin 
    opacity: 0; 
} 

JS:

$(function() { 
    $('#date-field').datepicker(); 

    $('#date-button').on('click', function() { 
     $('#date-field').datepicker('show'); 
    }); 
}); 

Nota: no se ha probado con todos los navegadores.

0
<img src='someimage.gif' id="datepicker" /> 
<input type="hidden" id="dp" /> 

$(document).on("click", "#datepicker", function() { 
    $("#dp").datepicker({ 
    dateFormat: 'dd-mm-yy', 
    minDate: 'today'}).datepicker("show"); 
    }); 

que acaba de añadir el código para hacer clic en la imagen o cualquier otro evento html etiqueta de clic. Esto se hace iniciando la función datepicker cuando hacemos clic en el disparador.

Cuestiones relacionadas