在keyup中设置输入值,停止触发更改事件

时间:2011-12-05 07:54:44

标签: javascript jquery

新小提琴:http://jsfiddle.net/martinnormark/jBZfs/14/ - 新的孤立示例。了解Amount 2如何触发更改事件! **

我有一个jQuery插件,用于在输入时格式化货币格式的数字。

你可以在这个小提琴中看到它:http://jsfiddle.net/martinnormark/Rv4Ug/1/

问题是,如果输入至少4位数的值(导致需要千位分隔符:1178变为1,178),则更改事件将终止。只要您保持低于4位数而不会导致新格式,就会触发更改事件。

在小提琴中,尝试输入12,然后输入123.你应该看到一个文字,上面写着“改变事件”。然后输入1234 - 并且不会触发更改事件。

这将与在keyup事件处理程序中操作input元素的值有关:

$this.on("keyup.autoformatcurrency", function(event) {
    if ($.inArray(event.keyCode, keyCodes) > -1) {
        formatCurrency($(this), true);
    }
});

formatCurrency函数:

function formatCurrency($this, setCaretPosition) {

    var rawValue = $this.val(),
        floatValue = Globalize.parseFloat(rawValue);

    if ($.isNumeric(floatValue)) {
        var formattedValue = Globalize.format(floatValue, settings.formatString),
            caretPosition = 0;

        if (setCaretPosition) {
            caretPosition = $this.caret().end + (formattedValue.length - rawValue.length);
        }

        $this.val(formattedValue);

        if (setCaretPosition) {
            $this.caret(caretPosition, caretPosition);
        }
    }

}

(完整来源,请参阅Github上的文件:https://github.com/martinnormark/jquery-format-currency/blob/master/src/jquery.formatcurrency.js

问题是,如果有办法确保更改事件会被触发?

更新 - 浏览器中的当前状态
Chrome :如果数字低于4位,则更改事件 Safari,IE :只要以编程方式设置值,就不会触发更改事件。输入字母而不是数字将触发更改事件 Firefox :正常工作!
Opera :有效!

1 个答案:

答案 0 :(得分:1)

最简单的方法是从keyup函数中触发change事件:

$this.on("keyup.autoformatcurrency", function(event) {
    if ($.inArray(event.keyCode, keyCodes) > -1) {
        formatCurrency($(this), true);
        $(this).change();
    }
});