更改占位符会触发IE 10中的输入事件

时间:2013-08-22 19:57:33

标签: javascript jquery

基本问题

input事件 - 调用 - > update() - 调用 - > geoInput.receive() - 触发器 - > 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中按预期工作。

3 个答案:

答案 0 :(得分: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');
});

答案 1 :(得分: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);

答案 2 :(得分:-1)

检查事件keycode / charcode是否为0然后它是IE愚蠢的你可以取消该事件。