最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript限制文本框只允許輸入數(shù)字(曾經(jīng)與現(xiàn)在的方法對比)

 更新時間:2013年01月18日 16:21:14   作者:  
很多時候需要用到限制文本框的數(shù)字輸入,試過許多方法,都不太理想,遂決定自己實現(xiàn)一個來玩玩,接下來介紹曾經(jīng)使用過的方法與自定義方法的對比,感興趣的朋友可以了解下啊
很多時候需要用到限制文本框的數(shù)字輸入,試過許多方法,都不太理想,遂決定自己實現(xiàn)一個來玩玩。

曾經(jīng)使用過的方法

通過onkeydown事件來控制只允許數(shù)字:
復制代碼 代碼如下:

<input onkeydown="return event.keyCode>=48&&event.keyCode<=57||event.keyCode>=96&&event.keyCode<=105" />

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

具體實現(xiàn)方法
使用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
然后再自定義兩個屬性來設置輸入的數(shù)字、小數(shù)長度:
•data-numbers控制數(shù)字輸入的長度
•data-decimals控制小數(shù)輸入的長度
最終全部代碼實現(xiàn)如下:
復制代碼 代碼如下:

function validateDigitsOnly(evt) {
var e = 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 <= 40) {
return;
}
if (e.shiftKey || e.altKey || e.ctrlKey) {
return false;
}
var el = e.target || e.srcElement,
// 最大數(shù)字長度
nl = el.getAttribute("data-numbers") || 15,
// 最大小數(shù)長度
dl = el.getAttribute("data-decimals") || 2,
val = el.value,
// "." 位置
dotIndex = val.indexOf("."),
rng = caret.call(el),
// 光標在"."左邊
rLeft = rng.end <= dotIndex,
// 光標在"."右邊
rRight = rng.begin > dotIndex;
if (
// 數(shù)字
key >= 48 && key <= 57 ||
// 數(shù)字鍵盤輸入的數(shù)字
key >= 96 && key <= 105) {
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*/ ||
// 數(shù)字鍵盤上的 ".", ","
key == 110/*|| key == 109*/) &&
// 允許輸入小數(shù)
dl > 0) {
if (
// 未輸入".", 且輸入的位置后面的小數(shù)位數(shù)未達到上限
dotIndex == -1 && (rng.end == val.length || val.substring(rng.end).length <= dl) ||
// 輸過".", 且選中部分文本包含"."
dotIndex > -1 && rng.begin <= dotIndex && dotIndex < rng.end)
return;
}
return false;
}
// 驗證輸入的值
function validateValue(dotIndex, val, rLeft, rRight, nl, dl) {
if (
// 未輸入過"."
dotIndex == -1 && val.length < nl ||
// 光標位置在"."之前
rLeft && val.substring(0, dotIndex).length < nl ||
// 光標在"."之后且未達到小數(shù)上限
rRight && val.substring(dotIndex + 1).length < dl)
return true;
return false;
}
// 獲取光標位置
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 };
}

使用方法
具體使用方法如下:
復制代碼 代碼如下:

<input type="text" id="t1" />
<input type="text" id="t2" data-numbers="5" data-decimals="4" />
<script>
document.getElementById("t1").onkeydown = validateDigitsOnly;
document.getElementById("t2").onkeydown = validateDigitsOnly;
</script>

或者干脆寫在html里:
復制代碼 代碼如下:

<input type="text" id="lwme_text_3" onkeydown="return validateDigitsOnly(event)" />

如果引入jQuery的話使用起來就更加簡單了:
復制代碼 代碼如下:

<input type="text" class="digitsOnly" />

復制代碼 代碼如下:

$(".digitsOnly").keydown(validateDigitsOnly);

結(jié)尾
這個方法雖然有些地方效率還不夠高,而且某些鍵盤key的還未處理,也不排除某些情況下可能失效,但是對于大多數(shù)情況下使用已經(jīng)足夠了。
大家若有額外需要請自行修改,當然有更好的辦法也請分享(*^__^*)
over
PS:01.18更新了一些keyCode的判斷,以及錯把110寫成109≡(▔﹏▔)≡
另外需要注意:對于使用右鍵菜單或者是菜單欄粘貼進來的需要額外處理;
還有一種極端的情況:在網(wǎng)頁中選中文字并拖動到文本框內(nèi),或者是在文本框中選中文字并拖動,這都需要做額外處理
對于以上兩種需要額外處理的情況,比較便捷的方法是加一個驗證,比如jQuery.validate之類的表單驗證,否則處理起來比較麻煩
再PS:在win8下,切換到微軟拼音可能會造成無法輸入,不知道其他系統(tǒng)或者其他輸入法有沒有這個問題( *_*) (`~~`) ====

相關文章

  • Javascript表格翻頁效果實現(xiàn)思路及代碼

    Javascript表格翻頁效果實現(xiàn)思路及代碼

    表格翻頁的實現(xiàn)方式有很多,下面以js為例為大家詳細介紹下表格翻頁效果的具體實現(xiàn),感興趣的朋友可以參考下
    2013-08-08
  • js時間查詢插件使用詳解

    js時間查詢插件使用詳解

    這篇文章主要為大家詳細介紹了js時間查詢插件的使用方法,結(jié)合bootstrap進行使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 通過掃描二維碼打開app的實現(xiàn)代碼

    通過掃描二維碼打開app的實現(xiàn)代碼

    在項目開發(fā)中遇到這樣的需求,掃描二維碼打開app如果用戶沒有這個app則提示它跳轉(zhuǎn),怎么實現(xiàn)呢?下面小編給大家分享通過掃描二維碼打開app的實現(xiàn)代碼,感興趣的朋友參考下吧
    2016-11-11
  • es5 類與es6中class的區(qū)別小結(jié)

    es5 類與es6中class的區(qū)別小結(jié)

    這篇文章主要給大家介紹了關于es5 類與es6中class區(qū)別的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 查看圖片(前進后退)功能實現(xiàn)js代碼

    查看圖片(前進后退)功能實現(xiàn)js代碼

    前進后退實現(xiàn)的前提是:images文件夾下圖片的命名是從1~5.jpg有規(guī)律的,感興趣的朋友可以參考下哈,希望可以幫助到你
    2013-04-04
  • js簡單的表拖拽

    js簡單的表拖拽

    用js實現(xiàn)表格的拖拽效果代碼
    2008-05-05
  • Echarts之懸浮框中的數(shù)據(jù)排序問題

    Echarts之懸浮框中的數(shù)據(jù)排序問題

    Echarts非常強大,配置也非常的多,有很多細節(jié)需要深入研究。這篇文章主要介紹了Echarts之懸浮框中的數(shù)據(jù)排序問題,需要的朋友可以參考下
    2018-11-11
  • 解決layui前端框架 form表單,table表等內(nèi)置控件不顯示的問題

    解決layui前端框架 form表單,table表等內(nèi)置控件不顯示的問題

    今天小編就為大家分享一篇解決layui前端框架 form表單,table表等內(nèi)置控件不顯示的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • JavaScript設計模式之代理模式簡單實例教程

    JavaScript設計模式之代理模式簡單實例教程

    這篇文章主要介紹了JavaScript設計模式之代理模式,簡單描述了代理模式的概念、功能、組成并結(jié)合實例形式較為詳細的分析了javascript代理模式的定義與使用相關操作技巧,需要的朋友可以參考下
    2018-07-07
  • JavaScript實現(xiàn)前端飛機大戰(zhàn)小游戲

    JavaScript實現(xiàn)前端飛機大戰(zhàn)小游戲

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)前端飛機大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評論

大安市| 双牌县| 大姚县| 衢州市| 天水市| 同江市| 姚安县| 息烽县| 甘泉县| 武定县| 重庆市| 古蔺县| 庆云县| 肥城市| 长乐市| 九江县| 农安县| 红桥区| 元谋县| 合山市| 淳安县| 安图县| 仲巴县| 县级市| 南汇区| 福贡县| 鱼台县| 观塘区| 武穴市| 晋城| 甘洛县| 信阳市| 怀柔区| 郴州市| 焉耆| 玉溪市| 晋城| 潼南县| 成安县| 夏邑县| 曲水县|