jquery replace函数在IE中运行奇怪

时间:2012-04-17 12:56:01

标签: jquery regex internet-explorer replace

我有一个文本框(价格),我必须验证它只是数字数据。此外,我不能允许零前面的数字(如01)。所以我使用了带有正则表达式的replace方法。为了替换字母,使用了:

$("#txtPrice").keyup(function(){
    var text=$(this).val();
    $(this).val(text.replace(/[^\d\s\.]/,""));
});

为了替换前面的零,我使用了

$("#txtPrice").keyup(function(){
    var text=$(this).val();
    $(this).val(text.replace(/^0+/, ''));
 });

它在firefox上工作正常,但在IE中表现得很奇怪。

如果我在数字前添加一个新数字,它会将新数字添加到数字的末尾。例如,如果我将“56”编辑成“156”,则在形成“561”的末尾添加数字1。如果尝试将任何数字放在前面,它实际上被添加到文本字段的末尾。怎么能解决这个问题?

1 个答案:

答案 0 :(得分:0)

我相信你所经历的并不是因为你在输入的开头放置1并且IE在最后拍打它,但IE实际上并不允许你的光标移动到输入的前面。它捕获箭头/主页键操作并触发键盘,执行两个正则表达式,并替换文本。

您可能需要做的是评估检测到的密钥是什么,只有在与实际角色匹配时才对其执行操作感到烦恼。

like this能解决您的情况吗?

$("#txtPrice").keyup(function(event) {
    // avoid triggering on control characters; FF ignores but IE will execute and possibly confuse
    if (event.which > 40) {
        var text = $(this).val();
        $(this).val(text.replace(/^0+/, ''));
        $(this).val(text.replace(/[^\d\s\.]/,""));
    }
});

你可能不得不对event.which > 40做一些例外,我不完全确定如何让用户的光标停留在他们按下按键的位置,但我认为这可能是一个充分的解决方案对你而言。

编辑:我将正则表达式合并为一个;见更新jsfiddle

$(this).val(text.replace(/(^0+|[^\d\s\.])/, ""));

编辑:如果您希望光标“尽可能少地跳转”,那么当您已经验证该文本匹配时,您可以选择替换非法文本。 Here is a demonstration

if ($(this).val().match(/(^0+|[^\d\s\.])/)) {
    $(this).val(text.replace(/(^0+|[^\d\s\.])/, ""));
}

您也可以将正则表达式推断为变量,就像我在小提琴中所做的那样。