jQueryで<input type =“ text”>のonchangeを実装するにはどうすればよいですか?


回答:


219

使用できます .change()

$('input[name=myInput]').change(function() { ... });

ただし、このイベントはセレクタがフォーカスを失ったときにのみ発生するため、この作業を行うには別の場所をクリックする必要があります。

それが適切でない場合は、希望する正確な効果に応じて、keyupkeydownkeypressなどの他のjQueryイベントを使用できます。


残念ながら、これは非表示の入力に対しては機能しません。隠された入力にのonchangeを必要と可能な解決策はありません:<入力タイプ=「テキスト」スタイル=「表示:なし」/>(CSS付き)...
NickGreen

303
changeは、入力要素がフォーカスを失ったときにのみ起動することに注意してください。inputフォーカスを失うことなくテキストボックスが更新されるたびに発生するイベントもあります。キーイベントとは異なり、テキストの貼り付け/ドラッグにも機能します。
pimvdb 2012

4
素晴らしいコメント@pimvdb。これを使って、この質問の答えに変えました。
iPadDeveloper2011 2012

1
私がこれを試していて、このイベントが発生するのは、次の2つの条件が満たされた場合のみであることを学習しました。1)値の変更。そして2)ぼかし、多くの人がchange()に期待することはkeyup()でよりよく処理されるのだろうか?
TARKUS

以下のようchangeIE9でサポートされていない、あなたが使用することができfocusout、同じ振舞に持っている
相馬

247

@pimvdbがコメントで言ったように、

変更は、入力要素がフォーカスを失ったときにのみ発生することに注意してください。テキストボックスがフォーカスを失う必要なしに更新されるたびに発生するinputイベントもあります。キーイベントとは異なり、テキストの貼り付け/ドラッグにも機能します。

ドキュメントを参照。)

これは非常に便利なので、答えに入れる価値があります。現在(v1.8 *?)jqueryには.input()便利なfnがないので、それを行う方法は

$('input.myTextInput').on('input',function(e){
 alert('Changed!')
});

6
特に、IE <9はまったくサポートしていません。
dlo 2013

13
複数のイベントにバインドできるので$('form').on('change input', function);、私にとってはトリックでした。ありがとう。
justnorris 2013

9
@Norris。要素が変更されると(2回目)、おそらく2回起動し、フォーカスを失います(2回目)。それは多くの目的にとって問題ではありませんが、それでも注目に値します。
iPadDeveloper2011 2013年

IE9でテスト、バックスペースは発生しません
Jaskey 2015

これは、入力の変更が行われるたびに発生します(探しているものである可能性があります)。あなたは「完了したら変更」などのイベントを探しているなら、ここでは良い例です
Trevor Nestman、2016

79

以下のようなキーアップイベントを使用することをお勧めします。

$('elementName').keyup(function() {
 alert("Key up detected");
});

同じ結果を得るにはいくつかの方法がありますので、それは好みによるものであり、正確に機能させる方法に依存すると思います。

更新:これは手動入力でのみ機能し、コピーと貼り付けはできません。

コピーと貼り付けについては、次のことをお勧めします。

$('elementName').on('input',function(e){
 // Code here
});

私はこれをテキスト入力に間違いなくお勧めします!
Vercas

20
input要素の内容は、キーアップを起動せずに変更できます。たとえば、マウスを使用してテキストを貼り付けることができます。
celicni 2012

また、チェックボックスをキャプチャするには変更が必要と思われます
turbo2oh

30

これが私が使用するコードです:

$("#tbSearch").on('change keyup paste', function () {
    ApplyFilter();
});

function ApplyFilter() {
    var searchString = $("#tbSearch").val();
    //  ... etc...
}

<input type="text" id="tbSearch" name="tbSearch" />

これは、特にjqGridコントロールとペアになっている場合、非常にうまく機能します。テキストボックスに入力するだけで、すぐに結果をで表示できますjqGrid


22

これを行う信頼できる方法1つだけですには、は、間隔で値を取得し、それをキャッシュされた値と比較することです。

これが唯一の方法である理由は、さまざまな入力(キーボード、マウス、貼り付け、ブラウザの履歴、音声入力など)を使用して入力フィールドを変更する方法が複数あり、標準のイベントを使用してすべてをクロスで検出できないためです-ブラウザ環境。

幸い、jQueryのイベントインフラストラクチャのおかげで、独自のinputchangeイベントを簡単に追加できます。ここでそうしました:

$.event.special.inputchange = {
    setup: function() {
        var self = this, val;
        $.data(this, 'timer', window.setInterval(function() {
            val = self.value;
            if ( $.data( self, 'cache') != val ) {
                $.data( self, 'cache', val );
                $( self ).trigger( 'inputchange' );
            }
        }, 20));
    },
    teardown: function() {
        window.clearInterval( $.data(this, 'timer') );
    },
    add: function() {
        $.data(this, 'cache', this.value);
    }
};

次のように使用します。 $('input').on('inputchange', function() { console.log(this.value) });

ここにデモがあります:http : //jsfiddle.net/LGAWY/

複数の間隔が怖い場合は、このイベントをfocus/でバインド/バインド解除できますblur


コードを次のように機能させることは可能$('body').on('inputchange', 'input', function() { console.log(this.value) });ですか?かどうか、ここで言及されているように:github.com/EightMedia/hammer.js/pull/98
TheFros 2013

13
このようなコードを記述して起動することは、パフォーマンスに極端な影響を与える狂気です。
ダニューブセーラー

@ŁukaszLech教えてください。ただし、前述したようにフォーカス/ぼかしイベントを実行すると、間隔は一時的にのみ実行されます。確かに、1988年のIntel 386でも1つの間隔を処理できますか?
David Hellsing 2013

5
<input id="item123" class="firstName" type="text" value="Hello there" data-someattr="CoolExample" />

$(".firstName").on('change keyup paste', function () {
   var element = $(this);
   console.log(element);
   var dataAttribute = $(element).attr("data-someattr");
   console.log("someattr: " + dataAttribute );
});

this要素全体にアクセスできるように、キーワードを使用して、この要素で必要なすべてを実行できるようにすることをお勧めします。


4

以下は、動的/ Ajax呼び出しであっても機能します。

脚本:

jQuery('body').on('keyup','input.addressCls',function(){
  console.log('working');
});

HTML、

<input class="addressCls" type="text" name="address" value="" required/>

この作業コードが動的/ Ajax呼び出しにアクセスしようとしている人を助けることを願っています...



2

あなたは単にIDで作業することができます

$("#your_id").on("change",function() {
    alert(this.value);
});

これは既存の答えに多くを追加しません。
2017年

2

これはさまざまな方法で行うことができますが、キーアップはその1つです。しかし、私は変更時に以下の例を挙げています。

$('input[name="vat_id"]').on('change', function() {
    if($(this).val().length == 0) {
        alert('Input field is empty');
    }
});

注:input [name = "vat_id"]は、入力IDまたは名前に置き換えます。


2

入力中にイベントをトリガーする場合は、以下を使用します。

$('input[name=myInput]').on('keyup', function() { ... });

入力フィールド離れたときにイベントをトリガーする場合は、以下を使用します。

$('input[name=myInput]').on('change', function() { ... });

何らかの理由でこれはうまく$(document).on('change', 'input[name=myInput]', function() { ... });
Stefan

1
@Stefan、あなたの例のコードはイベント委譲と呼ばれます。入力フィールドは、ページの初期化後に追加されている必要があります。そのため、私のコードは機能しませんでした。
ウスマンアーメド


1

これでうまくいきました。fieldAという名前のフィールドがクリックされるか、キーが入力されると、フィールドがID fieldBで更新されます。

jQuery("input[name='fieldA']").on("input", function() {
    jQuery('#fieldB').val(jQuery(this).val());
});

0

使用できます.keypress()

たとえば、HTMLについて考えます。

<form>
  <fieldset>
    <input id="target" type="text" value="Hello there" />
  </fieldset>
</form>
<div id="other">
  Trigger the handler
</div>

イベントハンドラーは入力フィールドにバインドできます。

$("#target").keypress(function() {
  alert("Handler for .keypress() called.");
});

私はアンディに完全に同意します。すべては、それがどのように機能するかによって異なります。


1
これはコピー/貼り付け操作では機能しません。マウスクリックでテキストが貼り付けられた場合、イベントは発生しません。
DaveN59 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.