キープレスのテキストフィールドの新しい値を確認するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2096828

質問

単一のフォームフィールドがあり、フィールドがいつ変更されて追加のコードを実行するかを検出できる必要があります。 新着 フィールドの価値。キーが実際にテキストボックスの値を変更した場合にのみ、コードを実行したいと思います。これが私が思いついた解決策です。

function onkeypress(e) {
  var value = this.value;
  // do something with 
}

function onkeyup(e) {
  if ( e.which == 8 || e.keyCode == 46 ) { // delete or backspace keys
    this.onkeypress(e);
  }
}

ただし、問題は1つだけです。 Onkeypressは、フィールドの値が更新される前に解雇されるため、値をつかむと、以前の値が得られます。キーが値を変更したかどうかをテストする方法を知っていれば、キーアップのみを使用しますが、一部の文字(矢印キーなど)はフィールドの値に影響を与えません。

何か案は?

役に立ちましたか?

解決

私がこれをする方法は、単にの線に沿って変数を使用することです prevValue. 。キープレス関数の最後に、その変数に値を保存し、値がその前の値に等しくない場合にのみ関数を再度実行します。

他のヒント

これは簡単です、Onkeypressの代わりにKeyUpを使用するだけです

別の条件を持っています:

if(e.keyCode > 31  && e.keyCode < 127) {
    value = this.value + e;
}

これにより、特別なchar範囲の外側のキーボードに入力された低レベルのASCIIシンボルがキャッチされます。

編集:(32はスペースです)

function onkeyup(e) {        
  if ( e.which == 8 || e.keyCode == 46 ) { // delete or backspace keys 
    switch(e.keyCode) {
      case 32:
      case 48..90:
      case 96..111:
      case 188:
      case 190..192: 
      case 219..222:
          value = this.value + e;
          break;
      default: 
          break;
    }       
    this.onkeypress(e);        
  }        
}

これが私の最後のソリューションです。これは、Prevvalue変数を使用しますが、グローバルネームスペース(ウィンドウ)またはDOM要素のプロパティを汚染しません。

(function() {
  var input = document.getElementById('input_box'),
      prevValue;

  input.onkeyup = function(e) {
    if ( this.value != prevValue ) {
      prevValue = this.value;
      // execute some more code here...
    }
  }
}());

上記の場合、OnKeyUp関数は、前Value変数の周りの閉鎖として機能することに注意してください。これにより、名前空間汚染が防止されるため、グローバル変数を作成したり、入力要素自体にプロパティを接続する必要はありません。これは私が得ることができる限りエレガントです。私は実際にjqueryで私のものを書きましたが、答え自体は純粋なJavaScriptであるべきだと思いました...

それは一種のハックですが、以前の値をテキストボックスのプロパティに配置できます(「Expando Attributes」と呼ばれる)

function onkeypress(e) {
  this.oldvalue = this.value;
}

function onkeyup(e) {
  if (this.value != this.oldvalue) {
    // do something
  }
}

古い価値を保存して、それが変更されたかどうかを検出できます。

function keyUpHandle(e) {
  if (this.prevValue && this.prevValue != this.value) {
    // do something
  }
  this.prevValue = this.value;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top