按键按下的jQuery函数中,退格键不起作用。

3
我实现了一个自动添加空格的函数,如下所示:
+33 6 XX XX XX XX

或者
06 XX XX XX XX

这是脚本代码:
$('#num').keypress(function(){
    $this = $(this);
    //remove whitespaces to calculate the length of the string
    $val = $this.val().replace(/\s+/g, '');
    //if it's the case '+33 6 XX XX XX XX
    if ($val.toLowerCase().indexOf("+") >= 0 | $val == "")
    {
     if($val.length == 3){
            $this.val($this.val() + " ");
        }else if($val.length == 4){
            $this.val($this.val() + " ");
        }else if ($val.length >= 5 && ($val.length)%2 == 0){
            $this.val($this.val() + " ");
        }
    }else{
         if (($val.length)%2 == 0){
            $this.val($this.val() + " ");
        }
    }

});

在chrome上它可以完美工作,但在firefox上我无法使用退格键删除输入的内容.. 有什么想法吗?

这里是一个jsfiddle来说明:

https://jsfiddle.net/jd1mwp3p/


请注意,从用户体验的角度来看,它在Chrome中也并不真正起作用。一个例子是 - 输入一个数字,意识到你颠倒了两个数字。选择它们并尝试以正确的方式覆盖它们 - 就会出现奇怪的情况。 - James Thorpe
哦,没试过这个……这很奇怪,我做错了什么吗? - Baptiste Arnaud
3个回答

1
使用 .keydown,您无需担心是否按下了退格键!因为它将适用于任何按键。

1
你需要过滤掉不可打印的按键事件,以防浏览器触发它们。
例如,对于退格键:
$('#num').keypress(function(e) {
  if(e.keyCode == 8) {
    return true;
  }
  $this = $(this);
  // etc.
}

0

这里有两件事情需要考虑。

第一件事是不同的浏览器对于keypress、keyup和keydown事件的处理方式不同。特别是在涉及到非可打印字符(例如退格键)时,一些浏览器会触发keypress事件,而另一些则不会。Firefox会触发,而Chrome则不会。

现在如果你看一下你的代码,你没有考虑到退格键。实际上,你所做的是,如果没有加号并且值为偶数,则添加一个空格:

else{
         if (($val.length)%2 == 0){
            $this.val($this.val() + " ");
        }
    }

如果值为3、4或5个字符长且存在+或值为空,则再次添加空格:

if ($val.toLowerCase().indexOf("+") >= 0 | $val == "")
    {
     if($val.length == 3){
            $this.val($this.val() + " ");
        }else if($val.length == 4){
            $this.val($this.val() + " ");
        }else if ($val.length >= 5 && ($val.length)%2 == 0){
            $this.val($this.val() + " ");
        }
    }

所以,Chrome忽略了你的按键事件并删除了字符,而Firefox调用了你的事件,但你没有处理退格键。


谢谢,但这不是一个答案!keypresss函数无法处理像退格键这样的非可打印键... - Baptiste Arnaud
退格键的键码应该是8,删除键的键码为46。正如我所提到的,并非所有浏览器都在按下退格键时调用keypress事件,因此我可能会使用keyup事件。 - Nicola Pedretti
你甚至可以保留它,并放置一个if语句来返回如果keycode是8。不触发事件的浏览器仍然可以工作,而触发事件的浏览器将返回结果。 - Nicola Pedretti
@BaptisteArnaud,这个有帮助吗?你找到其他解决方案了吗?如果您解决了,请接受答案或告诉我们您找到的解决方案。 - Nicola Pedretti
1
像你说的那样,我使用按键代码 8 处理了退格键。谢谢,伙计! - Baptiste Arnaud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接