2011-01-27 11 views
9

Mam jQuery Datepicker funkcji związany z "Birthday" element html wejściowe, napisany w nagłówku strony:jQuery datepicker nie będzie działać na AJAX dodaje element HTML

<script type="text/javascript"> 
    $(function() { 
     $("#birthday").datepicker(); 
    }); 
</script> 

Następnie mam trochę AJAX funkcjonalność - dodaje nowy element html wejściowy do strony. Ten element jest:

<input type="text" id="birthday" value="" class="detail-textbox1" /> 

Kliknięcie tego urodziny elementu nie pop-up wyboru daty poniższego pola tekstowego. Spodziewałem się tego, ponieważ element jest dodawany po załadowaniu strony, a więc nie jest związany z funkcją podaną w nagłówku.

Jak mogę to sprawić? Próbowałem przenieść skrypt z nagłówka do treści, ale nic nie działa. Dzięki.

P.S. Jeśli utworzę wejściowy element html o id = "birthday" w treści strony, everythig działa zgodnie z oczekiwaniami. Wygląda na to, że tylko elementy dodane przez AJAX są dysfunkcyjne.

Odpowiedz

4

Trzeba użyć .live() tak, aby wszystkie nowo dodane elementy mają obsługi zdarzeń załączone: http://api.jquery.com/live/

$('#birthday').bind('load', function() { 
    $(this).datepicker(); 
}); 

EDIT

.live() documentation stwierdza, że ​​jest to nieco nieaktualne . W nowych wersjach jquery (1.7+) użyj .on().

+2

Dzięki JK. Użycie .live() rozwiązuje problem. Zamiast twojego przykładu użyłem $ ('# birthday'). Live ('focus', function() {$ (this) .datepicker();}); – Boris

+0

@ Bis funkcja .datepicker() tworzy selektor, więc wystarczy go wywołać tylko raz. Ale to nie za bardzo będzie bolało, myślę, że robię to za każdym razem, gdy się skupiam (ale jest to mniej efektywne, niż mogłoby być). –

+1

Jeśli zmienię "focus" na "load", to w ogóle nie działa. Zauważyłem też, że gdy klikam kartę w datepicker i tabulator (bez wybierania żadnej wartości), żaden z moich skryptów AJAX/php nie działa. ?!?! Co ja robię źle? – Boris

0

Można zainicjować wyboru daty dla nowo dodanego elementu w swoim ajax sukcesu zwrotnego:

$.ajax({ 

    ... 

    success: function(response) { 
     if(response.success) { 
       $(body).append(response.html); 
       $("#birthday").datepicker(); 
     } 
    } 
}); 
1

Boris, JK: To było bardzo pomocne dla mnie. Odkryłem także, że można korzystać z następujących powodów dla AJAX html jeśli chcesz używać DatePicker za wybór Zakres dat:

$('#groundtransporation').live('focus', function() { 
var gt = $("#rentalPickUp, #rentalDropOff").datepicker({ 
    defaultDate: "+1w", 
    changeMonth: true, 
    numberOfMonths: 2, 
    onSelect: function(selectedDate) { 
    var option = this.id == "rentalPickUp" ? "minDate" : "maxDate", 
     instance = $(this).data("datepicker"), 
     date = $.datepicker.parseDate(
     instance.settings.dateFormat || 
     $.datepicker._defaults.dateFormat, 
     selectedDate, instance.settings); 
    gt.not(this).datepicker("option", option, date); 
    } 
}); 
}); 
+0

Tutaj należy zwrócić uwagę na metodę live wiążącą elementy aktualnie znajdujące się na stronie, a także te tworzone później, rozwiązując w ten sposób problem elementów dodawanych później, nie posiadając DtPicker. Jednak metoda live jest teraz przestarzała na rzecz "on" – BuddhiP

16

Jestem trochę późno do partii, ale dla dokładności - oraz z funkcją .live() bycia deprecated from jQuery 1.7 i dalej - Myślałem, że dostarczę zaktualizowane rozwiązanie oparte na moich doświadczeniach i od wszelkiej pomocy, jaką uzyskałem od innych odpowiedzi na temat StackOverflow!

Miałem sytuację, w której musiałem dodać funkcjonalność datepicker do pól wejściowych, które były dodawane do DOM przez wywołania AJAX losowo, i nie mogłem modyfikować skryptu wykonującego wywołania AJAX w celu dołączenia funkcji datepicker, więc zdecydowałem się na nową błyszczącą .on() funkcji z jego cech delegacji:

// do this once the DOM's available... 
$(function(){ 

    // this line will add an event handler to the selected inputs, both 
    // current and future, whenever they are clicked... 
    // this is delegation at work, and you can use any containing element 
    // you like - I just used the "body" tag for convenience... 
    $("body").on("click", ".my_input_element", function(){ 

     // as an added bonus, if you are afraid of attaching the "datepicker" 
     // multiple times, you can check for the "hasDatepicker" class... 
     if (!$(this).hasClass("hasDatepicker")) 
     { 
      $(this).datepicker(); 
      $(this).datepicker("show"); 
     } 
    }); 
}); 

mam nadzieję, że ktoś pomoże, i dzięki za wszystkie odpowiedzi tak daleko, że doprowadził mnie do takiego rozwiązania, że ​​pracował dla mnie! :)

+0

Nie mam wyboru, ale używać jquery 1.7, ponieważ jest to wymagane w pracy. : "(. Ale wersja jQuery 1.7 tego, co pokazałeś powyżej, nie działa dla mnie.: /. Tak, frustrujący. – user919860

+0

@ user919860 - Funkcja jest nieaktualna, nieusunięta, więc nadal możesz używać funkcja 'live()' w 1.7, o ile wiem ... dokumentacja na stronie jQuery dotycząca funkcji 'live()' jest naprawdę dobra, i możesz [sprawdzić to tutaj] (http: // api Zalecają również użycie funkcji 'delegate()' do użycia ze starszymi wersjami jQuery, a szczegóły tej funkcji znajdują się na tej samej stronie w dokumentacji, ale proszę krzyczeć, jeśli jesteś nadal walczę! :) –

1

Dostałem 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", "twoja-klasa-nazwisko"); $ ("# yournewelementid"). Datepicker();

1

Twój problem występuje zawsze, gdy elementy nie istnieją podczas próby zainicjowania.

Podczas korzystania z $ (function() {/** niektóre kod **/}); elementy muszą pojawiać się na dokumencie, oznacza to, że musi znajdować się na html, aby można było utworzyć funkcję inicjującą komponent lub zainicjować go po zdarzeniu powodzenia po dodaniu go do dokumentu.

Ważne jest, aby najpierw dodać zewnętrzne ładowanie html w żądaniu ajax do dokumentu, zanim spróbujesz go zainicjować lub nie zostanie ono w ogóle zainicjowane.
przykład:

$ .ajax ({
        URL "ajax_html.html"
        dataType "HTML"
}). Sporządzono (funkcja (HTML) {
        $ ("# selektor"). html (html)
        init();
}); .

funkcja init() {
        $ ("urodziny") datepicker ({});
}

Powiązane problemy