2009-08-09 27 views
13

Hola compañero stackoverflow: ERS,jQuery selector de fechas: evitar el cierre selector al hacer clic en una fecha

estoy usando el jQuery Datepicker plugin, junto con Martin Milesich Timepicker plugin. Todo funciona muy bien, excepto por el hecho de que al hacer clic en una fecha en el selector de fecha, se cierra el widget, sin dejar tiempo para elegir la hora.

Pregunta: Así que me pregunto si hay una forma de evitar que el widget se cierre al hacer clic en una fecha y obligue a los usuarios a hacer clic en el botón "Listo" (que aparece cuando se habilita la opción "showButtonPanel: true"), o haciendo clic fuera del widget. ¡No quiero que mis usuarios tengan que abrir el widget dos veces! Ver el comportamiento online at the timepicker demo

¡Cualquier ayuda que resuelva este problema, o incluso indicadores en la dirección correcta, se aprecia!

Más información: estoy usando los archivos suministrados desde Martins enlace de descarga: http://milesich.com/tpdemo/timepicker-0.2.0.zip

  • jQuery-UI-1.7.2.custom.min.js
  • timepicker.js (última versión 0.2 .0)

Estas son las opciones que estoy usando:

$(document).ready(function(){ 
    $(".datepicker").datepicker({ 
     duration: '', 
     showTime: true, 
     constrainInput: false, 
     stepMinutes: 5, 
     stepHours: 1, 
     time24h: true, 
     dateFormat: "yy-mm-dd", 
     buttonImage: '/static/images/datepicker.png', 
     buttonImageOnly: true, 
     firstDay: 1, 
     monthNames: ['Januari','Februari','Mars','April','Maj','Juni','Juli','Augusti','September','Oktober','November','December'], 
     showOn: 'both', 
     showButtonPanel: true 
    }); 
}) 
+0

Una nota rápida para decir que esta cuestión ya no es un problema en la versión actual de TimePicker enchufar. –

+0

@JamesMcGrath: ¡Gracias, es bueno saber! –

+2

@lucifer: Lo siento, no. Está utilizando StackOverflow incorrecto. Si tiene una pregunta, escriba una nueva con la mayor cantidad de información que pueda. Probablemente recibirá una respuesta en un par de horas. –

Respuesta

19

en lugar de cambiar la fuente que lo mejor es utilizar los eventos existentes

onSelect: function() { 
    $(this).data('datepicker').inline = true;        
}, 
onClose: function() { 
    $(this).data('datepicker').inline = false; 
} 
+0

Esta es una solución mucho mejor. Nota: esto eliminará el botón "finalizado" si tiene habilitado 'showButtonPanel: true'. No he resuelto cómo detener este comportamiento. –

+0

Muchas gracias. Esta es la solución perfecta. – RY35

+0

@PhilMoorhouse Un poco tarde, pero tal vez todavía ayude a alguien: en jquery-ui encontrarás una función '_generateHTML' que no agregará el botón" done "si la instancia tiene' inline: true'set. Puede buscar la única ocurrencia de 'ui-datepicker-close' allí y deshacerse de este comportamiento. – lexith

8

Tendrá que hackear el datepicker usted mismo. Este es el código que usa. Si no está en línea, se ocultará cuando seleccione una fecha.

Puede pasar su propio método onSelect y cambiar rápidamente la instancia de datePicker para que esté en línea y luego volver a cambiarla sin tener que cambiar el interno de datepicker, pero es una solución muy hacky.

if (inst.inline) 
     this._updateDatepicker(inst); 
else { 
     this._hideDatepicker(null, this._get(inst, 'duration')); 
     this._lastInput = inst.input[0]; 
     if (typeof(inst.input[0]) != 'object') 
     inst.input[0].focus(); // restore focus 
     this._lastInput = null; 
} 
+0

Muchas gracias redsquare, su respuesta me condujo en la dirección correcta. Parece que onSelect solo se activa al seleccionar una fecha, por lo que simplemente llamar a show() en la instancia de select me da el comportamiento que quiero. ... onSelect: function (dateText, inst) { inst.show(); } –

+0

No, mi culpa. Lo anterior arroja un error, algo que parece impedir que el selector se esconda. Todavía no puedo hacer que tu sugerencia funcione. Si lo cambio a "en línea", el botón Listo desaparece y no hay otra manera de cerrar la ventana que hacer clic fuera de ella. Traté de establecer un tiempo de espera y reiniciar el modo en línea sin ningún efecto. –

+0

Ok, encontré una segunda forma de hacer lo que quiero. En realidad, es posible anular el método _selectDate, de dónde proviene el código que proporcionó anteriormente, con un método personalizado. Ese método contiene exactamente el mismo código que en el archivo original, pero sin la línea "_hideDatepicker". Simple, y bastante hackish, pero funciona. –

26

Como referencia, y como la gente me ha preguntado esto por correo. He aquí un trozo de código que necesita ser añadido a timepicker.js:

/** 
* Don't hide the date picker when clicking a date 
*/ 
$.datepicker._selectDateOverload = $.datepicker._selectDate; 
$.datepicker._selectDate = function(id, dateStr) { 
    var target = $(id); 
    var inst = this._getInst(target[0]); 
    inst.inline = true; 
    $.datepicker._selectDateOverload(id, dateStr); 
    inst.inline = false; 
    this._updateDatepicker(inst); 
} 

Buena suerte en conseguir que funcione en su sitio!

+0

+1 una vieja pregunta, pero todavía funciona! gracias por agregar esta referencia. – zaf

+0

@zaf: Gracias por volver a contactarme y votar :) –

+0

Todavía funciona en mayo de 2012 :) – Tzafrir

0

Siguiendo con lo que sugirió Emil, encontré una manera más fácil y más fácil de modificar el widget para admitir un widget que no cierra en el evento seleccionado.

En primer lugar, he añadido otra propiedad a los valores predeterminados de diccionario en el widget:

closeOnSelect:true //True to close the widget when you select a date 

En segundo lugar, encontramos esta declaración en el método _selectDate:

if (inst.inline) 
     this._updateDatepicker(inst); 
else { 
     ... 
    } 

Y cambiar la condición de ser como este :

var closeOnSelect = this._get(inst, "closeOnSelect");   
if (inst.inline || !closeOnSelect) 
     this._updateDatepicker(inst); 
else { 
     ... 
    } 

Pruébalo, está funcionando para mí. Lo hice sobre la versión de JQuery UI 1.8.5.

0

Genial, si está utilizando jquery-ui-1.8.5.custom.min.js y jquery-ui.multidatespicker.js, puede modificar jquery-ui-1.8.5.custom.min.JS: de:

if(a.inline)this._updateDatepicker(a); 

en:

if(a.inline || !this._get(a, 'closeOnSelect'))this._updateDatepicker(a); 
0

bien esta solución alternativa sucia ... pero se funciona para mí ... incluso con showButtonPanel: verdadero

$(function() { 
    var dp_c = null, dp_once = false; 
    $('#datepicker').datepicker({ 
     showButtonPanel: true, 
     onSelect: function() { 
     $(this).data('datepicker').inline = true; 
     setTimeout(function() { 
      $('#ui-datepicker-div').find('.ui-datepicker-buttonpane').append(dp_c); 
     }, 1); 

     }, 
     onClose: function() { 
     $(this).data('datepicker').inline = false; 
     } 
    }).click(function() { 
     if(!dp_once) { 
     setTimeout(function() { 
      dp_c = $('#ui-datepicker-div').find('.ui-datepicker-close').clone(); 
     }, 500); 
     dp_once = !!1; 
     } 
    }); 

    $('#ui-datepicker-div').on('click', '.ui-datepicker-close', function() { 
     $('#datepicker').datepicker("hide"); 
    }); 

    }); 
0

Debe anular nativa función JS:

/* Update the input field with the selected date. */ 
     _selectDate: function(id, dateStr) { 
      var target = $(id); 
      var inst = this._getInst(target[0]); 
      dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); 
      if (inst.input) 
       inst.input.val(dateStr); 
      this._updateAlternate(inst); 
      var onSelect = this._get(inst, 'onSelect'); 
      if (onSelect) 
       onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback 
      else if (inst.input) 
       inst.input.trigger('change'); // fire the change event 
      if (inst.inline) 
       this._updateDatepicker(inst); 
      else { 
       if(inst.settings.hideOnSelect != false){ 
        this._hideDatepicker(); 
       } 
       this._lastInput = inst.input[0]; 
       if (typeof(inst.input[0]) != 'object') 
        inst.input.focus(); // restore focus 
       this._lastInput = null; 
      } 
     }, 

Y añada opción apropiada para selector de fecha de configuración, como ejemplo:

var defaultDatePickerOptions = { 
     hideOnSelect: false, 
     ... 
    }; 
var birthDate = jQuery.extend({}, defaultDatePickerOptions); 
$('#birthdate').datepicker(birthDate); 
3

Aquí es una solución:

onSelect: function (dateText, inst) { 
    ..... // Your code like $(this).val(dateText);` 


    //Set inline to true to force "no close" 
    inst.inline = true; 
}, 
onClose: function(date,inst){ 
    //Set inline to false => datapicker is closed 
    // onClose is called only if you click outside the datapicker, onSelect will not 
    // trig onClose due to inline = true 
    inst.inline = false; 
} 

`

2

¿Por qué todos los comentarios proporcionan una solución alternativa? se straigtfarword:

utilizar el calendario en línea con altField :)

<input type="text" id="alternate" size="30" /> 
    <div id="datepicker"></div> 

    <script> 
     $("#datepicker").datepicker({ 
      altField: "#alternate" 
     }); 
    </script> 

cheque este violín: http://jsfiddle.net/menocomp/y2s662b0/1/

Cuestiones relacionadas