変更された入力テキストボックスを検出する


289

私は他の多くの質問を見て、以下のコードを含む非常に単純な答えを見つけました。誰かがテキストボックスのコンテンツを変更したことを検出したいのですが、なんらかの理由で機能していません...コンソールエラーは発生しません。ブラウザーでchange()関数にブレークポイントを設定すると、ヒットしません。

$('#inputDatabaseName').change(function () { 
    alert('test'); 
});
<input id="inputDatabaseName">

1
いくつか試してみてください:入力にtype = "text"を与え、それをシングルトン要素にします。<input id = "inputDatabaseName" type = "text" />
szeliga '27年

いくつかの不要なコードをクリーンアップしましたが、7年では遅すぎました。
Devil's Advocate

回答:


523

次のようにjQueryでinputJavaScriptイベントを使用できます。

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

純粋なJavaScript:

document.querySelector("input").addEventListener("change",function () {
  alert("Input Changed");
})

またはこのように:

<input id="inputDatabaseName" onchange="youFunction();"
onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/>

1
このイベントのドキュメントが見つからないようですが、期待どおりに動作します。ドキュメントページを見つけることができるアイデアはありますか?
ホルヘペドレット2013

3
HTML5イベントのリストで見つけることができます:w3schools.com/tags/ref_eventattributes.aspまたはこちらのhelp.dottoro.com/ljhxklln.php
Ouadie

7
このソリューションは、実際にはキーアップを使用するよりもはるかに優れています。たとえばIEでは、キーアップをトリガーしないXをクリックすることで、ユーザーは入力フィールドをクリアできます。
Georg

7
これまでのところ最も近い解決策ですが、ブラウザがテキストボックスで自動入力を実行しても機能しません。
サウミル

3
これは最初の答えよりもはるかに優れています。Ctrl、Shiftキーはすべてキーアップとしてカウントされます。そして最悪の部分は、高速で入力すると、複数の入力が1つのキーアップイベントとしてのみ登録されることです。
Octref 2014年

173

変更の代わりにキーアップを試してください。

<script type="text/javascript">
   $(document).ready(function () {
       $('#inputDatabaseName').keyup(function () { alert('test'); });
   });
</script>

これが.keyup()の公式jQueryドキュメントです


1
ため息:私は(この質問を見た後、それを試してみました誓うstackoverflow.com/questions/1443292/...それが機能するようになりましたので...しかし、明らかではありません)!
デビルズアドボケイト、

27
changeは、要素がフォーカスを失ったときにのみ発生し、キーボードのキーが離されたときにkeyupが発生します。
Declan Cook、

9
ユーザーがctrl + vを使用するか、選択したテキストをマウスで#inputDatabaseNameにドラッグしてコードを貼り付けるとどうなりますか?それをどのように検出しますか?
Radu Simionescu 2013

5
これの主な問題は、コンテンツが実際に変更された場合でも考慮されないことです。ボタンが押されたことだけ
メトロポリス

@メトロポリス、あなたは私の答えを見ましたか?? stackoverflow.com/a/23266812/3160597
azerafati 14

103

各回答にはいくつかの点が欠けているので、ここに私の解決策があります:

$("#input").on("input", function(e) {
  var input = $(this);
  var val = input.val();

  if (input.data("lastval") != val) {
    input.data("lastval", val);

    //your change action goes here 
    console.log(val);
  }

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">
<p>Try to drag the letters and copy paste</p>

Input Event上の火災キーボード入力、マウスのドラッグオートフィルコピー&ペースト ChromeとFirefoxの上でテスト。以前の値をチェックすると、実際の変更が検出されます。つまり、同じものを貼り付けたり、同じ文字を入力したりしても、発火しないということです。

作業例:http : //jsfiddle.net/g6pcp/473/


更新:

そしてchange function 、ユーザーが入力を完了したときにのみ実行して、変更アクションが何度も実行されないようにしたい場合は、これを試すことができます:

var timerid;
$("#input").on("input", function(e) {
  var value = $(this).val();
  if ($(this).data("lastval") != value) {

    $(this).data("lastval", value);
    clearTimeout(timerid);

    timerid = setTimeout(function() {
      //your change action goes here 
      console.log(value);
    }, 500);
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">

ユーザーが入力を開始すると(例: "foobar")、このコードはユーザーが入力change actionするすべての文字に対して実行するのを防ぎ、ユーザーが入力を停止したときにのみ実行されます。これは、サーバーに入力(例:検索入力)を送信するときに特に役立ちます。 wayサーバーはありません一つだけの検索foobarではなく6を検索しf、その後とfo、その後、fooおよびfoob等々を。


1
これは私が試した約6から動作する最初のものでした。驚くばかり。ありがとう。
Enkode

ほぼIE9で動作します。キャラクターを削除しても、イベントは発生しません。非常に優れた回避策
Soma

@相馬、他の人が言うように「IEを壊すことは欠陥ではありませんそれは機能です」;)IEはもう継続されていませんが、それに対する修正がある場合はお知らせください
azerafati

私は知っていますが、仕事のためにそれをしなければなりませんでした:(実際、私は:を使用します$("#input").focusout(function () {})。入力の外側をクリックすると、イベントが発生します。ChromeとFirefoxの現在のバージョン、およびIE9
Soma

2
@相馬、それがIEが動作する唯一の方法である場合、この行を変更するだけで私の方法でそれを使用できます$("#input").on("input focusout",function(e){
azerafati

18

テキスト入力は、changeフォーカスを失うまでイベントを発生させません。入力の外側をクリックすると、アラートが表示されます。

テキスト入力がフォーカスを失う前にコールバックが発生する必要がある場合は、.keyup()イベントを使用します。


changeここで働いています:jsfiddle.net/g6pcp ; keyup良い方法ではない各キーの後に警告
diEcho

1
@diEchoアラートは彼のコードを機能させるための単なる例だと思います...結局彼が意図することではありません。
Scott Harwell、

@diEchoスコットが言ったことは、それはテスト目的のためだけでした。それが私がデバッグする方法です:D
Devil's Advocate

@スコットではなく、適切なデバッガを使用してくださいalert()。デバッグが非常に簡単になります。
マットボール

13

onkeyup, onpaste, onchange, oninputブラウザがテキストボックスで自動入力を実行すると失敗するようです。このような場合にautocomplete='off'対処するには、テキストフィールドに「」を含めて、ブラウザがテキストボックスを自動入力しないようにします。

例えば、

<input id="inputDatabaseName" autocomplete='off' onchange="check();"
 onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();" />

<script>
     function check(){
          alert("Input box changed");
          // Things to do when the textbox changes
     }
</script>

3

私の場合、日付ピッカーに接続されたテキストボックスがありました。私にとってうまくいった唯一の解決策は、日付ピッカーのonSelectイベント内でそれを処理することでした。

<input type="text"  id="bookdate">

$("#bookdate").datepicker({            
     onSelect: function (selected) {
         //handle change event here
     }
});

0

keydownもあなたが使うことができると思います:

$('#fieldID').on('keydown', function (e) {
  //console.log(e.which);
  if (e.which === 8) {
    //do something when pressing delete
    return true;
  } else {
    //do something else
    return false;
  }
});

-5

ワーキング:

$("#ContentPlaceHolder1_txtNombre").keyup(function () {
    var txt = $(this).val();
        $('.column').each(function () {
            $(this).show();
            if ($(this).text().toUpperCase().indexOf(txt.toUpperCase()) == -1) {
                $(this).hide();
            }
        });
    //}
});

それは別の質問のコードのように見えます...値の大文字化とコンテンツの表示/非表示についてそれは何ですか?
Nico Haase
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.