あなたはonchange
イベントについての間違った考え方を持っています。
それは要素の値が変更され、代わりに、それは2つの条件が満たされたときにのみ発火ませ火災ん:
- 要素ぼけが(フォーカスを失いました)。
- 要素は、フォーカスを取得したときとは異なる値を持ちます。
注:上記は入力タイプtext
です。タイプcheckbox
/radio
の場合、checked
プロパティが変更されるとすぐに起動し、選択したオプションが変更されるとすぐにselect
エレメントが発生します。
Chromeのinput type="number"
の上矢印または下矢印を押すと、onchange
イベント(誤っている可能性があります)が発生します。 ではなく、に依存してください。多くの他の主要なブラウザには、数値入力の実装さえありません。この動作には従わないかもしれません。
代わりに、HTML5を使用している場合は、要素の値が更新されるたびに発生するoninput
HTML5イベントを使用する必要があります。
$(function() {
var count = 0;
$('#num').on('input', function(e) {
console.log('update ' + (++count) + ' Value: ' + this.value);
});
});
Fiddle
編集:古い(と非HTML5)ブラウザ用
、あなたはフォールバックとしてkeyup
イベントを使用することがあります。
$('#num').on('input keyup', function(e) {
非HTML5ブラウザでこれを行う最も弾力的な方法はga setInterval
は、要素の値が変更されたかどうかを常に確認しています。はテキストを選択してテキストボックスにドラッグすると起動しません。.on('input keyup mouseup'
を試すことができますが、ブラウザの編集> 。
EDIT2:
あなたがsetInterval
を使用しない場合、あなたは巨大なイベントが.on
/.bind
内マップ置くことができ、値がの.data()
に現在の値を格納することによって変更されているかどうかを確認要素:
var count = 0;
$('#num').on('input keyup change', function(e) {
if (this.value == $(this).data('curr_val'))
return false;
$(this).data('curr_val', this.value);
console.log('update ' + (++count) + ' Value: ' + this.value);
});
Fiddle
私はを追加しました10イベントをイベントマップに追加すると、oninput
とonkeyup
が失敗しても(ブラウザのメニューを使用してデータを貼り付けるHTML5以外のブラウザ)、onchange
イベントは、要素がフォーカスを失ったときにも起動します。
あなたはフォールバックのどちらを使用するかを選択することができますので、ここでは、グローバルを使用しないようにコメントしsetInterval
と.data()
と、最終的な編集です:
$(function() {
var $num = $('#num');
$num.data('curr_val', $num.val()); //sets initial value
var count = 0;
setInterval(function(){
if ($num.data('curr_val') == $num.val()) //if it still has same value
return false; //returns false
$num.data('curr_val', $num.val()); //if val is !=, updates it and
//do your stuff
console.log('update ' + (++count) + ' Value: ' + $num.val());
}, 100); //100 = interval in miliseconds
});
Fiddle
からkeyupカウントなどあれば変更はちょうど変更を使用します – Hassek
'onchange'は、要素がフォーカスを失い、フォーカスを得たときとは異なる値を持つときにのみ起動します。 HTML5の 'oninput'を試しましたか? [フィドル](http://jsfiddle.net/ult_combo/jSjkE/2/) –
@Hassek;あなたが正しいです。入力は 'type =" number "'のために少し複雑です。私は説明するために私の質問を編集します。 – Martijn