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 属性 placheholder 或拉丁字母以外的值,则会发生 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 回答