入力type =“ number”のonchangeイベント


85

のonchangeをどのように処理でき<input type="number" id="n" value="5" step=".5" />ますか?ユーザーが矢印を使用して値を変更する可能性があるため、keyupまたはを実行できませんkeydown。ぼかしだけでなく、変化するたびに処理したいと思います.change()。何か案は?


2
入力タイプがIEまたはFirefoxでサポートされていないことに気づきましたか?
AlienWebguy 2012年

現在、Firefoxでサポートされています
ElephantHunter

2
caniuse.com/#feat=input-number はい、6年前の質問にコメントしています。
ピート

回答:


134

マウスアップとキーアップを使用する

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

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


4
これにより、値が変更されていない場合でもアラートが表示されます(の任意の場所をクリックするだけinputです)。
James Allardice 2012年

はい、そうなります。それが問題である場合は、グローバル変数の入力または入力のデータ要素の値を追跡する必要があります。mouseupイベントが関数を呼び出すとき、その値を入力の現在の値と比較します。値が変更された場合にのみ何かを実行します。
JohnColvin 2012年

3
要素の上をマウスでスクロールして値を変更した場合、これは機能しません。
Ondrej Machulda 2014

7
「mousewheel」イベントを追加して、スクロールによる変更をサポートします。
martijn 2015年

4
ユーザーが矢印キーを押したままにして値を変更すると、矢印キーを離すまで起動しません。input代わりに(別の回答で示唆されているように)使用する方がうまくいくようです。
Josh Kelley 2015

75

oninputイベントは、( .bind('input', fn))クリックやキーボード/マウスペーストを矢印キーストロークからの変更をカバーするが、<9 IEでサポートされていません。

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>


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

これはちょっとしたゲットーですが、この方法では、「クリック」イベントを使用して、マウスを使用して入力の小さな矢印を介してインクリメント/デクリメントしたときに実行されるイベントをキャプチャできます。値が実際に変更されない限りロジックが起動しないことを確認する小さな手動の「変更チェック」ルーチンをどのように組み込んだかがわかります(フィールドをクリックするだけで誤検知が発生するのを防ぐため)。


6

マウスまたはキーがいつ押されたかを検出するには、次のように書くこともできます。

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


3

$("input[type='number']")IEでは機能しないため、たとえば、クラス名またはIDを使用する必要があります$('.input_quantity')

そして、.bind()メソッドを使用しないでください。この.on()メソッドは、イベントハンドラーをドキュメントにアタッチするための推奨されるメソッドです。

だから、私のバージョンは:

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

より良い解決策があるかもしれませんが、これが頭に浮かんだことです:

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

これが実際の例です。

それは単ににイベントハンドラ結合しkeyupchangeそしてclickイベントを。値が変更されたかどうかをチェックし、変更された場合は、次回もチェックできるように現在の値を保存します。clickイベントに対処するには、チェックが必要です。


名前の付いた変数でグローバルスコープを乱雑にすることvalueは、問題を引き起こします。
AlienWebguy 2012年

非常に真実です。あなたの答えのように、それはほんの一例です。@JakeFeaselがおそらく最もクリーンな解決策を持っていると思います。
James Allardice 2012年

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");
    });
});

または

$("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/

次の変更時の比較に必要となる前の値のコンテナーとして、非表示の入力タイプを使用しました。


data-prev属性のみを使用して、前の値を格納できます。追加の入力を使用する必要はありません
shukshin.ivan 2015

1

私は同じ問題を抱えていて、このコードを使用して解決しました

HTML

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

最初の3行だけを追加でき、他の部分はオプションです。

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

ここの例:http//jsfiddle.net/XezmB/1303/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.