1

我有一些代码基本上如下

.on("keyup", "input", function (e) {
    this.value = utils.formatNumber(this.value);                    
})
.on("change", "input", function(e) {
    expensiveFunctionThatUpdatesView();
})

实际上,这些值在用户键入时被正确格式化,但是当用户选择或单击离开输入字段时,不会触发 onChange 事件(因此不会更新视图)。如果我注释掉 keyup 事件处理函数的主体,一切都会按预期工作(格式化除外)。为什么会这样?

AFAIK,要触发 onchange 事件需要满足两个条件:

  1. 必须通过触发 onfocus 事件(存储旧值)的东西进入控制/输入字段。
  2. 存在于焦点上的值与存在于“退出”/模糊上的值不同

顺便说一句,我尝试将代码更改为“模糊”,但是如果我格式化该字段也不会触发。测试时使用 Chrome。

4

2 回答 2

1

通过 javascript(或 jQuery 通过val()/ text())设置文本框值永远不会触发浏览器更改事件。您需要保存原始值,将其与后格式值进行比较,并以编程方式触发更改:

.on("keyup", "input", function (e) {
    var originalValue = this.value;
    var newValue = utils.formatNumber(originalValue);

    this.value = newValue;

    if (originalValue !== newValue) {
        $(this).trigger('change');
    }
})
于 2012-10-23T13:30:46.660 回答
0

您可以为这两个事件触发相同的回调函数以启用数字格式:

.on( 'keyup change', 'input', function ( e ) {
    this.value = utils.formatNumber( this.value );
    updateView();
})
于 2012-10-23T12:59:41.403 回答