首頁 > web前端 > js教程 > 主體

javascript限製文字方塊只允許輸入數字(曾經與現在的方法比較)_javascript技巧

WBOY
發布: 2016-05-16 17:43:21
原創
998 人瀏覽過

很多時候需要用到限製文字框的數字輸入,試過許多方法,都不太理想,遂決定自己實現一個來玩玩。

曾經使用過的方法

通過onkeydown事件來控制只允許數字:

複製代碼 程式碼如下:

>

透過jQuery插件Masked Input:http://digitalbush.com/projects/masked-input-plugin/
透過jQuery插件MeioMask:https://github.com/fabiomcosta/jqueryomcosta/jquery -meiomask
onkeydown事件控制起來相對比較麻煩,上面的簡化版很多鍵都沒有涉及到,操作體驗比較糟糕。
jQuery的兩個插件使用起來還是比較靈活的,能夠滿足大部分需要,但是在控制輸入長度上限制的很不靈活(或許是我沒有發現靈活的使用方式?)

具體實作方法
使用maskedInput裡的一部分方法來提取遊標位置
使用stackoverflow上提供的通用方法來處理鍵盤的敲擊:http://stackoverflow.com/questions/469357 /html-text-input-allow-only-numeric-input
更新:參考http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes上列出的keycode
然後再自訂兩個屬性來設定輸入的數字、小數長度:
•data-numbers控制數字輸入的長度
•data-decimals控制小數輸入的長度
最終全部程式碼實作如下:
複製程式碼 程式碼如下:

function validateDigitsOnOn(evt) { evt || window.event,
key = e.keyCode || e.which;
if (
// Backspace, Tab, Enter, Esc, Delete
key == 8 || key == 9 || key == 13 || key == 27 || key == 46 ||
// Ctrl A
(key == 65 && event.ctrlKey === true) ||
// Home, End, 四個方向鍵
key >= 35 && key return;
}
if (e.shiftKey || e.altKey || e.ctrlKey) {
return false;
}
var el = e.target || e.srcElement,
// 最大數字長度
nl = el.getAttribute("data- numbers") || 15,
// 最大小數長度
dl = el.getAttribute("data-decimals") || 2,
val = el.value,
// ". " 位置
dotIndex = val.indexOf("."),
rng = caret.call(el),
// 遊標在"."左邊
rLeft = rng.end // 遊標在"."右邊
rRight = rng.begin > dotIndex;
if (
// 數字
key >= 48 && key // 數字鍵盤輸入的數字
key >= 96 && key if (validateValue(dotIndex, val, rLeft, rRight, nl, dl))
return;
// 選取部分文字再做一次處理
val = val.substring(0, rng.begin) val.substring(rng.end);
dotIndex = val.indexOf(".");
if (validateValue(dotIndex, val, rLeft, rRight, nl, dl))
return;
}
else if (
// ".", ","
(key = = 190 /*|| key == 188*/ ||
// 數字鍵盤上的".", ","
key == 110/*|| key == 109*/) &&
// 允許輸入小數
dl > 0) {
if (
// 未輸入".", 且輸入的位置後面的小數位數未達到上限
dotIndex == - 1 && (rng.end == val.length || val.substring(rng.end).length // 輸過".", 且選取部分文字包含"."
dotIndex > -1 && rng.begin return;
}
return false;
}
// 驗證輸入的值
function validateValue(dotIndex, val, rLeft, rRight, nl, dl) {
if (
// 未輸入過"."
dotIndex == -1 && val.length dotIndex == -1 && val.length // 遊標位置在"."之前
rLeft && val.substring(0, dotIndex).length // 遊標在"."之後且未達到小數上限
rRight && val.substring(dotIndex 1).length return true;
return false;
}
// 取得遊標位置
function caret() {
// 取得遊標位置
function caret() {
var begin, end;
if (this.setSelectionRange) {
begin = this.selectionStart;
end = this.selectionEnd;
} else if (document.selection && document.selection.createRange) {
var range = document.selection.createRange();
begin = 0 - range.duplicate().moveStart('character', -100000);
end = begin range.text.length
; }
return { begin: begin, end: end };
}

使用方法
具體使用方法如下: 複製程式碼
程式碼如下:



<script> <BR>document.getElementById("t1").onkeydown = validateDigitsOnly; <BR>document.getElementById("t2").onkeydown = validateDigitsOnly; <BR> 🎜> <BR>或者乾脆寫在html裡: </script>


複製代碼 代碼如下:


如果引入jQuery的話使用起來就更加簡單了:


複製程式碼 程式碼如下:



複製程式碼 程式碼如下:

$(".digitsOnly"). );

結尾
這個方法雖然有些地方效率還不夠高,而且某些鍵盤key的還未處理,也不排除某些情況下可能失效,但是對於大多數情況下使用已經足夠了。
大家若有額外需要請自行修改,當然有更好的辦法也請分享(*^__^*)
over
PS:01.18更新了一些keyCode的判斷,以及錯把110寫成109≡(▔﹏▔)≡
另外需要注意:對於使用右鍵選單或選單列貼進來的需要額外處理;
還有一種極端的情況:在網頁中選取文字並拖曳到文字方塊內,或是在文字方塊中選取文字並拖曳,這都需要做額外處理
對於以上兩種需要額外處理的情況,比較便捷的方法是加一個驗證,像是jQuery.validate之類的表單驗證,否則處理起來比較麻煩
再PS:在win8下,切換到微軟拼音可能會造成無法輸入,不知道其他系統或其他輸入法有沒有這個問題( *_*) (`~~`) ====
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板