2010-04-05 11 views
33

Ho un modulo con molti elementi di input. Alcuni sono campi data con un datepicker jQuery UI alraedy allegato:Test se l'elemento ha già jQuery datepicker

$("#someElement").mask("9?9/99/9999").datepicker({showOn: 'button', buttonText:'Click here to show calendar', duration: 'fast', buttonImageOnly: true, buttonImage: /images/calicon.gif' }); 

poi ho un comando chiave legata a questa funzione:

function openCalendar() { 
    var selection = document.activeElement; 

    // { Need to test here if datepicker has already been initialized 
     $(selection).datepicker("show"); 
    // } 
} 

Questa grande opera per gli elementi che hanno già il DatePicker su di loro. Tuttavia qualsiasi altro campo genererà un errore javascript. Mi sto chiedendo il modo migliore per verificare se datepicker è già stato inizializzato su quel campo.

risposta

62

Wow non posso credere di aver perso questo. Linea 108 di ui.datepicker.js:

/* Class name added to elements to indicate already configured with a date picker. */ 
markerClassName: 'hasDatepicker', 

Così ho solo bisogno di test per hasClass('hasDatepicker'). Questo sembra il modo più diretto. Inoltre, questa dichiarazione controlla se il datepicker è attualmente aperto (per chiunque sia interessato):

if ($("#ui-datepicker-div").is(":visible") && $("#ui-datepicker-div").html() != "") { 
    // datepicker is open. you need the second condition because it starts off as visible but empty 
} 
+7

Per verificare se il completamento automatico dell'interfaccia utente jQuery è inizializzato, ho usato questo: '$ ('# myinput'). È (': data (completamento automatico)')'. Presumo che questo funzioni anche per DatePicker. –

+0

Solo perché la classe marker esiste non significa sempre che datepicker sia sul nodo. In Datatables quando si passa alla visualizzazione card, il datepicker viene rimosso dal nodo, ma la classe rimane! Quindi è necessario aggiungere il controllo extra come sopra E rimuovere la classe se è necessario eseguire nuovamente il binding poiché datepicker utilizza internamente la classe come proxy per impedire più binding. – Jeff

1

Una soluzione base è quella di impostare un attributo al momento del sequestro DatePicker e quindi verificare per questo:

$("#someElement").mask("9?9/99/9999") 
.datepicker({showOn: 'button', buttonText:'Click here to show calendar', duration: 'fast', buttonImageOnly: true, buttonImage: /images/calicon.gif' }) 
.attr("data-calendar", "true"); 

allora si potrebbe fare:

if ($(selection).attr("data-calendar") == "true") 
    $(selection).datepicker("show"); 

C'è un modo più diretto?

+0

Mi piace questo approccio, ma vorrei usare 'addClass ("data-calendario")', che poi permetterà di utilizzare un selettore semplice come questo : '$ (". data-calendar "). datepicker (" mostra ");'. – Travis

9

1) Se il codice genera un errore quando si cerca di aprire il DatePicker, è possibile inserire il codice in try..catch

2) È possibile impostare alcuni dati per il campo di input durante l'inizializzazione del datepicker

$("#someElement").data("datepicker-initialized", true); 

3) È possibile utilizzare i dati memorizzati da datepicker plug

if($("#someElement").data("datepicker") != null){ 
    // datepicker initialized 
} 

o

if($.data($('#someElement').get(0), 'datepicker')){ 
    // datepicker initialized 
} 

4) datepicker utilizza internamente una funzione _getInst

if($.datepicker._getInst($('#someElement')[0]) != null){} 

metodo fa quasi identica all'Esempio 3.

non abbiamo trovato nessuna soluzione migliore.

+0

Grazie! Questo mi ha aiutato molto. –

+0

'if ($ (" # someElement "). Data (" datepicker ")! == null)' non è esattamente corretto, a causa di 'data()' che restituisce 'undefined', non 'null'. Tuttavia, un confronto meno rigoroso '! =' Funziona. –

+0

Ho controllato jQuery 1.5, che era l'ultima versione di aprile 2010, per essere sicuro che restituisse 'undefined' o' null'. E 'tornato 'indefinito'. Ho aggiornato la mia risposta. Grazie per il commento. – Rafael

0

Ho un altro caso. Il mio copione sta copiando gli ultimi elementi della tabella incluso datepicker.

jquery non funziona perché l'elemento copiato ha contrassegnato "hasDatepicker".

Per attivare datepicker in un nuovo elemento, rimuovere il nome di classe e avviarlo, in questo modo.

$("#yournewelementid").attr("class","your-class-name"); 
$("#yournewelementid").datepicker();  
-2

Questa era la mia soluzione :)

if(typeof jQuery.fn.datepicker !== "undefined") 
+0

Questo è un test se nella finestra corrente è disponibile datepicker, non se è in ingresso. – Gh61