jQueryで入力の変更を検出していますか?


359

イベントでjquery .changeを使用inputすると、入力がフォーカスを失ったときにのみイベントが発生します

私の場合、入力値が変更されたらすぐにサービスを呼び出す(値が有効かどうかを確認する)必要があります。どうすればこれを達成できますか?


3
どんな入力?テキストボックス?チェックボックス?無線?textarea?これまでに思いついたことを見てみましょう
パトリシア

テキストの入力です。そして言ったように、私は変更を試みましたが、これは私が必要とする方法を起動しません(入力のテキストのすべての変更に対して)。私もキーダウンを試しましたが、これを機能させるには、入力が「ダーティ」かどうかを追跡する必要があります。
Banshee

2
キーを押している場合は、99%の確率で変化するため、イベントハンドラーにないキーを常に確認できます。
パトリシア

回答:


545

説明と例のために更新

例:http : //jsfiddle.net/pxfunc/5kpeJ/

方法1. inputイベント

最新のブラウザではinputイベントを使用します。このイベントは、ユーザーがテキストフィールドに入力、貼り付け、元に戻す、基本的に値が別の値に変更されたときに発生します。

jQueryでこれを次のようにします

$('#someInput').bind('input', function() { 
    $(this).val() // get the current value of the input field.
});

jQueryの1.7で始まる、置き換えるbindon

$('#someInput').on('input', function() { 
    $(this).val() // get the current value of the input field.
});

方法2. keyupイベント

古いブラウザではkeyupイベントを使用します(これはキーボードのキーが離されると発生します。 "w"が離されると入力値が変更されてkeyupイベントが発生するため、このイベントは一種の誤検知を引き起こす可能性があります。「shift」キーを放すとkeyupイベントが発生しますが、入力は変更されていません。また、ユーザーがコンテキストメニューから右クリックして貼り付けた場合も、このメソッドは起動しません。

$('#someInput').keyup(function() {
    $(this).val() // get the current value of the input field.
});

方法3.タイマー(setIntervalまたはsetTimeout

制限を回避するためにkeyup、入力の値を定期的にチェックして値の変化を判断するようにタイマーを設定できます。setIntervalまたはsetTimeoutを使用して、このタイマーチェックを実行できます。このSOの質問に著しい答えを参照してください:jQueryのテキストボックスの変更イベントをまたは使用して実施例のためのフィドルを参照focusしてblur、特定の入力フィールドのためのタイマーを起動および停止するイベント


このソリューションについて詳しく説明していただけますか?現在の値を取得するにはどうすればよいですか?現在の値に変更が加えられた場合にのみ実行するにはどうすればよいですか?
Banshee

入力イベント?jQuery(まだ)に入力イベントはありません... stackoverflow.com/q/11189136/104380
vsync

方法2では、通常、キーアップ変更の両方にバインドします。このように、キーを押すことなく入力(ペーストなど)が行われる状況では、入力がフォーカスを失ったときに少なくともイベントが発生します。
rspeed 2013

1
@AdiDarachi MutationObserverは、DOM要素への変更を追跡します。ただし、ユーザーが入力フィールドのデータを変更しても、MutationObserverの変更はトリガーされません...テストケースをセットアップし、innerTextまたはvalue属性へのJSコードの変更(ユーザー入力のシミュレーション)のみがMutationObserverイベントjsfiddle.net/pxfunc/をトリガーします04chgpws / 1(MutationObserverイベントログについては、console.logを参照してください)。私が見ることができる別のテストケースはありますか?
MikeM 2016

1
スクリプトが値を変更すると、これは機能しません
FalcoGer

189

HTML5がある場合:

  • oninput (実際に変更が発生したときにのみ発生しますが、すぐに発生します)

それ以外の場合は、入力要素の値の変更を示す可能性のあるこれらすべてのイベントを確認する必要があります。

  • onchange
  • onkeyupない keydownkeypress、入力の値にまだ新しいキーストロークが含まれていないため)
  • onpaste (サポートされている場合)

そして多分:

  • onmouseup (これについてはわかりません)

私のテストによる@naomikは、チェックボックス入力に対して機能します。IE / Edgeを除く。他のいくつかの例外が表示される場合がありますが、これらの入力タイプ(IMHO)に対してonchangeを使用する方が賢明です。
HellBaby 2017年

82

HTML5を使用し、jQueryを使用しない場合は、inputイベントを使用できます。

var input = document.querySelector('input');

input.addEventListener('input', function()
{
    console.log('input changed to: ', input.value);
});

これは、入力のテキストが変更されるたびに発生します。

IE9 +およびその他のブラウザーでサポートされています。

ここjsFiddleでライブしてみてください。



1
'change'は、テキストが変更されたときではなく、ブラーでのみ発生します。'input'イベントを使用して、テキストの変更を検出します。
Dermot Doherty 2017年

14

他の人がすでに示唆したように、あなたの場合の解決策は複数のイベント嗅ぐことです。
この作業を行うプラグインは、多くの場合、次のイベントをリッスンします。

$ input オン'keydown keypress keyup keydown mousedown click mouseup' ハンドラーを変更);

収まると思われる場合はfocusblurやその他のイベントも追加できます。
ユーザーの行動に応じて実行する追加のプロシージャがブラウザのメモリに読み込まれるため、イベントをリッスンしないでください。

注意: JavaScriptで(jQuery .val()メソッドなどを使用して)入力要素の値を変更しても、上記のイベントは発生しません。
(参照: https : //api.jquery.com/change/)。


オートコンプリートの問題を回避するために、フォーカスアウトを追加することもお勧めします
binar

そうですか。検索したところ、focusoutはIEでのみサポートされており、一部はChromeでサポートされているようです。
Emanuele Del Grande

5
穏やかな追加と同様に、jQueryからイベントを発生させる.val()には、入力フィールドの変更イベントなどの後に対応するアクションを呼び出すことができます。次のようにします... $('#element').val(whatever).change()
techknowcrat

2

要素内で何かが変更されるたびにイベントを発生させたい場合は、keyupイベントを使用できます。


わかりましたが、これは多かれ少なかれキーダウンと同じではありませんか?入力が「ダーティ」かどうかを自分で確認する必要がありますか?
Banshee

@SnowJim入力が実際に変更されたときにのみ処理したい場合は、を使用するかonchange、状態を自分で追跡する必要があります。 入力の状態が変更される前keydownに発生するため、機能しません。
Alnitak

@Alnitakはまさしくそれが私がここで質問をする理由です。onchangeは機能していません。入力を終了するときにのみスローされます。
Banshee 2011年

部屋の中の象はもちろん移動式です。そこではキーボードやマウスのイベントがあまり役に立たないことを確認してください。:p
Askdesigners 2014年

@Askdesigners Keyup / downイベントは、モバイルでも同じように機能するはずです。
Jivings 2014年

2

// .blurは、要素がフォーカスを失ったときにトリガーされます

$('#target').blur(function() {
  alert($(this).val());
});

//手動でトリガーするには:

$('#target').blur();

1
.changeは、inoutがフォーカスを失って値が変更された場合にのみスローされると述べたとおり、input(text)が変更された直後(入力のテキストが変更された直後)にも取得する必要があります。ブラーは、入力がフォーカスを失ったときにのみトリガーされます。
Banshee

1

入力HTML要素で使用できるkeyupkeypressなどのjQueryイベントがあります。さらに、blur()イベントを使用することもできます。


1
.changeは、inoutがフォーカスを失って値が変更された場合にのみスローされると述べたとおり、input(text)が変更された直後(入力のテキストが変更された直後)にも取得する必要があります。ブラーは、入力がフォーカスを失ったときにのみトリガーされます。
Banshee

1
keypress押されたキーはまだその値を変更していないため、イベント中に入力の値を確実にチェックすることはできません。
Alnitak

0

これは、jQuery 1.7以上を使用した入力に対するすべての変更をカバーします。

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