Zdarzenie zmiany typu wejścia = „liczba”

86

Jak mogę obsłużyć wymianę za <input type="number" id="n" value="5" step=".5" />? Nie mogę zrobić keyuplub 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?

Ian Davis
źródło
2
Zdajesz sobie sprawę, że typ wejścia nie jest obsługiwany przez IE lub Firefox?
AlienWebguy
Teraz jest obsługiwany przez przeglądarkę Firefox
ElephantHunter
2
caniuse.com/#feat=input-number Tak, komentuję pytanie sprzed sześciu lat.
Pete

Odpowiedzi:

134

Użyj myszy i klawisza

$(":input").bind('keyup mouseup', function () {
    alert("changed");            
});

http://jsfiddle.net/XezmB/2/

JohnColvin
źródło
4
Spowoduje to ostrzeżenie, nawet jeśli wartość nie uległa zmianie (wystarczy kliknąć w dowolnym miejscu input).
James Allardice,
Tak, to będzie. Jeśli to jest problem, powinieneś śledzić wartość w danych wejściowych w zmiennej globalnej lub w elemencie danych na wejściu. Gdy zdarzenie mouseup wywoła twoją funkcję, porównaj tę wartość z bieżącą wartością wejścia. Zrób coś tylko wtedy, gdy wartość uległa zmianie.
JohnColvin
3
To nie działa, jeśli wartość jest zmieniana przez przewijanie myszy nad elementem.
Ondrej Machulda
7
Dodaj zdarzenie „mousewheel”, aby obsługiwać zmiany przez przewijanie.
Martijn
4
Jeśli użytkownik przytrzyma klawisz strzałki, aby zmienić wartość, to nie zostanie uruchomione, dopóki klawisz strzałki nie zostanie zwolniony. Używanie inputzamiast tego (jak sugerowano w innej odpowiedzi) wydaje się działać lepiej.
Josh Kelley,
75

oninputWydarzenie ( .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>

Flo
źródło
9

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).

Jake Feasel
źródło
6

Aby wykryć naciśnięcie myszy lub klawisza, możesz również napisać:

$(document).on('keyup mouseup', '#your-id', function() {                                                                                                                     
  console.log('changed');
});
Kingsley Ijomah
źródło
3
$(':input').bind('click keyup', function(){
    // do stuff
});

Demo: http://jsfiddle.net/X8cV3/

AlienWebguy
źródło
Będzie to nadal wykonywane, jeśli wartość nie uległa zmianie (wystarczy kliknąć w dowolnym miejscu input).
James Allardice,
To prawda, ale kiedy uchwyci zdarzenie, może określić, czy wartość uległa zmianie, czy nie.
AlienWebguy
3

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>
SandroMarques
źródło
1

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, changei clickwydarzeń. 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ługi clickzdarzenia.

James Allardice
źródło
Zaśmiecanie zakresu globalnego zmienną o nazwie valueto kłopoty.
AlienWebguy
Bardzo prawdziwe. Podobnie jak twoja odpowiedź, to tylko przykład. Myślę, że @JakeFeasel ma prawdopodobnie najczystsze rozwiązanie.
James Allardice,
1
$("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");
});
NK
źródło
1
<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>

http://jsfiddle.net/patrickrobles53/s10wLjL3/

Użyłem ukrytego typu danych wejściowych jako kontenera poprzedniej wartości, która będzie potrzebna do porównania przy następnej zmianie.

Patrick Robles
źródło
możesz użyć tylko data-prevatrybutu do przechowywania poprzedniej wartości. Nie ma potrzeby używania dodatkowych danych wejściowych
shukshin.ivan
1

Miał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/

Bruno Ribeiro
źródło