Kiedy grałem <input type="range">
, Firefox wyzwala zdarzenie onchange tylko wtedy, gdy upuszczamy suwak do nowej pozycji, w której Chrome i inni uruchamiają zdarzenia onchange, gdy suwak jest przeciągany.
Jak mogę to zrobić podczas przeciągania w przeglądarce Firefox?
function showVal(newVal){
document.getElementById("valBox").innerHTML=newVal;
}
<span id="valBox"></span>
<input type="range" min="5" max="10" step="1" onchange="showVal(this.value)">
onchange
nie strzela. Znalazłem to pytanie podczas rozwiązywania tego problemu.Odpowiedzi:
Najwyraźniej Chrome i Safari są niepoprawne:
onchange
powinny być uruchamiane tylko po zwolnieniu myszy przez użytkownika. Aby otrzymywać ciągłe aktualizacje, należy skorzystać zeoninput
zdarzenia, które przechwytuje aktualizacje na żywo w Firefox, Safari i Chrome, zarówno z myszy, jak i klawiatury.Jednak
oninput
nie jest obsługiwany w IE10, więc najlepszym rozwiązaniem jest połączenie dwóch programów obsługi zdarzeń, takich jak to:Sprawdź ten wątek Bugzilli, aby uzyskać więcej informacji.
źródło
$("#myelement").on("input change", function() { doSomething(); });
z jQuery.onchange()
nie działa w internecie mobilnym, takim jakAndroid Chrome
iiOS Safari
. Wszelkie alternatywne sugestie?PODSUMOWANIE:
Zapewniam tutaj możliwość korzystania z przeglądarki internetowej i mobilnej bez jQuery do konsekwentnego reagowania na interakcje zakresu / suwaka, co jest niemożliwe w obecnych przeglądarkach. Zasadniczo zmusza wszystkie przeglądarki do emulacji
on("change"...
zdarzenia IE11 dla ich zdarzeńon("change"...
lubon("input"...
zdarzeń. Nowa funkcja to ...... gdzie
r
jest twój element wejściowy zakresu if
twój słuchacz. Słuchacz zostanie wywołany po każdej interakcji, która zmienia wartość zakresu / suwaka, ale nie po interakcjach, które nie zmieniają tej wartości, w tym początkowych interakcji myszy lub dotyku w bieżącej pozycji suwaka lub po zejściu z dowolnego końca suwaka.Problem:
Na początku czerwca 2016 r. Różne przeglądarki różnią się pod względem reakcji na użycie zakresu / suwaka. Pięć scenariuszy jest istotnych:
Poniższa tabela pokazuje, w jaki sposób różnią się zachowanie co najmniej trzech różnych przeglądarek na komputery, w odniesieniu do których z powyższych scenariuszy odpowiadają:
Rozwiązanie:
Ta
onRangeChange
funkcja zapewnia spójną i przewidywalną reakcję różnych przeglądarek na interakcje zakresu / suwaka. Wymusza zachowanie wszystkich przeglądarek zgodnie z poniższą tabelą:W IE11 kod zasadniczo pozwala wszystkim działać zgodnie ze status quo, tzn. Pozwala
"change"
zdarzeniu funkcjonować w standardowy sposób, a"input"
zdarzenie jest nieistotne, ponieważ i tak nigdy się nie uruchamia. W innych przeglądarkach"change"
zdarzenie jest skutecznie wyciszane (aby zapobiec uruchamianiu dodatkowych, a czasem niezbyt widocznych zdarzeń). Ponadto"input"
zdarzenie uruchamia detektor tylko wtedy, gdy zmienia się wartość zakresu / suwaka. W przypadku niektórych przeglądarek (np. Firefox) dzieje się tak, ponieważ słuchacz jest skutecznie wyciszony w scenariuszach 1, 4 i 5 z powyższej listy.(Jeśli naprawdę potrzebujesz aktywacji słuchacza w jednym ze scenariuszy 1, 4 i / lub 5, możesz spróbować włączyć
"mousedown"
/"touchstart"
,"mousemove"
/"touchmove"
i / lub"mouseup"
/"touchend"
zdarzenia. Takie rozwiązanie jest poza zakresem tej odpowiedzi).Funkcjonalność w przeglądarkach mobilnych:
Testowałem ten kod w przeglądarkach komputerowych, ale nie w żadnych przeglądarkach mobilnych. Jednak w innej odpowiedzi na tej stronie MBourne pokazał, że moje rozwiązanie tutaj „... wydaje się działać w każdej przeglądarce, jaką mogłem znaleźć (Win Desktop: IE, Chrome, Opera, FF; Android Chrome, Opera i FF, iOS Safari) „ . (Dzięki MBourne.)
Stosowanie:
Aby skorzystać z tego rozwiązania, włącz
onRangeChange
funkcję z powyższego podsumowania (uproszczonego / zminimalizowanego) lub fragment kodu demonstracyjnego poniżej (funkcjonalnie identyczny, ale bardziej zrozumiały) we własnym kodzie. Wywołaj go w następujący sposób:gdzie
myRangeInputElmt
jest pożądany<input type="range">
element DOM imyListener
jest funkcją nasłuchiwania / obsługi, która ma być wywoływana po"change"
zdarzeniach podobnych do tego.W razie potrzeby Twój detektor może być pozbawiony parametrów lub może użyć
event
parametru, tzn. Zadziała dowolna z poniższych opcji, w zależności od potrzeb:lub
(Usunięcie detektora zdarzeń z
input
elementu (np. UżycieremoveEventListener
) nie jest uwzględnione w tej odpowiedzi.)Opis wersji demo:
W poniższym fragmencie kodu funkcja
onRangeChange
zapewnia uniwersalne rozwiązanie. Reszta kodu jest po prostu przykładem demonstrującym jego użycie. Każda zmienna, która zaczyna się od, niemy...
ma znaczenia dla uniwersalnego rozwiązania i jest obecna tylko na potrzeby wersji demonstracyjnej.Pokazy demo wartość zakres / suwak, a także ile razy średnia
"change"
,"input"
i niestandardowych"onRangeChange"
zdarzeń mają opalane (wiersze A, B i C, odpowiednio). Podczas korzystania z tego fragmentu w różnych przeglądarkach podczas interakcji z suwakiem zakresu / suwaka zwróć uwagę na następujące kwestie:Kod demonstracyjny:
Kredyt:
Chociaż implementacja tutaj jest w dużej mierze moja, zainspirowała ją odpowiedź MBourne . Ta inna odpowiedź sugerowała, że zdarzenia „wejściowe” i „zmieniające” mogą zostać połączone, a wynikowy kod będzie działał zarówno w przeglądarkach stacjonarnych, jak i mobilnych. Jednak kod w tej odpowiedzi powoduje, że uruchamiane są ukryte „dodatkowe” zdarzenia, co samo w sobie jest problematyczne, a wyzwalane zdarzenia różnią się między przeglądarkami, co stanowi kolejny problem. Moja implementacja rozwiązuje te problemy.
Słowa kluczowe:
JavaScript wejściowy typ zakresu suwak zdarzenia zmieniają wejście kompatybilność z przeglądarką przeglądarka stacjonarna mobilny no-jQuery
źródło
Publikuję to jako odpowiedź, ponieważ zasługuje na to, aby była to odpowiedź własna, a nie komentarz pod mniej użyteczną odpowiedzią. Uważam, że ta metoda jest znacznie lepsza niż zaakceptowana odpowiedź, ponieważ może przechowywać wszystkie pliki js w osobnym pliku od HTML.
Odpowiedź udzielona przez Jamreliana w jego komentarzu pod przyjętą odpowiedzią.
Pamiętaj jednak o tym komentarzu Jaime'a
Jak w nim, uruchomi się zdarzenie, gdy przestaniesz poruszać myszą, a następnie ponownie, gdy zwolnisz przycisk myszy.
Aktualizacja
W związku ze
change
zdarzeniem iinput
zdarzeniem powodującym dwukrotne uruchomienie funkcji, nie stanowi to problemu.Jeśli masz funkcję odpalającą
input
, jest bardzo mało prawdopodobne, że wystąpi problem po uruchomieniuchange
zdarzenia.input
odpala szybko podczas przeciągania suwaka wprowadzania zakresu. Martwienie się o jeszcze jedno wywołanie funkcji na końcu jest jak martwienie się o pojedynczą kroplę wody w porównaniu do oceanu wody, który jestinput
wydarzeniem.Powodem nawet włączenia tego
change
wydarzenia jest ze względu na kompatybilność przeglądarki (głównie z IE).źródło
AKTUALIZACJA: Pozostawiam tę odpowiedź tutaj jako przykład użycia zdarzeń myszy do interakcji zakresu / suwaka w przeglądarkach komputerowych (ale nie mobilnych). Jednak teraz napisałem też zupełnie inną i, jak sądzę, lepszą odpowiedź w innym miejscu na tej stronie, która stosuje inne podejście do zapewnienia rozwiązania tego problemu w różnych przeglądarkach na komputery i urządzenia mobilne .
Oryginalna odpowiedź:
Podsumowanie: Proste w przeglądarce rozwiązanie JavaScript (tj. Bez jQuery) umożliwiające odczyt wartości wejściowych zakresu bez użycia
on('input'...
i / lubon('change'...
które działają niespójnie między przeglądarkami.Na dzień dzisiejszy (koniec lutego 2016 r.) Nadal występuje niespójność przeglądarki, dlatego udostępniam nowe rozwiązanie.
Problem: Podczas korzystania z danych wejściowych zakresu, tj. Suwaka,
on('input'...
zapewnia stale aktualizowane wartości zakresu w komputerach Mac i Windows Firefox, Chrome i Opera, a także Mac Safari, aon('change'...
raportuje tylko wartość zakresu po najechaniu myszą. Natomiast w przeglądarce Internet Explorer (v11) won('input'...
ogóle nie działa ion('change'...
jest stale aktualizowana.Zgłaszam tutaj 2 strategie uzyskiwania identycznego ciągłego raportowania wartości zakresu we wszystkich przeglądarkach za pomocą waniliowego JavaScript (tj. Bez jQuery) poprzez użycie zdarzeń mousedown, mousemove i (prawdopodobnie) mouseup.
Strategia 1: Krótsza, ale mniej wydajna
Jeśli wolisz krótszy kod niż kod bardziej wydajny, możesz użyć tego pierwszego rozwiązania, które używa myszy i myszy, ale nie myszy. Odczytuje suwak w razie potrzeby, ale nadal uruchamia się niepotrzebnie podczas zdarzeń po najechaniu myszką, nawet gdy użytkownik nie kliknął, a zatem nie przeciąga suwaka. Zasadniczo odczytuje wartość zakresu zarówno po zdarzeniu „mousedown”, jak i podczas „ruchów myszy”, nieco opóźniając każde użycie
requestAnimationFrame
.Strategia 2: Dłuższa, ale bardziej wydajna
Jeśli potrzebujesz bardziej wydajnego kodu i tolerujesz dłuższą długość kodu, możesz skorzystać z następującego rozwiązania, które wykorzystuje mousedown, mousemove i mouseup. Odczytuje również suwak w razie potrzeby, ale odpowiednio przestaje go czytać, gdy tylko zwolniony zostanie przycisk myszy. Istotną różnicą jest to, że zaczyna nasłuchiwać „mousemove” po „mousedown” i przestaje nasłuchiwać „mousemove” po „mouseup”.
Demo: Pełniejsze wyjaśnienie potrzeby i wdrożenia powyższych obejść
Poniższy kod pełniej pokazuje wiele aspektów tej strategii. Objaśnienia są osadzone w demonstracji:
Pokaż fragment kodu
źródło
touchmove
powinno wystarczyć i myślę, że można to traktować tak jakmousemove
w tym przypadku.Rozwiązania Andrew Willema nie są kompatybilne z urządzeniami mobilnymi.
Oto modyfikacja jego drugiego rozwiązania, które działa w Edge, IE, Opera, FF, Chrome, iOS Safari i odpowiednikach mobilnych (które mogłem przetestować):
Aktualizacja 1: Usunięto część „requestAnimationFrame”, ponieważ zgadzam się, że nie jest to konieczne:
Aktualizacja 2: Odpowiedź na zaktualizowaną odpowiedź Andrew z 2 czerwca 2016 r .:
Dzięki, Andrew - wydaje się, że działa w każdej przeglądarce, jaką mogłem znaleźć (Win Desktop: IE, Chrome, Opera, FF; Android Chrome, Opera i FF, iOS Safari).
Aktualizacja 3: rozwiązanie if („oninput in slider)
Poniższe wydaje się działać we wszystkich powyższych przeglądarkach. (Nie mogę teraz znaleźć oryginalnego źródła.) Używałem tego, ale potem nie udało się to w IE, więc zacząłem szukać innego, stąd trafiłem tutaj.
Ale zanim sprawdziłem twoje rozwiązanie, zauważyłem, że to znowu działa w IE - być może był jakiś inny konflikt.
źródło
Aby uzyskać dobre zachowanie w różnych przeglądarkach i zrozumiały kod, najlepiej jest użyć atrybutu onchange w połączeniu z formularzem:
To samo przy użyciu oninput , wartość jest zmieniana bezpośrednio.
źródło
Jeszcze inne podejście - wystarczy ustawić flagę na elemencie sygnalizującym, który typ zdarzenia powinien zostać obsłużony:
źródło
Możesz użyć zdarzenia JavaScript „ondrag” do ciągłego uruchamiania. Jest lepszy niż „wkład” z następujących powodów:
Obsługa przeglądarki.
Może odróżnić zdarzenie „ondrag” i „zmień”. „wejście” odpala dla przeciągania i zmiany.
W jQuery:
Odniesienie: http://www.w3schools.com/TAgs/ev_ondrag.asp
źródło