giriş türü için onchange olayı = "sayı"


86

Bir değişimin üstesinden nasıl gelebilirim <input type="number" id="n" value="5" step=".5" />? Bir keyupveya yapamıyorum keydownçünkü kullanıcı, değeri değiştirmek için okları kullanabilir. Sadece bulanıklıkta değil, her değiştiğinde onu halletmek isterdim, sanırım .change()olay öyle. Herhangi bir fikir?


2
Giriş türünün IE veya Firefox tarafından desteklenmediğini fark ettiniz mi?
AlienWebguy

Şimdi Firefox tarafından destekleniyor
ElephantHunter

2
caniuse.com/#feat=input-number Evet, altı yıl önceki bir soruya yorum yapıyorum.
Pete

Yanıtlar:


135

Mouseup ve keyup özelliğini kullanın

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

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


4
Değer değişmemiş olsa bile bu uyarı verecektir (içinde herhangi bir yere tıklamanız yeterlidir input).
James Allardice

Evet olacak. Bu bir sorunsa, genel bir değişkendeki girdideki veya girdideki bir veri öğesindeki değeri takip etmelisiniz. Mouseup olayı işlevinizi çağırdığında, bu değeri girişin mevcut değeriyle karşılaştırın. Yalnızca değer değiştiyse bir şeyler yapın.
JohnColvin

3
Değer, öğenin üzerinde fareyle kaydırılarak değiştirilirse bu işe yaramaz.
Ondrej Machulda

7
Kaydırarak değişiklikleri desteklemek için "fare tekerleği" olayını ekleyin.
Martijn

4
Kullanıcı, değeri değiştirmek için aşağı ok tuşunu basılı tutarsa, ok tuşu bırakılana kadar bu tetiklenmez. inputBunun yerine kullanmak (başka bir cevapta önerildiği gibi) daha iyi çalışıyor gibi görünüyor.
Josh Kelley

76

oninputOlay ( .bind('input', fn)) tıklama ve klavye / fare macunu ok tuş gelen değişiklikleri kapsar, ancak <9 IE desteklenmez.

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>


10

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());
});​

Bu biraz gettodur, ancak bu şekilde, girdideki küçük oklar aracılığıyla artırmak / azaltmak için fareyi kullandığınızda gerçekleşen olayı yakalamak için "tıklama" olayını kullanabilirsiniz. Değer gerçekten değişmedikçe mantığınızın çalışmamasını sağlayan küçük bir manuel "değişiklik kontrolü" rutinini nasıl oluşturduğumu görebilirsiniz (sahadaki basit tıklamalardan kaynaklanan yanlış pozitifleri önlemek için).


6

Fareye veya tuşa ne zaman basıldığını algılamak için şunları da yazabilirsiniz:

$(document).on('keyup mouseup', '#your-id', function() {                                                                                                                     
  console.log('changed');
});


3

Çünkü $("input[type='number']")IE üzerinde çalışmıyor, biz, örneğin bir sınıf adı veya id, kullanmalıdır $('.input_quantity').

Ve .bind()yöntemi kullanma . .on()Yöntem, bir dokümana olay işleyicileri bağlanması için tercih edilen bir yöntemdir.

Yani benim versiyonum:

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>

1

Daha iyi bir çözüm olabilir ama aklıma şu geldi:

var value = $("#yourInput").val();
$("#yourInput").on('keyup change click', function () {
    if(this.value !== value) {
        value = this.value;
        //Do stuff
    }        
});

İşte çalışan bir örnek .

Bir olay işleyicisini keyup, changeve clickolaylarına bağlar . Değerin değişip değişmediğini kontrol eder ve eğer öyleyse, bir dahaki sefere tekrar kontrol edebilmesi için mevcut değeri kaydeder. clickEtkinlikle ilgilenmek için kontrol gereklidir .


Global kapsamı adlı bir değişkenle karıştırmak value, sorun istiyor.
AlienWebguy

Çok doğru. Cevabınız gibi, bu sadece bir örnek. Sanırım @JakeFeasel muhtemelen en temiz çözüme sahip.
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");
    });
});

VEYA

$("input[type='number']").bind("input", function() {
    alert("Value changed");
});

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/

Bir sonraki değişiklikte karşılaştırma için gerekli olacak önceki değerin kapsayıcısı olarak gizli bir girdi türü kullandım.


data-prevönceki değeri saklamak için sadece özniteliği kullanabilirsiniz . Ekstra giriş kullanmaya gerek yok
shukshin.ivan

1

Aynı sorunu yaşadım ve bu kodu kullanarak çözdüm

HTML

<span id="current"></span><br>
<input type="number" id="n" value="5" step=".5" />

Sadece 3 satır ekleyebilirsiniz, diğerleri isteğe bağlıdır.

$('#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();
});

Örnek burada: http://jsfiddle.net/XezmB/1303/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.