å建 web 表åå§ç»æ¯ä¸ä¸ªå¤æçä»»å¡ãä»
ä»
ç»è£
è¡¨åæ¯å®¹æçï¼ä½æ¯æ£æ¥æ¯ä¸ä¸ªå段ç弿¯å¦ææå¹¶ä¸ä¸è´æ¯ä¸ä»¶æ´å å°é¾çäºæ
ï¼èå¦ä½åç¥ç¨æ·é误æå¨å¯è½ä¼ä»¤äººå¤´çãHTML5 å¼å
¥äºè¡¨åç¸å
³çä¸äºæ°æºå¶ï¼å®ä¸º <input>
å
ç´ å约æéªè¯å¢å äºä¸äºæ°çè¯ä¹ç±»åï¼ä½¿å¾å®¢æ·ç«¯æ£æ¥è¡¨åå
容åå¾å®¹æãåºæ¬ä¸ï¼éè¿è®¾ç½®ä¸äºæ°ç屿§ï¼å¸¸ç¨ççº¦ææ¡ä»¶å¯ä»¥æ é JavaScript 代ç èæ£æµå°ï¼å¯¹äºæ´å¤æççº¦ææ¡ä»¶çæ ¡éªå¯ä»¥å°è¯ä½¿ç¨çº¦æéªè¯ APIã
对äºè¿äºæ¦å¿µçåºæ¬ä»ç»å示ä¾ï¼åé è¡¨åæ°æ®æ ¡éªæç¨ä¸é¡µçä»ç»ã
夿³¨ï¼ HTML 约æéªè¯å¹¶ä¸è½ç§»é¤æå¡ç«¯éªè¯çéè¦ãå°½ç®¡æ æç表å请æ±è¦å°å¾å¤ï¼ä½æ æç表å请æ±ä»ç¶å¯è½è¢«åéï¼ä¾å¦è¢«è¯å¾æ¬ºéªä½ çç½ç»åºç¨çå人åéãå æ¤ï¼ä½ éè¦å§ç»å¨æå¡ç«¯éªè¯è¾å ¥çº¦æï¼å ¶æ¹å¼ä¸å¨å®¢æ·ç«¯æåçä¸è´ã
åºæååºæ¬ç约æå¨ HTML ä¸ï¼æä¸¤ç§æ¹å¼å£°æåºæ¬ç约æï¼
<input>
å
ç´ ç type
屿§éæ©æåéçè¯ä¹åçå¼ï¼æ¯å¦ï¼éæ© email
ç±»åå°ä¼èªå¨å建ä¸ä¸ªçº¦æï¼ç¨äºæ£æ¥è¾å
¥ç弿¯å¦æ¯ä¸ä¸ªææççµåé®ä»¶å°åãtype
屿§ä¸çåºæçº¦ææï¼
对äºè¿ä¸¤ç§è¾å
¥ç±»åï¼å¦æè®¾ç½®äº multiple
屿§ï¼å¯ä»¥è®¾ç½®å 个å¼ï¼ä½ä¸ºä¸ä¸ªéå·åéçå表ã妿å
¶ä¸ä»»ä½ä¸ä¸ªä¸æ»¡è¶³è¿éæè¿°çæ¡ä»¶ï¼å°±ä¼è§¦å TypeMismatch 约æçè¿åã
请注æï¼å¤§å¤æ° input ç±»åæ²¡æå å¨ç约æï¼å 为æäºç±»åè¢«ç¦æ¢å¨çº¦æéªè¯ä¸ä½¿ç¨ï¼æè æä¸ä¸ªååç®æ³å°ä¸æ£ç¡®çå¼è½¬å为æ£ç¡®çé»è®¤å¼ã
éªè¯ç¸å ³ç屿§é¤äºä¸é¢æè¿°ç type
屿§å¤ï¼ä»¥ä¸å±æ§ç¨äºæè¿°åºæ¬çº¦æã
pattern
text
ãsearch
ãurl
ãtel
ãemail
ãpassword
ä¸ä¸ªJavaScript æ£å表达å¼ï¼ä»¥ global
ãignoreCase
æ å¿ç¼è¯ï¼ä¸ç¦ç¨äº multiline
æ å¿ï¼ è¾å
¥çå¼å¿
é¡»ç¬¦åæ¨¡å¼ã patternMismatch
约æè¿å min
range
ãnumber
ä¸ä¸ªææçæ°å è¾å
¥çå¼å¿
须大äºçäºè¯¥å±æ§å¼ã rangeUnderflow
约æè¿å date
ãmonth
ãweek
ä¸ä¸ªææçæ¥æå¼ datetime-local
ãtime
ä¸ä¸ªææçæ¥ææ¶é´å¼ max
range
ãnumber
ä¸ä¸ªææçæ°å è¾å
¥çå¼å¿
é¡»å°äºçäºè¯¥å±æ§å¼ã rangeOverflow
约æè¿å date
ãmonth
ãweek
ä¸ä¸ªææçæ¥æå¼ datetime-local
ãtime
ä¸ä¸ªææçæ¥ææ¶é´å¼ required
text
ãsearch
ãurl
ãtel
ãemail
ãpassword
ãdate
ãdatetime-local
ãmonth
ãweek
ãtime
ãnumber
ãcheckbox
ãradio
ãfile
ï¼ä¹å¨ <select>
å <textarea>
å
ç´ ä¸å¯ç¨ ç±äºæ¯ä¸ä¸ªå¸å°å±æ§ï¼æä»¥ä¸º noneï¼å¦æåå¨è¿ä¸ªå±æ§ï¼å为 trueï¼å¦å为 false 妿æå®äºè¿ä¸ªå±æ§ï¼åå¿
é¡»è¾å
¥ä¸ä¸ªå¼ã valueMissing
约æè¿å step
date
ä¸ä¸ªä»£è¡¨å¤©æ°çæ´æ° 妿 step 没æè®¾ç½®ä¸ºåé¢é any
ï¼åè¾å
¥å¼å¿
须为 min + step å¼çæ´æ°åã stepMismatch
约æè¿å month
ä¸ä¸ªä»£è¡¨ææ°çæ´æ° week
ä¸ä¸ªä»£è¡¨å¨æ°çæ´æ° datetime-local
ãtime
ä¸ä¸ªä»£è¡¨ç§æ°çæ´æ° range
ãnumber
ä¸ä¸ªæ´æ° minlength
text
ãsearch
ãurl
ãtel
ãemail
ãpassword
ï¼ä¹å¨ <textarea>
å
ç´ ä¸å¯ç¨ ä¸ä¸ªæ´æ°é¿åº¦ 妿è¾å
¥å¼é空ï¼åå
¶å符æ°ï¼ç ç¹ï¼ä¸å¾å°äºè¯¥å±æ§çå¼ãå¯¹äº <textarea>
ï¼æææ¢è¡ç¬¦é½è¢«è§èå为ä¸ä¸ªå符ï¼ç¸å¯¹äº CRLF 对ï¼ã tooShort
约æè¿å maxlength
text
ãsearch
ãurl
ãtel
ãemail
ãpassword
ï¼ä¹å¨ <textarea>
å
ç´ ä¸å¯ç¨ ä¸ä¸ªæ´æ°é¿åº¦ å符æ°ï¼ç ç¹ï¼ä¸å¾è¶
è¿è¯¥å±æ§çå¼ã tooLong
约æè¿å 约æéªè¯è¿ç¨
约æéªè¯æ¯éè¿çº¦æéªè¯ API å¨å个表åå
ç´ ä¸æå¨è¡¨åå±é¢ä¸ï¼éè¿ <form>
å
ç´ æ¬èº«å®æã约æéªè¯æ¯éè¿ä»¥ä¸æ¹å¼å®æçï¼
HTMLInputElement
ãHTMLSelectElement
ãHTMLButtonElement
ãHTMLOutputElement
æ HTMLTextAreaElement
ï¼ç checkValidity()
æ reportValidity()
æ¹æ³ï¼åªå¯¹è¿ä¸ªå
ç´ è¿è¡çº¦æè¯ä¼°ï¼å
è®¸èæ¬è·å¾è¿äºä¿¡æ¯ãcheckValidity()
æ¹æ³è¿åä¸ä¸ªå¸å°å¼ï¼è¡¨ç¤ºè¯¥å
ç´ ç弿¯å¦éè¿å
¶çº¦æï¼è¿é常æ¯ç±ç¨æ·ä»£çå¨ç¡®å®åªä¸ª CSS 伪类ï¼:valid
æ :invalid
éç¨æ¶å®æçï¼ãç¸åï¼reportValidity()
æ¹æ³ä¼åç¨æ·æ¥åä»»ä½çº¦æå¤±è´¥çæ
åµãHTMLFormElement
æ¥å£ä¸ç checkValidity()
æ reportValidity()
æ¹æ³ãè°ç¨ checkValidity()
ä¹è¢«ç§°ä¸ºçº¦æçéæéªè¯ï¼è°ç¨ reportValidity()
ä¹è¢«ç§°ä¸ºçº¦æç交äºè®¤è¯ã
夿³¨ï¼
<form>
å
ç´ ä¸è®¾ç½®äº novalidate
屿§ï¼åä¸åç约æéªè¯äº¤äºãHTMLFormElement
æ¥å£ä¸è°ç¨ submit()
æ¹æ³å¹¶ä¸è§¦åçº¦ææ¡ä»¶éªè¯ãæ¢å¥è¯è¯´ï¼å³ä½¿è¡¨åæ°æ®ä¸æ»¡è¶³çº¦ææ¡ä»¶ï¼è¯¥æ¹æ³ä¹ä¼å°å
¶åéå°æå¡å¨ãå¨æäº¤æé®ä¸è°ç¨ click()
æ¹æ³æ¥ä»£æ¿ãä½¿ç¨ JavaScript å约æéªè¯ APIï¼å¯ä»¥å®ç°æ´å¤æç约æï¼ä¾å¦ï¼ç»åå ä¸ªåæ®µç约æï¼ææ¶åå¤æè®¡ç®ç约æã
åºæ¬ä¸ï¼è¿ä¸ªæ³æ³æ¯å¨æä¸ªè¡¨ååæ®µäºä»¶ï¼æ¯å¦ onchangeï¼ä¸è§¦å JavaScriptï¼ä»¥è®¡ç®æ¯å¦è¿å约æï¼ç¶åä½¿ç¨ field.setCustomValidity()
æ¹æ³æ¥è®¾ç½®éªè¯çç»æï¼ä¸ä¸ªç©ºå符串æå³çæ»¡è¶³çº¦ææ¡ä»¶ï¼ä»»ä½å
¶ä»å符串æå³çæä¸ä¸ªé误ï¼è¿ä¸ªåç¬¦ä¸²æ¯æ¾ç¤ºç»ç¨æ·çé误信æ¯ã
æ¯ä¸ªå½å®¶ç鮿¿ç¼ç é½ä¸ç¸åã大夿°å½å®¶å
许æä¸ä¸ªå¯éçå½å®¶ä»£ç åç¼ï¼å¦å¾·å½ç D-
ï¼æ³å½æç士ç F-
ï¼ï¼è¿æå
¶ä»ä¸äºå½å®¶ç鮿¿ç¼ç åªæåºå®çæ°åï¼å
¶ä»å½å®¶ï¼å¦è±å½ï¼ææ´å¤æçç»æï¼å
许å¨ä¸äºç¹å®çä½ç½®æåæ¯ã
夿³¨ï¼ è¿ä¸æ¯ä¸ä¸ªå ¨é¢ç鮿¿ç¼ç éªè¯åºï¼èæ¯å ³é®æ¦å¿µçæ¼ç¤ºã
ä½ä¸ºç¤ºä¾ï¼æä»¬ä¼å以ä¸è¿ä¸ªç®åç表å䏿·»å 䏿®µä»£ç æ¥è¿è¡çº¦æéªè¯ï¼
<form>
<label for="ZIP">ZIP ç ï¼</label>
<input type="text" id="ZIP" />
<label for="Country">å½å®¶ï¼</label>
<select id="Country">
<option value="ch">ç士</option>
<option value="fr">æ³å½</option>
<option value="de">å¾·å½</option>
<option value="nl">è·å
°</option>
</select>
<input type="submit" value="éªè¯" />
</form>
以ä¸ä»£ç æ¾ç¤ºäºåè¿æ ·ç表åï¼
é¦å ï¼æä»¬æ¥åä¸ä¸ªå½æ°æ¥æ£æ¥æ¬èº«å å«ç约æï¼
function checkZIP() {
// 为æ¯ä¸ªå½å®¶å®ä¹ ZIP ç éè¦æ»¡è¶³ç模å¼
const constraints = {
ch: [
"^(CH-)?\\d{4}$",
"ç士ç ZIP ç å¿
é¡»æ°å¥½æ 4 使°åï¼å¦ CH-1950 æ 1950",
],
fr: [
"^(F-)?\\d{5}$",
"æ³å½ç ZIP ç å¿
é¡»æ°å¥½æ 5 使°åï¼å¦ F-75012 æ 75012",
],
de: [
"^(D-)?\\d{5}$",
"å¾·å½ç ZIP ç å¿
é¡»æ°å¥½æ 5 使°åï¼å¦ D-12345 æ 12345",
],
nl: [
"^(NL-)?\\d{4}\\s*([A-RT-Z][A-Z]|S[BCE-RT-Z])$",
"è·å
°ç ZIP ç å¿
é¡»æ°å¥½æ 4 使°åï¼åè·é¤ SAãSD å SS ç 2 ä½åæ¯",
],
};
// 读åå½å®¶ ID
const country = document.getElementById("Country").value;
// è·å NPA åæ®µå
容
const ZIPField = document.getElementById("ZIP");
// æå»ºçº¦ææ£æ¥å¨
const constraint = new RegExp(constraints[country][0], "");
console.log(constraint);
// æ£æ¥å®ï¼
if (constraint.test(ZIPField.value)) {
// ZIP ç æ»¡è¶³çº¦ææ¡ä»¶ï¼æä»¬ä½¿ç¨ Constraint API åç¥ç¨æ·
ZIPField.setCustomValidity("");
} else {
// ZIP 䏿»¡è¶³çº¦ææ¡ä»¶ï¼æä»¬ä½¿ç¨ Constraint API åç¥è¯¥å½å®¶æéç ZIP ç æ ¼å¼
ZIPField.setCustomValidity(constraints[country][1]);
}
}
ç¶åæä»¬æå®é¾æ¥å° <select>
ç onchange äºä»¶å <input>
ç oninput äºä»¶ã
window.onload = () => {
document.getElementById("Country").onchange = checkZIP;
document.getElementById("ZIP").oninput = checkZIP;
};
éå¶æä¸ä¼ æä»¶ç大å°
å¦ä¸ä¸ªå¸¸è§ççº¦ææ¯éå¶è¦ä¸ä¼ çæä»¶ç大å°ãå¨æä»¶ä¼ è¾å°æå¡å¨ä¹åï¼å¨å®¢æ·ç«¯æ£æ¥è¿ä¸ªé®é¢éè¦å°çº¦ææ¡ä»¶éªè¯ APIï¼ç¹å«æ¯ field.setCustomValidity()
æ¹æ³ï¼ä¸å¦ä¸ä¸ª JavaScript API ç»åèµ·æ¥ï¼è¿éæ¯æä»¶ APIã
è¿éæ¯ HTML é¨åï¼
<label for="FS">éæ©ä¸ä¸ªå°äº 75 kB çæä»¶ï¼</label>
<input type="file" id="FS" />
伿¾ç¤ºï¼
JavaScript 代ç ä¼è¯»åæéçæä»¶ï¼ä½¿ç¨ File.size()
æ¹æ³æ¥è·åå
¶å¤§å°ï¼å°å
¶ä¸ï¼ç¡¬ç¼ç çï¼éå¶è¿è¡æ¯è¾ï¼å¦ææè¿åï¼åè°ç¨çº¦æ API æ¥éç¥æµè§å¨ã
function checkFileSize() {
const FS = document.getElementById("FS");
const files = FS.files;
// 妿鿩äºï¼è³å°ï¼ä¸ä¸ªæä»¶
if (files.length > 0) {
if (files[0].size > 75 * 1024) {
// æ£æ¥çº¦ææ¡ä»¶
FS.setCustomValidity("éæ©çæä»¶ä¸è½è¶
è¿ 75 kB");
return;
}
}
// 没æè¿åèªå®ä¹çº¦ææ¡ä»¶
FS.setCustomValidity("");
}
æç»ï¼æä»¬å°è¿ä¸ªæ¹æ³é¾æ¥å°ä¸ä¸ªæ£ç¡®çäºä»¶ä¸ï¼
window.onload = () => {
document.getElementById("FS").onchange = checkFileSize;
};
约æéªè¯çå¯è§åæ ·å¼
é¤äºè®¾ç½®çº¦ææ¡ä»¶å¤ï¼web å¼åè è¿æ³æ§å¶åç¨æ·æ¾ç¤ºä»ä¹ä¿¡æ¯ä»¥åå®ä»¬çæ ·å¼ã
æ§å¶å ç´ çå¤è§å ç´ çå¤è§å¯ä»¥éè¿ CSS 伪类è¿è¡æ§å¶ã
:requiredã:optional CSS 伪类:required
å :optional
伪类å
许å¼åè
ç¼åéæ©å¨ï¼ä»¥å¹é
æ required
屿§ææ²¡æè¯¥å±æ§ç表åå
ç´ ã
åè§ :placeholder-shown
ã
:valid
å :invalid
伪类ç¨äºè¡¨ç¤º <input> å
ç´ ï¼æ ¹æ®è¾å
¥çç±»å设置ï¼è¿äºå
ç´ çå
容åå«å¯ä»¥éªè¯åæ æ³éªè¯ãè¿äºç±»å
è®¸ç¨æ·å¯¹ææææ æç表åå
ç´ è¿è¡æ ·å¼è®¾è®¡ï¼ä»¥ä½¿å
¶æ´å®¹æè¯å«æ ¼å¼æ£ç¡®æä¸æ£ç¡®çå
ç´ ã
以ä¸ä¸äºæ¹æ³å¯ä»¥æ§å¶è¿åçº¦ææ¡ä»¶çææ¬ï¼
以ä¸å
ç´ ä¸ç setCustomValidity(message)
æ¹æ³ï¼
<fieldset>
ã夿³¨ï¼å¤§å¤æ°æµè§å¨ä¸ï¼å¨ fieldset å
ç´ ä¸è®¾å®èªå®ä¹éªè¯ä¿¡æ¯ä¸ä¼é»æ¢è¡¨åæäº¤ã<input>
<output>
<select>
submit
ç <button>
å
ç´ ï¼æç±»å为 submit ç input
å
ç´ å建ãå
¶ä»ç±»åçæé®ä¸åä¸çº¦æéªè¯ã<textarea>
ValidityState
æ¥å£æè¿°äºç±ä¸è¿°å
ç´ ç±»åç validity
屿§è¿åç对象ãå®è¡¨ç¤ºä¸ä¸ªè¾å
¥å¼å¯è½æ æçåç§æ¹å¼ãå®ä»¬å
±åè§£éäºä¸ºä»ä¹ä¸ä¸ªå
ç´ ç弿¯æ æçï¼åä¸è½è¢«éªè¯ã
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4