仅允许数字和 ctrl+a 、 ctrl+v 、 ctrl+c 到文本框
Allow only numbers and ctrl+a , ctrl+v , ctrl+c to a textbox
我试图让用户只输入数字并将控件复制并粘贴到文本框。我可以限制用户只输入数字,但复制、粘贴对我不起作用,请帮我解决这个问题。
这是我的脚本:
$(".allow_only_numbers").keydown(function (e) {
var ctrlDown = false;
var ctrlKey = 17, vKey = 86, cKey = 67;
if (e.keyCode === ctrlKey){
ctrlDown = true;
}
// Allow: backspace, delete, tab, escape, enter and .
if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110]) !== -1 ||
// Allow: Ctrl
(e.keyCode === ctrlKey) ||
// Allow: Ctrl+A
(e.keyCode === 65 && e.ctrlKey === true) ||
// Allow: Ctrl+v
(e.keyCode === vKey && ctrlDown) ||
// Allow: Ctrl+c
(e.keyCode === cKey && ctrlDown) ||
// Allow: home, end, left, right, down, up
(e.keyCode >= 35 && e.keyCode <= 40)) {
// let it happen, don't do anything
return;
}
// Ensure that it is a number and stop the keypress
if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
e.preventDefault();
}
});
这是 jsfiddle link:
https://jsfiddle.net/sureshpattu/stwzhceL/1/
如果您将 keydown
事件更改为 keyup
事件,则可以使用 e.ctrlKey
,按下 ctrl
键时将为 true
.
像这样 event.keyCode
and event.metaKey
试试。
$(document).ready(function() {
$(".allow_only_numbers").keydown(function(e) {
// Allow: backspace, delete, tab, escape, enter and .
if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1 ||
// Allow: Ctrl+A,Ctrl+C,Ctrl+V, Command+A
((e.keyCode == 65 || e.keyCode == 86 || e.keyCode == 67) && (e.ctrlKey === true || e.metaKey === true)) ||
// Allow: home, end, left, right, down, up
(e.keyCode >= 35 && e.keyCode <= 40)) {
// let it happen, don't do anything
return;
}
// Ensure that it is a number and stop the keypress
if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
e.preventDefault();
}
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<input type="number" class="allow_only_numbers" />
编辑:
从您的代码中删除以下代码片段。
var ctrlDown = false;
var ctrlKey = 17, vKey = 86, cKey = 67;
if (e.keyCode === ctrlKey) {
ctrlDown = true;
}
因为按C
和V
复制粘贴时ctrlDown
会变成false
。因此你的 ctr+c
和 ctrl+v
不工作。
function numbersonly(evt) {
evt = (evt) ? evt : window.event;
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode > 31 && (charCode < 48 || charCode > 57)) {
return false;
}
return true;
}
$(".allow_only_numbers").keydown(function (e) {
var isModifierkeyPressed = (e.metaKey || e.ctrlKey || e.shiftKey);
var isCursorMoveOrDeleteAction = ([46,8,37,38,39,40].indexOf(e.keyCode) != -1);
var isNumKeyPressed = (e.keyCode >= 48 && e.keyCode <= 58) || (e.keyCode >=96 && e.keyCode <= 105);
var vKey = 86, cKey = 67,aKey = 65;
switch(true){
case isCursorMoveOrDeleteAction:
case isModifierkeyPressed == false && isNumKeyPressed:
case (e.metaKey || e.ctrlKey) && ([vKey,cKey,aKey].indexOf(e.keyCode) != -1):
break;
default:
e.preventDefault();
}
});
这是工作示例
https://jsfiddle.net/stwzhceL/8/
这允许您 ctrl+a
、ctrl+c
和 ctrl+v
以及箭头键、删除键和退格键。
此外,此代码还涵盖了 mac。(即 cmd+a/cmd+c/cmd+v
)
这应该会给你一个想法。抱歉,我在 Mac 上,据我所知,e.ctrlKey 之类的东西在 Mac.
上不起作用
var mod;
var ouput = jQuery('#output');
var numeric = jQuery('#numeric').keydown(function(e){
mod = e.which;
if(!(e.which >= 48 && e.which <= 57) && (e.which != 8)
&& (mod && (e.which == 67 || e.which != 86))){
e.preventDefault();
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type='text' id='numeric'/>
<label id='output'></label>
$(".allow_only_numbers").on("input",function (e) {
e.target.value = e.target.value.replace(/[^0-9]/g,'')
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" class="allow_only_numbers" />
来自@Shanimal 的回答。
这是我的 angular js 指令。仅使用数字输入。
.directive('onlyNumber', function() {
return {
restrict: 'A',
link: function (scope, elm, attrs, ctrl) {
elm.on("propertychange input",function (event) {
event.target.value = event.target.value.replace(/[^0-9]/g,'');
});
}
};
})
只需对您的元素使用 'only-number'。
示例:
<input type="text" data-ng-model="number" placeholder="number"id="cifNumber" only-number/>
$('.numericOnly').on('keydown keyup', function (e) {
// Allow: backspace, delete, tab, escape, enter and .
if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1 ||
// Allow: Ctrl+A,Ctrl+C,Ctrl+V, Command+A
((e.keyCode == 65 || e.keyCode == 86 || e.keyCode == 67) && (e.ctrlKey === true || e.metaKey === true)) ||
// Allow: home, end, left, right, down, up
(e.keyCode >= 35 && e.keyCode <= 40)) {
// let it happen, don't do anything
return;
}
// Ensure that it is a number and stop the keypress
if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
e.preventDefault();
}
//Ensure that bulk number pasted is numeric only
let n = $(this).val()
if (!isNaN(parseFloat(n)) && isFinite(n)) {
} else {
$(this).val("")
}
})
我试图让用户只输入数字并将控件复制并粘贴到文本框。我可以限制用户只输入数字,但复制、粘贴对我不起作用,请帮我解决这个问题。
这是我的脚本:
$(".allow_only_numbers").keydown(function (e) {
var ctrlDown = false;
var ctrlKey = 17, vKey = 86, cKey = 67;
if (e.keyCode === ctrlKey){
ctrlDown = true;
}
// Allow: backspace, delete, tab, escape, enter and .
if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110]) !== -1 ||
// Allow: Ctrl
(e.keyCode === ctrlKey) ||
// Allow: Ctrl+A
(e.keyCode === 65 && e.ctrlKey === true) ||
// Allow: Ctrl+v
(e.keyCode === vKey && ctrlDown) ||
// Allow: Ctrl+c
(e.keyCode === cKey && ctrlDown) ||
// Allow: home, end, left, right, down, up
(e.keyCode >= 35 && e.keyCode <= 40)) {
// let it happen, don't do anything
return;
}
// Ensure that it is a number and stop the keypress
if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
e.preventDefault();
}
});
这是 jsfiddle link:
https://jsfiddle.net/sureshpattu/stwzhceL/1/
如果您将 keydown
事件更改为 keyup
事件,则可以使用 e.ctrlKey
,按下 ctrl
键时将为 true
.
像这样 event.keyCode
and event.metaKey
试试。
$(document).ready(function() {
$(".allow_only_numbers").keydown(function(e) {
// Allow: backspace, delete, tab, escape, enter and .
if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1 ||
// Allow: Ctrl+A,Ctrl+C,Ctrl+V, Command+A
((e.keyCode == 65 || e.keyCode == 86 || e.keyCode == 67) && (e.ctrlKey === true || e.metaKey === true)) ||
// Allow: home, end, left, right, down, up
(e.keyCode >= 35 && e.keyCode <= 40)) {
// let it happen, don't do anything
return;
}
// Ensure that it is a number and stop the keypress
if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
e.preventDefault();
}
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<input type="number" class="allow_only_numbers" />
编辑:
从您的代码中删除以下代码片段。
var ctrlDown = false;
var ctrlKey = 17, vKey = 86, cKey = 67;
if (e.keyCode === ctrlKey) {
ctrlDown = true;
}
因为按C
和V
复制粘贴时ctrlDown
会变成false
。因此你的 ctr+c
和 ctrl+v
不工作。
function numbersonly(evt) {
evt = (evt) ? evt : window.event;
var charCode = (evt.which) ? evt.which : evt.keyCode;
if (charCode > 31 && (charCode < 48 || charCode > 57)) {
return false;
}
return true;
}
$(".allow_only_numbers").keydown(function (e) {
var isModifierkeyPressed = (e.metaKey || e.ctrlKey || e.shiftKey);
var isCursorMoveOrDeleteAction = ([46,8,37,38,39,40].indexOf(e.keyCode) != -1);
var isNumKeyPressed = (e.keyCode >= 48 && e.keyCode <= 58) || (e.keyCode >=96 && e.keyCode <= 105);
var vKey = 86, cKey = 67,aKey = 65;
switch(true){
case isCursorMoveOrDeleteAction:
case isModifierkeyPressed == false && isNumKeyPressed:
case (e.metaKey || e.ctrlKey) && ([vKey,cKey,aKey].indexOf(e.keyCode) != -1):
break;
default:
e.preventDefault();
}
});
这是工作示例
https://jsfiddle.net/stwzhceL/8/
这允许您 ctrl+a
、ctrl+c
和 ctrl+v
以及箭头键、删除键和退格键。
此外,此代码还涵盖了 mac。(即 cmd+a/cmd+c/cmd+v
)
这应该会给你一个想法。抱歉,我在 Mac 上,据我所知,e.ctrlKey 之类的东西在 Mac.
上不起作用var mod;
var ouput = jQuery('#output');
var numeric = jQuery('#numeric').keydown(function(e){
mod = e.which;
if(!(e.which >= 48 && e.which <= 57) && (e.which != 8)
&& (mod && (e.which == 67 || e.which != 86))){
e.preventDefault();
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type='text' id='numeric'/>
<label id='output'></label>
$(".allow_only_numbers").on("input",function (e) {
e.target.value = e.target.value.replace(/[^0-9]/g,'')
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" class="allow_only_numbers" />
来自@Shanimal 的回答。 这是我的 angular js 指令。仅使用数字输入。
.directive('onlyNumber', function() {
return {
restrict: 'A',
link: function (scope, elm, attrs, ctrl) {
elm.on("propertychange input",function (event) {
event.target.value = event.target.value.replace(/[^0-9]/g,'');
});
}
};
})
只需对您的元素使用 'only-number'。 示例:
<input type="text" data-ng-model="number" placeholder="number"id="cifNumber" only-number/>
$('.numericOnly').on('keydown keyup', function (e) {
// Allow: backspace, delete, tab, escape, enter and .
if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1 ||
// Allow: Ctrl+A,Ctrl+C,Ctrl+V, Command+A
((e.keyCode == 65 || e.keyCode == 86 || e.keyCode == 67) && (e.ctrlKey === true || e.metaKey === true)) ||
// Allow: home, end, left, right, down, up
(e.keyCode >= 35 && e.keyCode <= 40)) {
// let it happen, don't do anything
return;
}
// Ensure that it is a number and stop the keypress
if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
e.preventDefault();
}
//Ensure that bulk number pasted is numeric only
let n = $(this).val()
if (!isNaN(parseFloat(n)) && isFinite(n)) {
} else {
$(this).val("")
}
})