为什么这个正则表达式在Firefox中输入逗号时会清除所有字符?

时间:2015-12-01 00:59:15

标签: javascript regex html5

我想使用数字类型输入字段,但如果输入了美元符号,则会删除美元符号(对于不是Chrome的浏览器)。

但是使用下面的代码,如果我输入300或300等,它会清除我的所有条目。

发生了什么?



jQuery( 'input' ).keyup( function( ) {
  this.value = this.value.replace(/\$/g, '*');
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="number">
&#13;
&#13;
&#13;

3 个答案:

答案 0 :(得分:2)

浏览器不允许您将输入值设置为无效字符串。字符串100,对于输入类型编号无效。 Please see the W3 documentation

答案 1 :(得分:2)

你的代码的表现方式不是因为你的正则表达式,而是因为&#34;数字&#34;当输入不是有效数字时,输入为空字符串。

因此,您输入1 ... 2 ... 3,一切正常。但是如果你点击,,表达式

this.value

突然变成空字符串。 .replace()电话实际上没有做任何事情,但您将结果重新分配回this.value,以便将其删除。

因此,您可以在代码中添加测试:

jQuery( 'input' ).keyup( function( ) {
  if (this.value.length)
    this.value = this.value.replace(/\$/g, '*');
});

然而,这对你没有任何好处,因为如果一个人 输入$,你就会找回空字符串而你无法修复它。你无法区分一个&#34;数字&#34;之间的JavaScript差异。输入真的为空,并且其中包含浏览器不认为的文本的文本是一个很好的数字。

答案 2 :(得分:2)

这是因为,当您设置value时,会调用value sanitization algorithm。对于number inputs

  

值清理算法如下:如果值为   element不是有效的浮点数,然后将其设置为空   而不是字符串。

由于300,不是有效数字,因此输入将被清除。

然后,更好的方法是阻止它们被写入,而不是替换字符:

&#13;
&#13;
jQuery('input').keydown(function(e) {
  if(e.key == '$' || e.which == 52 || e.keyCode == 52) e.preventDefault();
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="number">
&#13;
&#13;
&#13;