使用JavaScript替换点会删除所有内容

使用JavaScript替换点会删除所有内容,javascript,jquery,regex,Javascript,Jquery,Regex,我遇到了一个奇怪的问题。当尝试替换数字输入上的点时,它会清除整个输入,而不是仅替换该点 $(“[data input payment id]”)。在(“keyup”上,函数(e){ var test_value=$(this).val().replace(/\./g,“”); $(此).val(测试值); }); 这并不是我个人希望看到的真正的解决方案,但以下是我为解决手头的问题所做的。我将JavaScript代码更改为侦听keycode46(即),并在粘贴事件侦听器上返回false,以禁用将

我遇到了一个奇怪的问题。当尝试替换数字输入上的点时,它会清除整个输入,而不是仅替换该点

$(“[data input payment id]”)。在(“keyup”上,函数(e){
var test_value=$(this).val().replace(/\./g,“”);
$(此).val(测试值);
});

这并不是我个人希望看到的真正的解决方案,但以下是我为解决手头的问题所做的。我将JavaScript代码更改为侦听keycode46(即
),并在粘贴事件侦听器上返回false,以禁用将值粘贴到输入中

$(“[data input payment id]”)。在(“按键”,功能(e){
var key=e.charCode?e.charCode:e.keyCode;
如果(键==46){
返回false;
}
});
$(“[data input payment id]”)。在(“粘贴”上,函数(e){
返回false;
});

我认为(猜测)这是因为您使用了
type=“number”
。然后,后跟点的数字(例如,
123.
)不是有效数字,
val
返回空白

您可以尝试以下方法:

$(“[data input payment id]”)。在(“keyup”上,函数(e){
var test_value=this.value.replace(/[^\d,]/g,”);
$(此).val(测试值);
});

$(this).val()返回一个空字符串,如果带有
type=“number”
的输入有多个

如果
$(this).val()
不返回空字符串,则只需运行替换值即可解决此问题。

请参见
输入
类型的s
编号

价值观

表示数字的数字,或为空

如果无法将输入字符串转换为正确的数字(例如字符串包含两个点),则访问
.value
属性将返回空字符串

.value
(和
val()
函数)仍将返回字符串,但这些字符串必须表示有效数字(或为空字符串)。与其无条件地设置元素的值,不如先检查该值是否为空字符串:

$(“[data input payment id]”)。在(“keyup”上,函数(e){
const val=$(this.val();
如果(val=='')返回;
var test_value=$(this).val().replace(/\./g,“”);
$(此).val(测试值);
});

我会:

  • 收听
    输入
    事件,而不是
    键控
    事件。这样也可以允许粘贴
  • 保留上一个正确值的记录,以便可以回滚到该值。这是必要的,因为一旦输入无效(作为数字),输入将有一个空字符串作为值。我会将之前正确的值存储在
    input
    元素的数据属性中
  • 使用属性
    validity.stepmasch
    可以知道当前值是否违反
    输入的
    step
    属性,默认值为1。步骤为1时,这意味着输入带有十进制分隔符的数字将被视为不匹配
  • 由于尾随的十进制分隔符(尚未)不会产生小数,因此它将通过上述验证。因此,当一切正常时,将值回显到输入中:这将消除可能输入的任何尾随小数分隔符
$(“[data input payment id]”)。在(“input”上,函数(e){
if(!this.validity.stepmatch){
$(this.data(“lastValid”,$(this.val());
};
$(this.val($(this.data(“lastValid”)| |“”);
});

您的按键示例给了我这个想法。如果可以截获按键事件,则可以在添加实际值之前检查任何验证。此示例也不需要任何条件,并且能够过滤任何非数字值

$(“[data input payment id]”)。在(“按键”,功能(e){
如果((this.value+e.key).match(/\D/)){
返回false;
}
});
$(“[data input payment id]”)。在(“粘贴”上,函数(e){
var pasteData=(e.originalEvent.clipboardData | | window.clipboardData).getData('text');
pasteData=pasteData.replace(/\D/g');
this.value=this.value+粘贴数据;
返回false;
});


在firefox、chrome和edge中运行良好-您不能使用internet explorer,因为这样您就不会在firefox中使用JSFIDDLE,如果按住
,您将得到您想要的describe@JaromandaX如果你在一张纸上键入2个点,看起来会断裂row@JaromandaX我在chrome中测试这个,它不适用于meLooks,比如如果你在type=number中使用无效的数字,
this.value
将返回一个空白字符串-可能已连接:-而不是删除点,为什么不阻止他们输入dots@Alnitak这不是一个好的解决方案,但不是每个解决方案都是一个好的解决方案。请务必从粘贴的数据中删除“.”,但禁用标准操作是不好的,特别是对于辅助功能用户。您可能还需要侦听-(减号)键和+(加号)键,因为数字字段中也允许这些值,并且可能导致相同的问题。另外,请注意,这些键的Numpad版本的键代码是不同的。此外,当输入为
number
类型时,可以键入
e
。我已修改了您的解决方案,使其可以使用粘贴和无条件,并且还可以防止任何额外字符,例如
e
+
-
。如果键入
123..
,则会出现原始问题-因此,请尝试在您的代码中。。。一旦你有了
在那里,你可以输入123..1.2.3.4.5.6如果你想:p问题是它没有考虑逗号,这是什么意思?删除任何逗号。这不是你想做的吗?不,我想删除点,而不是逗号挑剔:这个解决方案不允许用户