2010-10-18 16 views
20

Non importa quello che provo, non sono in grado di ottenere l'evento beforeShow da attivare sul mio datepicker. Ecco il mio codice:evento beforeShow non attivato su jQueryUI Datepicker

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

Ho aggiunto beforeShowDay ed eventi onSelect al mio datepicker, e lo fanno in modo corretto il fuoco. Qualcun altro ha avuto problemi con questo?

+1

Quali versioni di jquery e jqueryUI stai utilizzando? – Leopd

risposta

0

È un po 'complicato ma utilizzare il metodo setTimeout per avviare la funzione funziona correttamente per me.

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

Non è il modo giusto per aggirare gli ascoltatori. – lededje

4

ho trovato una soluzione per questo. È necessario aggiungere 3 righe di codice nel jquery.ui.datepicker.js (versione completa)

Vicino linea # 274, trovare questo this._updateAlternate(inst);

Subito dopo questa riga, inserire il seguente:

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

La versione da jqueryui.com non è stata abilitata primaShow per datepicker in linea. Con questo codice, beforeShow è abilitato.

+0

Come menzionato nella risposta, questo metodo abiliterà beforeShow. Tuttavia, i parametri 'input' e' inst' non sono accessibili in questo modo come definito su http://jqueryui.com/demos/datepicker/#event-beforeShow –

5

In realtà, questo è un po 'più corretto (e segue il plugin/modello di classe):

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

Perché non è chiaro nella risposta, mi piacerebbe puntare che questo codice va nel metodo '_inlineDatepicker' subito dopo la riga' this._updateAlternate (inst) '. Nel pieno jquery-ui-1.8.23.js, questo sarebbe alla riga 7156. –

23

Ecco la soluzione la mia squadra si avvicinò con in modo da non ricordare di modificare i file jQuery ogni volta c'è un aggiornamento. Basta aggiungere questo per il proprio script e includerlo:

(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

Questa è la risposta corretta. Ha funzionato perfettamente Grazie! – Matt

1

ho voluto usare beforeShow per aggiornare la data di minumum su una data di fine datepicker per riflettere la data di cui la data di inizio datepicker. Ho rinnovato una serie di soluzioni pubblicate qui e altrove che sono state complicate. Potrei mancare qualcosa ma il seguente codice abbastanza semplice funziona per me.

Questo reimposta lo stato attivo alla data di inizio se non è ancora stato impostato nessuno e viene effettuato un tentativo di immettere una data di fine. Se è stata impostata una data di inizio, imposta la data minima per la data _date finale in modo appropriato.

$(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 campi data:

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

Avete assegnare datepicker() per questo elemento prima?

l'evento beforeShow si collega all'elemento dopo aver assegnato datepicker() alla prima volta. Se si riassegna datepicker() allo stesso elemento, allora non funzionerà correttamente.

Provare a "distruggere" e riassegnare datepicker(), che è ben lavoro per me.

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

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