web-dev-qa-db-ja.com

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

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

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

このようにjQueryのようにoninputイベントを使用することができます:

$('#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();"/>
461
Ouadie

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

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

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

169
Scott Harwell

それぞれの答えにはいくつかの点が欠けているので、これが私の解決策です:

$("#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ユーザーが入力を終えたときのみを実行して、changeアクションを何度も実行しないようにするには、次のようにします。

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がすべてのレターユーザータイプに対して実行されるのを防ぎ、ユーザーがタイピングを止めるときにのみ実行されます。そのようにして、サーバーは1つだけを検索してfoobarを検索し、6回はfを検索してからfoを検索し、次にfooおよびfoobを検索しません。

98
azerafati

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

テキスト入力がフォーカスを失う前にコールバックが起動するべきなら、 .keyup() イベントを使用してください。

13
Matt Ball

ブラウザがテキストボックスに自動入力を実行すると、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>
13
Saumil

私の場合、日付ピッカーに添付されたテキストボックスを持っていました。私のために働いた唯一の解決策はdatepickerのonSelectイベントの中でそれを扱うことでした。

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

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

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;
  }
});
0
Yoosaf Abdulla