Mam formularz wejściowy, który pozwala mi wybierać spośród wielu opcji i robić coś, gdy użytkownik zmienia wybór. Na przykład,
<select onChange="javascript:doSomething();">
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Teraz doSomething()
jest uruchamiany tylko po zmianie wyboru .
Chcę uruchomić, doSomething()
gdy użytkownik wybierze dowolną opcję, prawdopodobnie tę samą ponownie.
Próbowałem użyć modułu obsługi „onClick”, ale jest on uruchamiany, zanim użytkownik rozpocznie proces selekcji.
Czy istnieje sposób, aby uruchomić funkcję przy każdym wybraniu przez użytkownika?
Aktualizacja:
Odpowiedź sugerowana przez Darryla wydawała się działać, ale nie działa konsekwentnie. Czasami zdarzenie jest wyzwalane, gdy tylko użytkownik kliknie menu rozwijane, nawet zanim użytkownik zakończy proces selekcji!
javascript
html
html-select
dom-events
ePharaoh
źródło
źródło
Odpowiedzi:
Oto najprostszy sposób:
Działa zarówno z zaznaczaniem myszą, jak i klawiszami w górę / w dół na klawiaturze, na której zaznaczono.
źródło
undefined
.if(type(this.selectedIndex) != undefined; doSomething()
doSomething()
Funkcja nie jest wyzwalany, gdy użytkownik wybierze już wybraną opcję. Zobacz ten wątek , w którym kolor tła zmienia się tylko, jeśli wybierzesz inną opcję niż aktualnie wybrana.doSomething()
gdy wybrana jest jedna konkretna opcja, na przykład „opcja 3” w powyższym przykładzie, użyj,if (this.selectedIndex==4)
przy czym liczba „4” reprezentuje indeks liczbowy opcji, NIE określonąvalue
! (tzn. „opcja 3” jest czwartą opcją<select name="ab">
).Potrzebowałem czegoś dokładnie takiego samego. Oto, co zadziałało dla mnie:
Obsługuje to:
źródło
Miałem ten sam problem, kiedy tworzyłem projekt kilka miesięcy temu. Rozwiązaniem, które znalazłem, było użycie
.live("change", function())
w połączeniu z.blur()
elementem, którego używasz.Jeśli chcesz mieć coś zrobić, gdy użytkownik po prostu kliknie, zamiast zmieniać, po prostu zastąpić
change
zclick
.Przypisałem moje menu rozwijane
selected
i użyłem następującego:Widziałem, że ta nie ma wybranej odpowiedzi, więc pomyślałem, że dam swój wkład. Działa to dla mnie doskonale, więc mam nadzieję, że ktoś inny może użyć tego kodu, gdy utknie.
http://api.jquery.com/live/
Edycja: użyj
on
selektora zamiast.live
. Zobacz jQuery .on ()źródło
To tylko pomysł, ale czy można umieścić kliknięcie na każdym z
<option>
elementów?Inną opcją może być użycie onblur na zaznaczeniu. Uruchomi się za każdym razem, gdy użytkownik kliknie poza wybraną opcją. W tym momencie możesz określić, która opcja została wybrana. Aby to nawet wyzwolić we właściwym czasie, kliknięcie opcji może rozmyć pole (uczynić coś jeszcze aktywnym lub po prostu .blur () w jQuery).
źródło
Podejście onclick nie jest całkiem złe, ale jak powiedziano, nie zostanie uruchomione, gdy wartość nie zostanie zmieniona kliknięciem myszy.
Możliwe jest jednak wyzwolenie zdarzenia onclick w zdarzeniu onchange.
źródło
Zamierzam rozwinąć odpowiedź Jitbita. Uznałem, że to dziwne, kiedy kliknąłeś menu rozwijane, a następnie kliknęli menu rozwijane bez wybierania niczego. Skończyło się na czymś w rodzaju:
Ma to nieco większy sens dla użytkownika i pozwala na uruchomienie JavaScript za każdym razem, gdy wybierze dowolną opcję, w tym wcześniejszą.
Wadą tego podejścia jest to, że łamie on możliwość tabulacji na liście rozwijanej i używania klawiszy strzałek, aby wybrać wartość. Było to dla mnie do zaakceptowania, ponieważ wszyscy użytkownicy klikali wszystko przez cały czas, aż do końca wieczności.
źródło
this
zamiast$(this)
. Jednak nie wyciągam z tego wszystkich zamierzonych zachowań; nie ostrzega, gdy ponownie wybiorę tę samą opcję.onchange
jest uruchamiany podczas dodawania opcji usuwania do zaznaczonego pola za pomocą JS. Nie tylko wtedy, gdy użytkownik wybierze przedmiotJeśli naprawdę potrzebujesz, aby działało w ten sposób, zrobiłbym to (aby upewnić się, że działa za pomocą klawiatury i myszy)
Niestety kliknięcie będzie uruchamiane wiele razy (np. Po otwarciu zaznaczenia ... i zaznaczeniu / zamknięciu), a klawisz onkeypress może zostać uruchomiony, gdy nic się nie zmieni ...
źródło
Aby poprawnie uruchomić zdarzenie za każdym razem, gdy użytkownik wybierze coś (nawet tę samą opcję), wystarczy oszukać pole wyboru.
Jak powiedzieli inni, określ negatyw
selectedIndex
ustawienie ostrości, aby wymusić zdarzenie zmiany. Chociaż pozwala to na oszukać pole wyboru, nie będzie działać, dopóki będzie ono aktywne. Prostym rozwiązaniem jest wymuszenie rozmycia pola wyboru, jak pokazano poniżej.Standardowy JS / HTML:
jQuery Plugin:
Tutaj możesz zobaczyć działające demo .
źródło
W rzeczywistości zdarzenia onclick NIE będą uruchamiane, gdy użytkownik użyje klawiatury do zmiany wyboru w kontrolce select. Być może będziesz musiał użyć kombinacji onChange i onClick, aby uzyskać pożądane zachowanie.
źródło
To może nie odpowiedzieć bezpośrednio na twoje pytanie, ale ten problem można rozwiązać przez proste dostosowanie poziomu projektu. Rozumiem, że może to nie dotyczyć w 100% wszystkich przypadków użycia, ale zdecydowanie zachęcam do ponownego przemyślenia przepływu aplikacji przez użytkownika i czy można zastosować następującą sugestię projektową.
Zdecydowałem się zrobić coś prostszego niż hackowanie alternatyw dla
onChange()
wykorzystania innych zdarzeń, które tak naprawdę nie były przeznaczone do tego celu (blur
,click
etc.)Sposób, w jaki to rozwiązałem:
Po prostu wstępnie wstaw symbol zastępczy, taki jak select, który nie ma dla niego żadnej wartości.
Zamiast korzystać z następującej struktury, która wymaga alternatywnych metod hack-y:
Rozważ użycie tego:
W ten sposób Twój kod jest DUŻO uproszczony i
onChange
będzie działał zgodnie z oczekiwaniami, za każdym razem, gdy użytkownik zdecyduje się wybrać coś innego niż wartość domyślna. Możesz nawet dodaćdisabled
atrybut do pierwszej opcji, jeśli nie chcesz, aby wybrał go ponownie i zmusić do wybrania czegoś z opcji, wywołując w ten sposóbonChange()
pożar.W chwili udzielania odpowiedzi piszę złożoną aplikację Vue i stwierdziłem, że ten wybór projektu znacznie uprościł mój kod. Spędziłem godziny na tym problemie, zanim zdecydowałem się na to rozwiązanie i nie musiałem ponownie pisać dużo mojego kodu. Jednakże, gdybym wybrał hacky alternatywy, musiałbym wziąć pod uwagę przypadki krawędzi, aby zapobiec podwójnemu uruchamianiu żądań ajax itp. To również nie psuje domyślnego zachowania przeglądarki jako miłej premii (testowane na urządzeniach mobilnych przeglądarki również).
Czasami wystarczy zrobić krok do tyłu i pomyśleć o dużym obrazie dla najprostszego rozwiązania.
źródło
To, co zrobiłem, gdy napotkałem podobny problem, to dodanie „onFocus” do pola wyboru, które dołącza nową ogólną opcję („wybierz opcję” lub coś podobnego) i domyślnie jako wybraną opcję.
źródło
Moim celem było więc wielokrotne wybranie tej samej wartości, która zasadniczo nadpisuje funkcję onchange () i przekształca ją w przydatną metodę onclick ().
Na podstawie powyższych sugestii wpadłem na to, co działa dla mnie.
http://jsfiddle.net/dR9tH/19/
źródło
onfocus="this.selectedIndex=-1"
rozwiązań: Bieżący wybór jest nokautowany, jeśli przechodzisz do elementu lub przechodzisz poza menu bez wybierania czegokolwiek. Naciśnij tab na skrzypcach, aby zobaczyć, co mam na myśli. (Zauważ też, że dostajesz pustą wartość, a nie „-”, gdy to robisz. To dlatego,selectedIndex=-1
że nie możesz tego zrobić<option value="-1">
; byłaby to niewielka poprawa w użyciuonfocus="this.selectedIndex=0"
. Jest to całkiem przyzwoite obejście, ale ja nie jak utrata obecnego wyboru tylko dlatego, że zajrzałem do menu, a nawet po prostuprzede wszystkim używasz onChange jako procedury obsługi zdarzeń, a następnie używasz zmiennej flagowej, aby wykonać tę funkcję, którą chcesz za każdym razem, gdy wprowadzasz zmiany
źródło
Dodaj dodatkową opcję jako pierwszą, na przykład nagłówek kolumny, która będzie domyślną wartością przycisku rozwijanego przed kliknięciem i zresetowaniem na końcu
doSomething()
, więc gdy wybierzesz A / B / C, zdarzenie onchange zawsze uruchamia się, gdy wybór jestState
, nic nie rób i wróć.onclick
jest bardzo niestabilny, jak wiele osób wspomniało wcześniej. Więc wszystko, co musimy zrobić, to zrobić początkową etykietę przycisku, która będzie inna niż twoje prawdziwe opcje, więc zmiana będzie działać na każdej opcji.źródło
Cudowną rzeczą w tagu select (w tym scenariuszu) jest to, że pobiera swoją wartość z tagów opcji.
Próbować:
Działał dla mnie przyzwoicie.
źródło
użyj jquery:
źródło
Oto moje rozwiązanie, zupełnie inne niż wszystkie inne tutaj. Używa pozycji myszy, aby dowiedzieć się, czy kliknięto opcję, a nie kliknięcie pola wyboru, aby otworzyć menu rozwijane. Wykorzystuje pozycję event.screenY, ponieważ jest to jedyna niezawodna zmienna dla różnych przeglądarek. Zdarzenie zawisu musi być najpierw dołączone, aby mogło ustalić pozycję elementów sterujących względem ekranu przed zdarzeniem kliknięcia.
Oto mój jsFiddle http://jsfiddle.net/sU7EV/4/
źródło
powinieneś spróbować użyć
option:selected
źródło
Co dla mnie działa:
W ten sposób onchange wywołuje „doSomething ()”, gdy opcja się zmienia, a onclick wywołuje „doSomething ()”, gdy zdarzenie onchange jest fałszywe, innymi słowy, gdy wybierzesz tę samą opcję
źródło
Spróbuj tego (zdarzenie wyzwalane dokładnie po wybraniu opcji, bez zmiany opcji):
http://jsbin.com/dowoloka/4
źródło
Tutaj masz zwrócony indeks, aw kodzie js możesz użyć tego zwrotu z jednym przełącznikiem lub czymkolwiek chcesz.
źródło
Spróbuj tego:
źródło
Czy dawno temu, ale w odpowiedzi na pierwotne pytanie, czy to pomogłoby? Po prostu włóż
onClick
doSELECT
linii. Następnie umieśćOPTION
wOPTION
wierszach to, co chcesz zrobić . to znaczy:źródło
źródło
Stawiłem czoła podobnej potrzebie i ostatecznie napisałem dyrektywę angularjs dotyczącą tego samego -
link guthub - wybór kątowy
Służy
element[0].blur();
do usuwania fokusa ze znacznika wyboru. Logika polega na wywołaniu tego rozmycia przy drugim kliknięciu menu rozwijanego.as-select
uruchamia się, nawet gdy użytkownik wybierze tę samą wartość z menu rozwijanego.DEMO - link
źródło
Jedyną prawdziwą odpowiedzią jest nieużywanie pola wyboru (jeśli musisz coś zrobić po ponownym wybraniu tej samej odpowiedzi).
Utwórz menu rozwijane z konwencjonalnym menu div, przycisk, pokaż / ukryj. Link: https://www.w3schools.com/howto/howto_js_dropdown.asp
Można by tego uniknąć, gdyby można było dodać detektory zdarzeń do opcji. Jeśli dla elementu select istniał detektor onSelect. A jeśli kliknięcie wybranego pola nie spowodowało irytującego odpalenia mousedown, najedź myszką i kliknij wszystkie jednocześnie na mousedown.
źródło
Jest kilka rzeczy, które chcesz zrobić tutaj, aby upewnić się, że zapamiętuje starsze wartości i wyzwala zdarzenie onchange, nawet jeśli ta sama opcja zostanie ponownie wybrana.
Pierwszą rzeczą, jakiej chcesz, jest regularne zdarzenie onChange:
Aby mieć wyzwalacz zdarzenia onChange, nawet gdy ta sama opcja zostanie ponownie wybrana, możesz odznaczyć wybraną opcję, gdy menu rozwijane zostanie aktywowane, ustawiając ją na niepoprawną wartość. Ale chcesz również zapisać poprzednio wybraną wartość, aby ją przywrócić w przypadku, gdy użytkownik nie wybierze żadnej nowej opcji:
Powyższy kod pozwoli ci uruchomić onchange, nawet jeśli wybrano tę samą wartość. Jeśli jednak użytkownik kliknie poza polem wyboru, chcesz przywrócić poprzednią wartość. Robimy to na onBlur:
źródło
Uprzejmie informujemy, że moduły obsługi zdarzeń nie są obsługiwane dla znacznika OPTION w przeglądarce IE. Szybko się nad tym zastanowiłem. Wymyśliłem to rozwiązanie, wypróbuj je i przekaż mi swoją opinię:
To, co tu robię, to zresetowanie indeksu wyboru, tak aby zdarzenie onchange było zawsze uruchamiane, prawda, że tracimy wybrany element po kliknięciu i może to być denerwujące, jeśli twoja lista jest długa, ale może ci to w jakiś sposób pomóc ..
źródło
co ze zmianą wartości zaznaczenia, gdy element zyskuje fokus, np. (z jquery):
źródło
Znalazłem to rozwiązanie.
początkowo ustaw parametr selectedIndex elementu select na 0
nazwij tę metodę zdarzeniem onChange
źródło