のonchangeをどのように処理でき<input type="number" id="n" value="5" step=".5" />
ますか?ユーザーが矢印を使用して値を変更する可能性があるため、keyup
またはを実行できませんkeydown
。ぼかしだけでなく、変化するたびに処理したいと思います.change()
。何か案は?
のonchangeをどのように処理でき<input type="number" id="n" value="5" step=".5" />
ますか?ユーザーが矢印を使用して値を変更する可能性があるため、keyup
またはを実行できませんkeydown
。ぼかしだけでなく、変化するたびに処理したいと思います.change()
。何か案は?
回答:
マウスアップとキーアップを使用する
$(":input").bind('keyup mouseup', function () {
alert("changed");
});
input
です)。
input
代わりに(別の回答で示唆されているように)使用する方がうまくいくようです。
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>
$(":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());
});
これはちょっとしたゲットーですが、この方法では、「クリック」イベントを使用して、マウスを使用して入力の小さな矢印を介してインクリメント/デクリメントしたときに実行されるイベントをキャプチャできます。値が実際に変更されない限りロジックが起動しないことを確認する小さな手動の「変更チェック」ルーチンをどのように組み込んだかがわかります(フィールドをクリックするだけで誤検知が発生するのを防ぐため)。
マウスまたはキーがいつ押されたかを検出するには、次のように書くこともできます。
$(document).on('keyup mouseup', '#your-id', function() {
console.log('changed');
});
$(':input').bind('click keyup', function(){
// do stuff
});
input
です)。
$("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>
より良い解決策があるかもしれませんが、これが頭に浮かんだことです:
var value = $("#yourInput").val();
$("#yourInput").on('keyup change click', function () {
if(this.value !== value) {
value = this.value;
//Do stuff
}
});
これが実際の例です。
それは単ににイベントハンドラ結合しkeyup
、change
そしてclick
イベントを。値が変更されたかどうかをチェックし、変更された場合は、次回もチェックできるように現在の値を保存します。click
イベントに対処するには、チェックが必要です。
value
は、問題を引き起こします。
<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
属性のみを使用して、前の値を格納できます。追加の入力を使用する必要はありません
私は同じ問題を抱えていて、このコードを使用して解決しました
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();
});