2010-10-18 15 views
20

No importa lo que intento, no puedo hacer que el evento beforeShow se active en mi datepicker. Aquí está mi código:beforeShow evento no se activa en jQueryUI Datepicker

$('#calendar').datepicker({ 
inline: true, 
dateFormat: 'mm,dd,yy', 
beforeShow: function(input, inst) { alert('before'); } 
}); 

He añadido beforeShowDay y eventos onselect a mi planificador de evento, y lo hacen fuego correctamente. ¿Alguien más ha tenido problemas con esto?

+1

¿Qué versiones de jquery y jqueryUI estás utilizando? – Leopd

Respuesta

0

Es un poco complicado pero use el método setTimeout para iniciar la función que funciona bien para mí.

$('#calendar').datepicker({ 
inline: true, 
dateFormat: 'mm,dd,yy', 
beforeShow: function() { 
    setTimeout(function() { 
     alert('before'); 
    }, 10); 
} 
}); 
+0

No es la manera correcta de conectar con los oyentes. – lededje

4

He encontrado una solución para eso. Debe añadir 3 líneas de código en jquery.ui.datepicker.js (la versión completa)

línea cerca # 274, encontramos este this._updateAlternate(inst);

Justo después de esta línea, puso lo siguiente:

var beforeShow = $.datepicker._get(inst, 'beforeShow'); 
if(beforeShow) 
    beforeShow.apply(); 

La versión de jqueryui.com no tiene beforeShow habilitado para datepicker en línea. Con este código, beforeShow está habilitado.

+0

Como se menciona en la respuesta, este método habilitará beforeShow. Sin embargo, los parámetros 'input' y' inst' no son accesibles de esta manera como se define en http://jqueryui.com/demos/datepicker/#event-beforeShow –

5

En realidad, esto es un poco más correcto (y sigue el modelo plug-in/clase):

var beforeShow = $.datepicker._get(inst, 'beforeShow'); 
extendRemove(inst.settings, (beforeShow ? beforeShow.apply(target, [target, inst]) : {})); 
+0

Como no está claro en la respuesta, me gustaría señalar que este código va en el método '_inlineDatepicker' justo después de la línea' this._updateAlternate (inst) '. En el completo jquery-ui-1.8.23.js, esto sería en la línea 7156. –

23

Aquí está la solución de mi equipo se le ocurrió por lo que no tiene que acordarse de modificar los archivos de jQuery cada vez que hay una actualización. Sólo tiene que añadir esto a su propio guión e incluirlo:

(function ($) { 
    $.extend($.datepicker, { 

     // Reference the orignal function so we can override it and call it later 
     _inlineDatepicker2: $.datepicker._inlineDatepicker, 

     // Override the _inlineDatepicker method 
     _inlineDatepicker: function (target, inst) { 

      // Call the original 
      this._inlineDatepicker2(target, inst); 

      var beforeShow = $.datepicker._get(inst, 'beforeShow'); 

      if (beforeShow) { 
       beforeShow.apply(target, [target, inst]); 
      } 
     } 
    }); 
}(jQuery)); 
+2

Esta es la respuesta correcta. Funcionó perfectamente ¡Gracias! – Matt

1

que quería utilizar beforeShow para actualizar la fecha minumum de un selector de fechas fecha final para reflejar la fecha establecida en el selector de fechas fecha de inicio. He revelado una serie de soluciones publicadas aquí y en otros lugares que fueron complicadas. Me puede estar perdiendo algo, pero el siguiente código bastante directo funciona para mí.

Esto restablece el enfoque a la fecha de inicio si todavía no se ha configurado y se intenta ingresar una fecha de finalización. Si se ha establecido una fecha de inicio, establece la fecha mínima para el final _Fecha adecuada.

$(function(){ 
    $("#start_Date").datepicker({ 
     changeMonth: true, 
     changeYear: true, 
     yearRange: "c-1:c+5", 
     dateFormat: "dd-mm-yy" 
    }); 
    $("#end_Date").datepicker({ 
     changeMonth: true, 
     changeYear: true, 
     yearRange: "c-1:c+5", 
     dateFormat: "dd-mm-yy", 
     beforeShow: end_Range 
    }); 

    function end_Range(){ 
     if ($("#start_Date").datepicker("getDate") == null){ 
      $("#start_Date").focus(); 
     } else { 
      // set minimum date range 
      $("#end_Date").datepicker("option", "minDate", new Date ($("#start_Date").datepicker("getDate"))); 
     }; 
    }; 
}); 

Con campos de fecha:

<label>Date</label><input class="datepicker" id="start_Date" type="text"/> 
<label>Date</label><input class="datepicker" id="end_Date" type="text"/> 
0

¿Te asignar selector de fechas() a este elemento antes?

beforeShow evento adjuntar al elemento una vez que asigne datepicker() por primera vez. Si reasigna datepicker() al mismo elemento, no funcionará correctamente.

Trate de 'destruir' y reasignar datepicker(), que es muy útil para mí.

$('#calendar').datepicker('destroy'); 

$('#calendar').datepicker({ 
    inline: true, 
    dateFormat: 'mm,dd,yy', 
    beforeShow: function(input, inst) { 
     alert('before'); 
    } 
}); 
Cuestiones relacionadas