2

基本問題

inputイベント --calls--> update()--calls--> geoInput.receive()--triggers-->inputイベント

説明

さて、コードが無限にループする奇妙な問題に遭遇しました。私は次のようなjQueryを持っています:

var geoInput = $('#Geo').on('input', function() {
  _this._controller.update({
    geo: this.value
  });
}).get(0);

ご覧のとおり、これは単なる基本的なイベント リスナーであり、コントローラーで更新関数を呼び出しています。更新関数の最後には、更新するgeoInputフィールドをブロードキャストするメソッドがあります。これは、次によって処理されます。

geoInput.receive = function(formState) {
  this.value = formState.geo;
  this.placeholder = _this._placeholders.geo;
}

何らかの理由で

this.placeholder = _this._placeholders.geo; 

inputそのフィールドでイベントをトリガーしています。これにより無限ループが作成されるため、これがどのように問題になるかがわかります。returnその行の前にループが発生しないため、これが起こっていると確信しています。また、keyupイベントと言えばループも発生しません。

質問

なぜこれが起こっているのですか、どうすれば修正できますか?

私はもう試した!

私はこれを何時間も見て、かなりの数の検索を無駄にしました. このコードは、Chrome と FF で期待どおりに機能します。

4

3 に答える 3

1

おもしろいことに、ラテン アルファベット以外の INPUT 属性のプレースホルダまたは値にアイテムを追加するだけで INPUT イベントが発生します。IE10とIE11の問題です

var $input = $('<input type="text" placeholder="Бубу"/>');
//or
var $input = $('<input type="text" value="世界へようこそ"/>');
$input.on('input',function(){
    alert('input even occur');
});
于 2016-02-17T12:21:12.417 に答える
0

あなたのフィドルを見なくても、このコードで問題を解決できると思います:

var previousGeoInput = '';
var geoInput = $('#Geo').on('input', function() {
  if (previousGeoInput === this.value) {
    return;
  }
  previousGeoInput = this.value;
  _this._controller.update({
    geo: this.value
  });
}).get(0);
于 2013-08-23T22:44:06.470 に答える
-1

イベントのキーコード/文字コードを確認して、0 の場合は IE が愚かであり、イベントをキャンセルすることができます。

于 2013-12-06T21:51:48.567 に答える