2011-10-11 20 views
25

Próbuję przesłać formularz, gdy element zostanie wybrany z menu. Ustawiam klasę na formularzu wyszukiwania i używam wybranego zdarzenia, które można znaleźć tutaj: http://docs.jquery.com/UI/Autocomplete#event-selectAutouzupełnianie jQuery: Zdarzenie-wybierz

Teraz, po wybraniu elementu za pomocą klawiatury (GÓRA i DÓŁ), działa. Ale jeśli wybierzesz przedmiot za pomocą myszy, otrzymasz wartość, która została wcześniej wpisana.

Sprawdź to screenr: http://www.screenr.com/7T0s

To właśnie używam składania:

$("#searchform-input").autocomplete({ 
    select: function (a, b) { 
     $(".searchform1").submit() 
    } 
}); 

Odpowiedz

63

To dlatego domyślne zachowanie select imprezy jest wykonywany after your event handler is finished running (dzięki czemu można je anulować, jeśli tak zdecydujesz).

Oznacza to, że po kliknięciu na coś formularz jest wysyłany, zanim widżet ma szansę wypełnić prawidłowo input.

powinien być w stanie rozwiązać ten problem, wykonując co widżet normalnie robi dla Ciebie:

$("#searchform-input").autocomplete({ 
    select: function (a, b) { 
     $(this).val(b.item.value); 
     $(".searchform1").submit() 
    } 
}); 

Teraz, co można się zastanawiać, jest tak, ale dlaczego to działa podczas korzystania z klawiatury?

Dzieje się tak dlatego, że wydarzenie focus faktycznie zapełnia skoncentrowaną pozycję w input (przyjrzeć; zobaczysz input zaludnione jak poruszać się w górę iw dół listy). Po najechaniu kursorem na element, wywoływane jest zdarzenie focus, zapełniając input. Po wybraniu czegoś za pomocą klucza enter poprawna wartość jest w stanie input z powodu zdarzenia focus.

+2

+1 beat mnie do niego ... wypróbować [Demo] (http://jsfiddle.net/Mottie/SmycH/) – Mottie

+0

Incredible! Dzięki dużo, sir – jQuerybeast

+0

@jQuerybeast: Nie ma problemu! –

-2

Hehe. Bardzo podchwytliwe, ale niezwykle łatwe do rozwiązania. Wystarczy opóźnić funkcję o 500 milisekund po zdarzeniu select. Działa idealnie. ZADANIE WYKONANE!! :)

$("#searchform-input").autocomplete({ 
select: function (a, b) { 
    setTimeout(submit,500); 
}}); 
+2

Nie należy polegać na czasie, gdy istnieje prawdziwe rozwiązanie. –

Powiązane problemy