使用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问题是它没有考虑逗号,这是什么意思?删除任何逗号。这不是你想做的吗?不,我想删除点,而不是逗号挑剔:这个解决方案不允许用户