1

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

$("#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”,则在末尾添加数字 1,形成“561”。如果尝试将任何数字放在前面,则实际上将其添加到文本字段的末尾。如何解决这种行为?

4

1 回答 1

0

我相信您所经历的并不是您将 1 放在输入的开头而 IE 在末尾拍打它,而是 IE 实际上并没有让您的光标移向输入的前面。它正在捕获箭头/home键操作并触发keyup,执行两个正则表达式,并替换文本。

您可能需要做的是评估检测到的密钥是什么,并且只有在它与实际字符匹配时才对它进行处理。

这样的事情是否解决了您的情况?

$("#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\.])/, ""));

编辑:如果您想让光标尽可能少地“跳来跳去”,那么当您已经验证该文本匹配时,您可以选择替换非法文本。这是一个演示

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

您还可以像我在小提琴中所做的那样将正则表达式外推到一个变量中。

于 2012-04-17T14:01:38.943 回答