JavaScript實(shí)現(xiàn)輸入驗(yàn)證的常見(jiàn)方法總結(jié)
本文介紹在JavaScript 中實(shí)現(xiàn)輸入驗(yàn)證的常見(jiàn)方法及實(shí)踐總結(jié):
一、基礎(chǔ)驗(yàn)證方法
1. 空值驗(yàn)證
檢查輸入字段是否為空,防止用戶跳過(guò)必填項(xiàng):
<body>
<form id="myForm">
<label for="name">姓名:</label>
<input type="text" id="name" name="name" required>
<input type="submit" value="提交">
</form>
<script>
// 獲取表單元素并添加事件監(jiān)聽(tīng)器,監(jiān)聽(tīng)submit事件
document.getElementById('myForm').addEventListener('submit', function (event) {
// 獲取表單中文本的輸入元素
var nameInput = document.getElementById('name');
// 驗(yàn)證輸入是否為空
if (!validateRequired(nameInput)) {
event.preventDefault(); // 阻止表單提交
}
});
function validateRequired(input) {
if (input.value.trim() === "") {
alert("必填項(xiàng)不能為空!");
return false;
}
console.log("驗(yàn)證通過(guò)!");
}
</script>
</body>
- 應(yīng)用場(chǎng)景:表單提交前的必填項(xiàng)校驗(yàn)。
2. 數(shù)字驗(yàn)證
isNaN()函數(shù):判斷是否為非數(shù)字。
isNaN()的核心邏輯是嘗試將參數(shù)轉(zhuǎn)為數(shù)字后判斷是否為NaN:
<body>
<form id="myForm">
<label for="age">請(qǐng)輸入年齡:</label><br>
<input type="text" id="age" name="age" /><br>
<button type="submit" id="submit">提交</button>
</form>
<script>
//獲取id為myForm的表單對(duì)象,并為表單的submit事件添加一個(gè)事件觸發(fā)處理函數(shù)。
document.getElementById("myForm").addEventListener("submit", function (event) {
//獲取id為age的輸入框的value屬性值。
var age = document.getElementById("age").value;
//判斷age是否為數(shù)字,如果是數(shù)字,則阻止表單提交,并彈出提示信息;
if (isNaN(age)) {
alert("請(qǐng)輸入數(shù)字!");
event.preventDefault();//阻止表單的默認(rèn)提交行為。
}
//如果age不是數(shù)字,則提示:提交成功!
else {
alert("提交成功!");
}
});
</script>
</body>
isNaN()函數(shù):特殊場(chǎng)景處理
由于isNaN()函數(shù)會(huì)將空字符串、空格、布爾值等隱式轉(zhuǎn)換為數(shù)字,需結(jié)合類(lèi)型判斷:
| 輸入值 | isNaN結(jié)果 | 實(shí)際是否為數(shù)字 | 解決方案 |
|---|---|---|---|
| “”(空字符串) | false | 否 | 需額外檢查空值 |
| " "(空格) | false | 否 | 先用.trim()處理字符串 |
| " "(空格) | false | 否 | 先用.trim()處理字符串 |
| true/false | false | 否 | 結(jié)合typeof判斷類(lèi)型 |
<body>
<form id="myForm">
<label for="age">請(qǐng)輸入年齡:</label><br>
<input type="text" id="age" name="age" /><br>
<button type="submit" id="submit">提交</button>
</form>
<script>
//獲取id為myForm的表單對(duì)象,并為表單的submit事件添加一個(gè)事件觸發(fā)處理函數(shù)。
document.getElementById("myForm").addEventListener("submit", function (event) {
//獲取id為age的輸入框的value屬性值。
var age = document.getElementById("age").value;
//判斷age是否為數(shù)字,如果是數(shù)字,則阻止表單提交,并彈出提示信息;
if (isNotNumber(age)) {
alert("請(qǐng)輸入數(shù)字!");
event.preventDefault();//阻止表單的默認(rèn)提交行為。
} else {
alert("提交成功!");
}
});
//定義一個(gè)函數(shù),用來(lái)判斷輸入是否為非數(shù)字。
function isNotNumber(input) {
// 檢查輸入是否為空或 null,
return input === null || input === ""
// 如果是,則返回 true,認(rèn)為是非數(shù)字。
? true
// Number(input.trim())去除輸入值前后的空白,然后將其轉(zhuǎn)換為數(shù)字類(lèi)型。
// isNaN() 函數(shù)判斷是否為 NaN,如果是 NaN,則認(rèn)為是非數(shù)字,返回 true,否則返回 false。
: isNaN(Number(input.trim()));
}
</script>
</body>
- 正則表達(dá)式:精確匹配整數(shù)或浮點(diǎn)數(shù)。
//整個(gè)正則表達(dá)式的意思是匹配一個(gè)整數(shù)或者一個(gè)小數(shù)。
const numberPattern = /^[0-9]+(\.[0-9]+)?$/;
//! 取反操作,表示如果輸入的字符串不符合數(shù)字格式,則執(zhí)行花括號(hào)內(nèi)的代碼
if (!numberPattern.test(inputValue)) {
alert("輸入格式錯(cuò)誤!");
}
}
- HTML5 原生支持:
<input type="number">限制用戶只能輸入數(shù)字。
3. 格式驗(yàn)證(如郵箱、密碼)
// 郵箱驗(yàn)證示例
function validateEmail(email) {
const pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return pattern.test(email);
}
- 密碼強(qiáng)度驗(yàn)證:結(jié)合長(zhǎng)度、大小寫(xiě)字母和特殊字符規(guī)則。
二、實(shí)時(shí)輸入驗(yàn)證
通過(guò)事件監(jiān)聽(tīng)實(shí)現(xiàn)即時(shí)反饋,提升用戶體驗(yàn):
1. 輸入時(shí)驗(yàn)證(input 事件)
document.getElementById("username").addEventListener("input", function(e) {
if (e.target.value.length < 6) {
showError("用戶名至少6位!");
}
});
2. 焦點(diǎn)離開(kāi)時(shí)驗(yàn)證(blur 事件)
document.getElementById("email").addEventListener("blur", function() {
if (!validateEmail(this.value)) {
showError("郵箱格式錯(cuò)誤!");
}
});
3. 防抖優(yōu)化
減少高頻輸入觸發(fā)的驗(yàn)證次數(shù):
let timeout;
inputField.addEventListener("input", () => {
clearTimeout(timeout);
timeout = setTimeout(() => validateInput(), 500);
});
三、HTML5 原生驗(yàn)證集成
1. 屬性輔助驗(yàn)證
required:標(biāo)記必填字段。pattern:通過(guò)正則表達(dá)式限制輸入格式。
<input type="text" pattern="[A-Za-z]{3}" title="只能輸入3個(gè)字母">
2. 自定義錯(cuò)誤提示
覆蓋瀏覽器默認(rèn)提示:
const emailInput = document.getElementById("email");
emailInput.addEventListener("invalid", () => {
emailInput.setCustomValidity("請(qǐng)輸入有效的郵箱地址!");
});
四、安全與注意事項(xiàng)
1. 防 XSS 攻擊
避免直接使用 innerHTML 插入未轉(zhuǎn)義的用戶輸入內(nèi)容,優(yōu)先使用 textContent。
2. 服務(wù)端二次驗(yàn)證
前端驗(yàn)證僅用于用戶體驗(yàn)優(yōu)化,需在服務(wù)端進(jìn)行最終校驗(yàn)。
3. 錯(cuò)誤提示友好性
使用明確的錯(cuò)誤消息,并通過(guò) CSS 高亮錯(cuò)誤字段:
.error { border: 2px solid red; }
.error-message { color: red; font-size: 0.8em; }
五、常見(jiàn)驗(yàn)證類(lèi)型擴(kuò)展
參考實(shí)際開(kāi)發(fā)高頻需求:
- 純字母輸入:
/^[A-Za-z]+$/ - 數(shù)字與字母組合:
/^[A-Za-z0-9]+$/ - 手機(jī)號(hào)格式:
/^1[3-9]\d{9}$/ - 日期格式:
/^\d{4}-\d{2}-\d{2}$/
總結(jié)
JavaScript 輸入驗(yàn)證的核心目標(biāo)是確保數(shù)據(jù)合法性和提升交互體驗(yàn)。推薦結(jié)合以下方案:
- HTML5 原生驗(yàn)證 + JavaScript 補(bǔ)充邏輯。
- 實(shí)時(shí)反饋(如輸入時(shí)提示)與 提交前整體校驗(yàn) 結(jié)合。
- 正則表達(dá)式處理復(fù)雜規(guī)則,優(yōu)先使用預(yù)定義模式。
- 使用第三方庫(kù)(如
validator.js)簡(jiǎn)化開(kāi)發(fā)。
到此這篇關(guān)于JavaScript實(shí)現(xiàn)輸入驗(yàn)證的常見(jiàn)方法總結(jié)的文章就介紹到這了,更多相關(guān)JavaScript輸入驗(yàn)證方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于js Canvas實(shí)現(xiàn)二次貝塞爾曲線
這篇文章主要為大家詳細(xì)介紹了基于js Canvas實(shí)現(xiàn)二次貝塞爾曲線,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
全面解析JavaScript中“&&”和“||”操作符(總結(jié)篇)
這篇文章主要介紹了全面解析JavaScript中“&&”和“||”操作符(總結(jié)篇)的相關(guān)資料,需要的朋友可以參考下2016-07-07
js事件機(jī)制----捕獲與冒泡機(jī)制實(shí)例分析
這篇文章主要介紹了js事件機(jī)制----捕獲與冒泡機(jī)制,結(jié)合實(shí)例形式分析了js事件機(jī)制中捕獲與冒泡機(jī)制相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-05-05
js實(shí)現(xiàn)網(wǎng)頁(yè)定位導(dǎo)航功能
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)網(wǎng)頁(yè)定位導(dǎo)航功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
動(dòng)態(tài)添加js事件實(shí)現(xiàn)代碼
動(dòng)態(tài)添加js事件,主要是不用具體指定位置的事件,這種動(dòng)態(tài)添加事件的方法比較方便,并可以擴(kuò)展等。2009-03-03
JS解決回調(diào)地獄為什么需要Promise來(lái)優(yōu)化異步編程
這篇文章主要為大家介紹了JS解決回調(diào)地獄為什么需要Promise來(lái)優(yōu)化異步編程原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
基于jsbarcode 生成條形碼并將生成的條碼保存至本地+源碼
這篇文章主要介紹了基于jsbarcode 生成條形碼并將生成的條碼保存至本地,本文給大家提供最新源代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-04-04

