2010-04-05 14 views
33

Mam formularz z wieloma elementami wejściowymi. Niektóre są data pola z datepicker jQuery UI alraedy załączonym:Sprawdź, czy element ma już datepicker jQuery

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

Potem kluczową komendę związany z tą funkcją:

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

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

Działa to doskonale na elementach, które mają już datepicker na nich. Jednak każde inne pole spowoduje błąd javascript. Zastanawiam się, jaki jest najlepszy sposób na sprawdzenie, czy datepicker został już zainicjowany na tym polu.

Odpowiedz

62

Wow nie mogę uwierzyć, że tęskniłem za tym. Linia 108 ui.datepicker.js:

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

Więc po prostu trzeba przetestować na hasClass('hasDatepicker'). Wydaje się to najprostszą drogą. Co więcej, to stwierdzenie sprawdza, czy datepicker jest aktualnie otwarty (dla każdego, kto jest zainteresowany):

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

Aby sprawdzić, czy autouzupełnianie jQuery UI zostało zainicjowane, użyłem tego: '$ ('# myinput'). (": Dane (autouzupełnianie) ")'. Zakładam, że działa to również dla datepicker. –

+0

Tylko dlatego, że klasa znaczników nie zawsze oznacza, że ​​datepicker znajduje się w węźle. W Datatables, gdy przesuwa się do widoku karty, datepicker jest usuwany z węzła, ale klasa zostaje! Musisz więc dodać dodatkową kontrolę, jak powyżej, i usunąć klasę, jeśli chcesz ponownie powiązać, ponieważ datepicker wewnętrznie używa klasy jako proxy, aby zapobiec wielokrotnym powiązaniom. – Jeff

1

Jednym podstawowym rozwiązaniem jest ustawienie atrybutu w momencie przyłączenia datepicker a następnie test że:

$("#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"); 

Następnie można zrobić:

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

Czy istnieje bardziej bezpośredni sposób?

+0

Lubię to podejście, ale chciałbym używać 'addClass („danych kalendarza”)', które następnie pozwalają na skorzystanie z prostego selektora takiego : '$ (" data-calendar "). datepicker (" show ");'. – Travis

9

1) Jeśli kod wygeneruje błąd podczas próby otwarcia datepicker, można umieścić kod do try..catch

2) Można ustawić pewne dane w polu wejściowym podczas inicjowania datepicker

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

3) można korzystać z danych przechowywanych przez datepicker plugin

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

lub

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

4) datepicker wewnętrznie wykorzystuje funkcję _getInst

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

przy czym sposób jest prawie taki sam jak w przykładzie 3.

Nie można znaleźć żadnego lepszego rozwiązania.

+0

Dzięki! To mi bardzo pomogło. –

+0

'if ($ (" # someElement ") .danych (" datepicker ")! == null)' nie jest dokładnie w porządku, ze względu na 'dane()' zwracające 'undefined', a nie' null'. Mniej ścisłe porównanie '! =' Działa jednak. –

+0

Sprawdziłem jQuery 1.5, która była najnowszą wersją w kwietniu 2010 roku, aby mieć pewność, że zwraca 'undefined' lub' null'. Zwrócił 'niezdefiniowane'. Zaktualizowałem swoją odpowiedź. Dziękuje za komentarz. – Rafael

0

Mam kolejną sprawę. Mój skrypt kopiuje ostatnie elementy tabeli, w tym datepicker.

JQuery nie będzie działać, ponieważ skopiowany element ma znak "hasDatepicker".

Aby aktywować datepicker w nowym elemencie, usuń tę nazwę klasy i zainicjuj ją w ten sposób.

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

To było moje rozwiązanie :)

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

To jest test, jeśli w bieżącym oknie jest dostępny datepicker, a nie, jeśli jest na wejściu. – Gh61

Powiązane problemy