2013-08-20 193 views
5

概述:onchange事件不火

我正在写一个jQuery插件,它的文本框转换成时间输入框。这意味着它允许用户以HH:MM格式输入时间。这个过程的一部分是在正确的地方插入冒号(:)。在keyup上,我检查用户是否输入了2个数字,如果是这样,则在输入的值上附加冒号。

问题:

这种方法工作得很好,当有人适用于文本框插件除外,但也希望有一个自定义的onchange handler.This onChange处理时的代码更新文本框的值不火也不编程当文本框失去焦点时它会启动吗?

我的理解:

我猜在这里,所以请纠正我,如果我错了。

  • 也许文本框有一个内部"_value"(强调从公共值属性 分化)的编辑开始之前保持在文本框中 值字段。当焦点离开文本框 时,JS引擎会检查文本框 的当前值是否与文本框的"_value"匹配。如果它们不同,则会触发该事件。
  • 使用普通原生键击可能会改变数值,但不会修改 "_value"只是值,所以onchange被触发。但也许 值更改通过JS修改值和"_value"和 所以onchange事件不会触发?

的变通办法:

模糊事件触发,因为它没有任何关系与价值。所以我可以明确地从模糊事件中引发更改事件。但我不想这样做,因为它是黑客攻击并打破了模糊和更改的语义。

相关链接:

我发现有这么几种链路使用相同的问题,但没有答案(恕我直言)给出了一个优雅的或正确的解决方案。 这里有一些我看到的国家:

简化的代码:

$(document).ready(function() { 
    $("input").keyup(function() { 
     this.value = '*' + this.value; 
     // this changes the value, but does not fire the onchange event 
     // and it also does not fire it when the textbox loses focus. 
     // blur fires though. 
    }); 
    $("input").change(function() { 
     alert('in change'); 
    }); 

    $("input").blur(function() { 
     alert('in blur'); 
    }); 
}); 

FIDDLE:

http://jsfiddle.net/sajjansarkar/vHgst/4/

浏览器上测试: IE8,10和Chrome。 在Firefox(!!)(+1费利克斯·克林)

+0

,如果设置'ele.value的变化不会触发事件'是通常的行为。仅供参考,在模糊输入失去焦点后,Firefox中会触发'change'事件。 –

+0

@FelixKling如果是平常的行为,我该如何保留onchange行为?有趣的观察,它在FF工作,将编辑问题 –

回答

1

您可以jquery.trigger编程触发事件: http://jsfiddle.net/vHgst/5/

$(this).trigger('change'); 
+0

是的,但是我什么时候调用它来模仿正确的更改事件?你的例子会为每个keyup调用onchange –