自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何讓HTML5數(shù)字輸入僅接受整數(shù)?

開發(fā) 后端
使用 HTML 5 屬性來限制可以發(fā)送到服務器的內(nèi)容,然后使用 Javascript 增強它,以限制用戶可以在第一個地方輸入的內(nèi)容。

[[385049]]

原文:https://levelup.gitconnected.com/making-html-5-numeric-inputs-only-accept-integers-d3d117973d56

作者:Jason Knight

這兩年我看到很多關于這方面的文章和帖子,這的確是一個非常方便的東西。但是,太多的實現(xiàn)還是有漏洞,殘缺不全的實現(xiàn),等等。

整體概念是合理的:使用 HTML 5 屬性來限制可以發(fā)送到服務器的內(nèi)容,然后使用 Javascript 增強它,以限制用戶可以在第一個地方輸入的內(nèi)容。

所以讓我們來看看這些問題,并更好地實現(xiàn)它。

問題 1,不好的腳本

最常見的缺陷是缺乏適當?shù)慕导壒δ堋H绻?ldquo;electron”或“nw.js”中構建完整的堆棧應用程序,那很好,但是這種形式的東西通常在面向公眾的網(wǎng)站中沒有位置。

就像我經(jīng)常說的那樣,高質(zhì)量的腳本應該增強已經(jīng)在工作的頁面,而不是用戶使用它的唯一方法。

解決辦法?

使用 pattern 和 step 屬性來限制有效內(nèi)容。

問題 2,正則表達式模式錯誤或不完整

人們最常用的模式是 [-/ d] *,它的問題是允許在任何地方都減號。雖然肯定可以使用 type = “number” 來解決問題,但這不是一個好選擇。截取按鍵時更是如此,因為減號只能是第一個字符。

它還可能出現(xiàn)問題,因為某些實現(xiàn)“不是”正則表達式,這會導致誤報。

解決辦法?

對于 HTML,使用更好的表達式:^[- d]\d*$ 更加健壯和準確。減號可以是匹配開始的第一個字符,然后是零個或多個小數(shù),直到字符串結束。

對于 JavaScript,只使用正則表達式來測試數(shù)字,并應用一些更實用的邏輯來檢測其他值。

簡單易行!

問題 3,在標記中使用事件屬性

我知道在 JSX 垃圾中,有大量的用嘴呼吸的人在鼓勵這一點,但如果你在寫 vanilla 或其他系統(tǒng),請出于對圣誕節(jié)的愛,從 1997 年的直腸中取出你的頭顱。

將 “onkeypress” 或 “onchange” 放在標記中意味著錯失了一次緩存機會,也違反了分離關注的原則。以這種方式將 JavaScript 放進標記中,就像在 HTML 4 Strict 中被廢棄的所有東西一樣,愚蠢得令人發(fā)指。就像如果你要用 “text-white box-shadow col-4-s” 這樣的屬性在你的 HTML 上撒尿一樣,請你承認失敗,然后回到寫 HTML 3.2 的時候,用所有那些 FONT / CENTER 標簽、COLOR、BGCOLOR、SIZE、BORDER 和 ALIGN 屬性,以及 "用于布局的表格 "來寫,你們似乎都很清楚地、很珍視地錯過了。

這也意味著您沒有完整/適當?shù)氖录幚沓绦蛟L問權限。

解決辦法?

Element.addEventListener,請使用它!

問題 4,必須對每個輸入進行硬編碼

無論是通過問題 3 將事件屬性放到標記中,還是通過手動獲取唯一 ID 來捕獲它們,我?guī)缀鯖]有發(fā)現(xiàn)可以實際使用即插即用的標記應用程序的代碼庫!

解決辦法?

document.querySelectorAll('input[type="number”][step="1"]') 給我們提供所有我們想要的整數(shù)輸入,所以我們可以增強它。

問題 5,一些腳本阻止使用導航控制和正常編輯!

通過攔截并只允許減號和 0...9,它們可以防止退格鍵、回車鍵、制表鍵、箭頭、刪除、插入等等等等。并不是所有的瀏覽器都會把這些作為 event.key 發(fā)送,這要看你鉤住的是什么事件。比如 “keypress” 事件在 Firefox 和 Chrome 中會過濾掉一些,以免破壞正常的表單使用,但 “老 Edge” 和 Safari 不會,“keydown” 則什么也不過濾。

解決辦法?

因為 “keypress” 事件跨瀏覽器不一致,所以用 keydown 代替。那么我們就可以利用所有控制鍵在 Event.key 值中返回多個字符的事實,我們只需要檢查 Event.key.length>1 就可以說 “繼續(xù)允許這些”。

正如前面所提到的,我們所需要的只是一個簡單的輸入,在不使用 JavaScript 的情況下,它首先具有盡可能多的功能!

HTML:

  1. <input type="number" step="1" pattern="^[-/d]/d*$" /> 

只接受整數(shù),如果你想只接受正數(shù),可以換成 pattern="/d+”

JavaScript:

然后我們可以使用 JavaScript 來限制用戶的輸入,這樣人們甚至不允許輸入無效值。

  1. (function() { 
  2.   var integers = document.querySelectorAll( 
  3.       'input[type="number"][step="1"]' 
  4.     ), 
  5.     intRx = /\d/; 
  6.  
  7.   for (var input of integers) { 
  8.     input.addEventListener("keydown", integerChange, false); 
  9.   } 
  10.  
  11.   function integerChange(event) { 
  12.     if ( 
  13.       event.key.length > 1 || 
  14.       (event.key === "-" && 
  15.         event.currentTarget.value.length === 0) || 
  16.       intRx.test(event.key
  17.     ) 
  18.       return
  19.     event.preventDefault(); 
  20.   } 
  21. })(); 

我們首先將其包裝在 IIFE 中以隔離范圍。然后,抓取我們要在頁面上掛接的所有輸入,并創(chuàng)建我們的正則表達式。

我在事件開始處而不是在事件內(nèi)部創(chuàng)建正則表達式,這樣我們就不用浪費時間在每個該死的按鍵上創(chuàng)建它。這就是匿名函數(shù)可能帶來開銷的地方,也是需要告訴那些“函數(shù)式程序員”和他們的“副作用”廢話的地方。

循環(huán)遍歷所有輸入,并為它們分配事件處理程序。

上述處理程序只是檢查我們的返回情況。像箭頭、退格鍵、回車鍵等控制鍵都會返回完整的文字來描述它們,所以如果 event.key 的長度>1,我們就不要阻止這些。

如果它是一個負號和第一個字符,通過 return 允許它。

如果它是一個數(shù)字,通過 return 允許它。

如果都不是,請阻止該事件。

Live Demo

這是一個代碼本,它包括幾個文本字段和多個整數(shù)和非整數(shù)的數(shù)字字段,所以你可以看到它確實只鉤住了我們想要的字段。

https://codepen.io/jason-knight/pen/QWGyrwq

懸而未決的問題

我可能會考慮添加的一件事是掛鉤“change”事件來攔截粘貼,但由于“pattern”屬性不允許提交無效的值,所以應該沒有問題。

結論

多想想用戶可能會輸入錯誤的東西,以及如何處理,但也要記住用戶可能輸入的所有其他東西,而這些東西與值本身沒有關系。

請始終注意,許多用戶會主動阻止腳本編寫,或者出于安全或可訪問性的原因讓腳本在 UA 中不可用。增強而不是取代你的基本功能!

計劃將這些東西應用到所有這些字段,而不是從一開始就只使用單個元素。

留意低效率,例如如何多次生成用作回調(diào)的匿名函數(shù)……或如何將腳本放入標記中會錯失跨頁面或重新訪問的緩存機會。

做了這些事情之后,實現(xiàn)這樣簡單的功能就不會再來困擾您或惹惱用戶了。

本文轉(zhuǎn)載自微信公眾號「前端全棧開發(fā)者」,可以通過以下二維碼關注。轉(zhuǎn)載本文請聯(lián)系前端全棧開發(fā)者公眾號。

 

責任編輯:武曉燕 來源: 前端全棧開發(fā)者
相關推薦

2021-03-13 09:35:40

HTML 5Javascript腳本

2017-10-12 15:58:10

網(wǎng)站HTML5Manifest

2011-10-09 13:29:11

HTML5App Store蘋果

2015-11-19 09:44:34

HTML5定位

2009-05-08 13:46:38

JavaScriptHTML5離線存儲

2013-01-24 10:26:04

HTML5HTML 5HTML5的未來

2015-06-10 10:18:27

WebAPP開發(fā)技巧

2011-12-31 10:12:10

2011-05-13 17:36:05

HTML

2013-10-21 15:24:49

html5游戲

2016-01-13 10:09:18

原生應用HTML5

2011-12-28 15:32:46

HTML5移動App

2011-05-12 15:42:16

HTML5

2017-01-03 18:09:33

HTML5本地存儲Web

2011-05-13 17:41:40

2011-01-14 17:53:33

HTML5cssweb

2023-03-16 09:00:00

HTML5HTML語言

2015-08-14 10:44:33

HTML5

2013-03-22 08:59:57

HTML5移動應用Web App

2014-03-20 10:50:44

HTML5 定位技術
點贊
收藏

51CTO技術棧公眾號