Jak mogę obsłużyć wymianę za <input type="number" id="n" value="5" step=".5" />
? Nie mogę zrobić keyup
lub keydown
, ponieważ użytkownik może po prostu użyć strzałek, aby zmienić wartość. Chciałbym poradzić sobie z tym za każdym razem, gdy się zmienia, a nie tylko na rozmyciu, co moim zdaniem .change()
ma miejsce. Jakieś pomysły?
86
Odpowiedzi:
Użyj myszy i klawisza
$(":input").bind('keyup mouseup', function () { alert("changed"); });
http://jsfiddle.net/XezmB/2/
źródło
input
).input
zamiast tego (jak sugerowano w innej odpowiedzi) wydaje się działać lepiej.oninput
Wydarzenie (.bind('input', fn)
) obejmuje wszelkie zmiany z klawiszy ze strzałką kliknięć i pasty klawiatura / mysz, ale nie jest obsługiwana w IE <9.jQuery(function($) { $('#mirror').text($('#alice').val()); $('#alice').on('input', function() { $('#mirror').text($('#alice').val()); }); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <input id="alice" type="number" step="any" value="99"> <p id="mirror"></p>
źródło
http://jsfiddle.net/XezmB/8/
$(":input").bind('keyup change click', function (e) { if (! $(this).data("previousValue") || $(this).data("previousValue") != $(this).val() ) { console.log("changed"); $(this).data("previousValue", $(this).val()); } }); $(":input").each(function () { $(this).data("previousValue", $(this).val()); });
To trochę getto, ale w ten sposób możesz użyć zdarzenia „kliknięcia”, aby uchwycić zdarzenie, które jest uruchamiane, gdy używasz myszy do zwiększania / zmniejszania za pomocą małych strzałek na wejściu. Możesz zobaczyć, jak wbudowałem małą ręczną procedurę „sprawdzania zmian”, która zapewnia, że logika nie zostanie uruchomiona, chyba że wartość faktycznie ulegnie zmianie (aby zapobiec fałszywym trafom wynikającym z prostych kliknięć w polu).
źródło
Aby wykryć naciśnięcie myszy lub klawisza, możesz również napisać:
$(document).on('keyup mouseup', '#your-id', function() { console.log('changed'); });
źródło
$(':input').bind('click keyup', function(){ // do stuff });
Demo: http://jsfiddle.net/X8cV3/
źródło
input
).Ponieważ
$("input[type='number']")
nie działa w IE, powinniśmy użyć nazwy lub identyfikatora klasy, na przykład$('.input_quantity')
.I nie używaj
.bind()
metody. Plik.on()
Metoda jest preferowaną metodą mocowania obsługi zdarzeń do dokumentu.Tak więc moja wersja to:
HTML
<input type="number" value="5" step=".5" min="1" max="999" id="txt_quantity" name="txt_quantity" class="input_quantity">
jQuery
<script> $(document).ready(function(){ $('.input_quantity').on('change keyup', function() { console.log('nice'); }); }); </script>
źródło
Może być lepsze rozwiązanie, ale oto, co przyszło mi do głowy:
var value = $("#yourInput").val(); $("#yourInput").on('keyup change click', function () { if(this.value !== value) { value = this.value; //Do stuff } });
Oto działający przykład .
To po prostu wiąże obsługi zdarzeń do
keyup
,change
iclick
wydarzeń. Sprawdza, czy wartość uległa zmianie, a jeśli tak, przechowuje bieżącą wartość, aby można ją było ponownie sprawdzić następnym razem. Czek jest wymagany do obsługiclick
zdarzenia.źródło
value
to kłopoty.$("input[type='number']").bind("focus", function() { var value = $(this).val(); $(this).bind("blur", function() { if(value != $(this).val()) { alert("Value changed"); } $(this).unbind("blur"); }); });
LUB
$("input[type='number']").bind("input", function() { alert("Value changed"); });
źródło
<input type="number" id="n" value="0" step=".5" /> <input type="hidden" id="v" value = "0"/> <script> $("#n").bind('keyup mouseup', function () { var current = $("#n").val(); var prevData = $("#v").val(); if(current > prevData || current < prevData){ $("#v").val(current); var newv = $("#v").val(); alert(newv); } }); </script>
źródło
data-prev
atrybutu do przechowywania poprzedniej wartości. Nie ma potrzeby używania dodatkowych danych wejściowychMiałem ten sam problem i rozwiązałem go za pomocą tego kodu
HTML
<span id="current"></span><br> <input type="number" id="n" value="5" step=".5" />
Możesz dodać tylko 3 pierwsze wiersze, pozostałe części są opcjonalne.
$('#n').on('change paste', function () { $("#current").html($(this).val()) }); // here when click on spinner to change value, call trigger change $(".input-group-btn-vertical").click(function () { $("#n").trigger("change"); }); // you can use this to block characters non numeric $("#n").keydown(function (e) { // Allow: backspace, delete, tab, escape, enter and . if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1 || (e.keyCode === 65 && e.ctrlKey === true) || (e.keyCode >= 35 && e.keyCode <= 40)) return; if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) e.preventDefault(); });
Przykład tutaj: http://jsfiddle.net/XezmB/1303/
źródło