1 前臺提交信息到後臺,兩種表單驗證: 2 1,form 表單驗證 3 2,ajax 無刷新頁面提交 4 5 表單驗證方法通常有: 6 1,瀏覽器端驗證 7 2,服務器端驗證 8 3,ajax驗證 9 4,瀏覽器和服務器雙重驗證 10 11 html5表單新增類型: 12 email,url,number,range,data(date,month,week,time,datetime,datetime-local),search,color,tel等 13 ======== 14 重點:pattern 和 list/datalist 15 表單驗證的一些特性: 16 required 必填 17 optional 選填 18 pattern 正則表達式 19 不驗證表單提交 novalidate (form屬性,寫在form中) / formnovalidate (submit屬性,即寫在提交按鈕中) 20 autocomplete 自動回填 聯想(off關閉聯想) 表單默認autocomplete聯想 21 enctype 發送信息到服務器以前,設置對錶單數據進行如何編碼,enctype="multipart/form-data" 22 是咱們在上傳文件的時候必須指定的 23 24 25 list/datalist重點: 26 <input type="text" name="" list="tips"> 27 <datalist id="tips"> 28 <option value="">111</option> 29 <option value="">111</option> 30 <option value="">111</option> 31 </datalist> 32 33 <!DOCTYPE html> 34 <html lang="en"> 35 <head> 36 <meta charset="UTF-8"> 37 <title>表單驗證pattern</title> 38 </head> 39 <body> 40 <form action="#" method="get" accept-charset="utf-8" autocomplete="off"> 41 <input type="file" id="file"> 42 <label for="">名稱:</label><input type="text" placeholder="請輸入名稱" required> 43 <label>工號:<input type="text" name="num" value="" placeholder="請輸五位數字和abcdef中的一個字母" required pattern="^\d{5}[abcdef]{1}$"></label> 44 <!-- 簡寫以下:input[type=text][list=tips]>datalist[id=tips]>option{可選}*5 --> 45 <input type="text" list="tips"> 46 <datalist id="tips"> 47 <option value="111"></option> 48 <option value="222"></option> 49 <option value="333"></option> 50 <option value="444"></option> 51 <option value="555"></option> 52 </datalist> 53 </input> 54 <input type="submit" name="" value="驗證提交"> 55 <input type="submit" name="" value="不驗證提交" formnovalidate> 56 </form> 57 </body> 58 </html> 59 60 在html5中,上傳文件時在發送數據到服務器以前,必須對錶單數據進行編碼,下列正確的: 61 62 A:text/plan,提交表單的時候,會對空格轉換爲 "+" 加號,但不對特殊字符編碼。 63 64 B: application/x-www-form-urlencoded是form表單默認的選項。 65 66 C:multipart/form-data是咱們在上傳文件的時候必須指定的。 67 68 D:而enctype="application/json"是json提交表單的聲明。 69 70 ========= 71 重點:聯想時,點擊指定值,輸入框背景變色,如何修改該背景色。其餘代碼與上例子同樣,就看工號就行。 72 解決方法二:直接在form中禁用自動聯想 autocomplete="off",再本身處理記住以前的信息。 73 <!DOCTYPE html> 74 <html lang="en"> 75 <head> 76 <meta charset="UTF-8"> 77 <title>表單驗證pattern</title> 78 <style type="text/css" media="screen"> 79 /* 工號輸入正確,屢次提交後,與工號輸入框再次得到焦點,點擊之前輸入的內容。輸入框的背景顏色變成系統默認的淡藍色/黃色。 80 修改該默認背景以下方法,爲了測試,能夠先註釋下面全部的CSS樣式。查看,必定記住必須屢次提交後才行。*/ 81 textarea:-webkit-autofill, 82 select:-webkit-autofill, 83 input:-webkit-autofill{ 84 -webkit-box-shadow:0 0 0 1000px #fff inset; 85 outline: none; 86 } 87 88 /*得到焦點時,取消默認外邊框*/ 89 input:focus,select:focus,textarea:focus{outline: none;} 90 </style> 91 </head> 92 <body> 93 <form action="#" method="get" accept-charset="utf-8" > 94 <input type="file" id="file"> 95 <label for="">名稱:</label><input type="text" placeholder="請輸入名稱" autocomplete required> 96 <label>工號:<input type="text" name="num" value="" placeholder="請輸五位數字和abcdef中的一個字母" required pattern="^\d{5}[abcdef]{1}$"></label> 97 <!-- 簡寫以下:input[type=text][list=tips]>datalist[id=tips]>option{可選}*5 --> 98 <input type="text" list="tips"> 99 <datalist id="tips"> 100 <option value="111"></option> 101 <option value="222"></option> 102 <option value="333"></option> 103 <option value="444"></option> 104 <option value="555"></option> 105 </datalist> 106 </input> 107 <select name=""> 108 <option value="">1111</option> 109 <option value="">222</option> 110 <option value="">333</option> 111 </select> 112 <input type="submit" name="" value="驗證提交"> 113 <input type="submit" name="" value="不驗證提交" formnovalidate> 114 </form> 115 </body> 116 </html> 117 ========= 118 html5 約束驗證API: 119 1, willValidate 屬性 表示若是元素的約束沒有被符合則值爲 false。 120 2, validity validityState 對象,表示元素如今所處的驗證狀態 121 3, validationMessage 用於描述與元素相關約束的失敗信息,千萬別成:validitionMassage.相差一個a。 122 4, checkValidity()方法 有一個約束條件沒有知足,則返回false,全部知足才返回true 123 <!-- checkValidity()方法的使用 修改value來測試 124 全部約束符合,返回true,不然返回false。 125 --> 126 <body> 127 <input type="email" required placeholder="請輸入郵箱" id="email" value="1111@qq.com"> 128 <input type="text" required placeholder="請輸入工號3位數字" pattern="^\d{3}" id="user" value="111"> 129 </body> 130 <script type="text/javascript"> 131 console.log(email.checkValidity()); 132 console.log(user.checkValidity()); 133 if (user.checkValidity()) { 134 console.log('用戶名輸入正確!'); 135 }else{ 136 console.log("用戶名輸入有誤,請輸入3個數字。"); 137 } 138 </script> 139 140 5, setCustomValidity(string)方法 切記是dom的屬性,不是validityState對象,設置自定義的驗證信息來覆蓋瀏覽器默認的提示信息,string自定義的提示信息 141 142 <!-- setCustomValidity("格式不對,請從新輸入!"); --> 143 <body> 144 <form action="from_submit" method="get" accept-charset="utf-8"> 145 <input type="text" required placeholder="請輸入工號3位數字" pattern="^\d{3}" id="user" required> 146 <input type="submit" onclick="checkit()"> 147 </form> 148 </body> 149 <script type="text/javascript"> 150 function checkit(){ 151 var it = document.getElementById("user"); 152 var vd = it.validity; 153 // console.log(vd.valueMissing); 154 // console.log(vd.patternMismatch); 155 if (vd.valueMissing) { 156 it.setCustomValidity("內容不能爲空!"); 157 }else{ 158 if (vd.patternMismatch) { 159 it.setCustomValidity("格式不正確,請從新輸入!"); 160 }else{ 161 it.setCustomValidity(""); 162 } 163 } 164 } 165 </script> 166 167 168 169 validity validityState 對象,表示元素如今所處的驗證狀態 170 輸出某個對象的validity,如:console.log(document.getElementById("user")); 171 172 在控制檯輸出validityState對象信息以下: 173 174 ValidityState {valueMissing: true, typeMismatch: false, patternMismatch: false, tooLong: false, tooShort: false, …} 175 badInput: false 表示:用戶提供了一個瀏覽器不能轉換的input 176 customError: false 對應setCusotomValidity()方法,用戶自定義了錯誤信息返回ture,不然返回false. 177 patternMismatch: false 對應pattern屬性,規定用於驗證表單元素的值的正則表達式。 178 rangeOverflow: false 對應max屬性,規定number的最大值,溢出返回true,不然返回false. 179 rangeUnderflow: false 對應min屬性,規定number的最小值,溢出返回true,不然返回false. 180 stepMismatch: false 對應step屬性,規定表單元素的合法數字間隔。 181 tooLong: false 對應maxlength屬性,規定文本區域的最大長度(以字符計)。 182 tooShort: false 對應minlength屬性,規定文本區域的最小長度(以字符計)。 183 typeMismatch: false 類型不匹配,如:設置email,但輸入的是:dddd,就返回true,不然返回false。 184 valid: false 只要上下文的全部屬性返回是false,就會返回true. 185 valueMissing: true 對應required設置表單必填 186 187 188 <!--dom.validity 在控制檯輸出validityState對象信息驗證以下: --> 189 <!DOCTYPE html> 190 <html lang="en"> 191 <head> 192 <meta charset="UTF-8" /> 193 <title>Document</title> 194 </head> 195 <style type="text/css" media="screen"> 196 input[type="search"]::-webkit-search-cancel-button{-webkit-appearance: none;width: 15px;height: 15px;background-color: red;} 197 198 #num1::-webkit-inner-spin-button, 199 #num1::-webkit-outer-spin-button{-webkit-appearance: none;margin: 0;} 200 </style> 201 <body> 202 <form action="" method="get" id="forms"> 203 <input type="text" id="username" required maxlength="5" minlength="2" value="22222222" placeholder="請輸入5位用戶名"> 204 <input type="email" id="email" required value="aaaaa@qq.com" placeholder="請輸入郵箱"> 205 206 <input type="text" placeholder="請輸入工號" id="num" pattern="^\d{5}[abcdef]$" value="12345cddd"> 207 <input type="number" placeholder="請輸入年齡" max="10" min="3" id="age" value="" required oninput="checkLength(this,2)" > 208 <input type="number" step="0.01" value="0.05" placeholder="請輸入數字" id="num1"> 209 210 <input type="search" placeholder="輸入搜索內容"> 211 <input type="submit" value="提交" id="submitBtn"> 212 </form> 213 <script> 214 //如下全等,不推薦直接使用id,由於容易和變量混淆,不易維護。id是h5的新屬性 215 console.log(username === document.getElementById("username")); 216 217 /*tooLong: false 對應max屬性 在控制檯查看 218 tooShort: false 對應min屬性,無論如何設置max ,min 這兩個值是恆等於false的*/ 219 console.log(username.validity); 220 221 // typeMismatch: true 對應type="email" 在控制檯查看 輸入信息類型匹配錯誤 222 console.log(email.validity); 223 224 // patternMismatch: true 對應pattern屬性,上訴默認值value="12345cddd" 不匹配pattern表達式 225 // 沒有寫required,因此空值能夠提交 valueMissing: false 對應required屬性,因此null也是一個值。 226 console.log(num.validity); 227 228 /*value > 10 對應的 rangeOverflow: true 229 value < 3 對應的 rangeUnderflow: true 230 value 沒有設置,且設置了 required 屬性,那麼 valueMissing: true,即:缺乏值 爲 真 231 控制用戶只能輸入指定的位數,maxlength="10" 這是不行的。只能使用js進行控制。 232 */ 233 console.log(age.validity); 234 // 使用js進行控制只能輸入的位數 235 function checkLength(obj,length){ 236 obj.value=obj.value.substr(0,length); 237 console.log(obj.value);//控制檯輸出該值 238 } 239 240 /*要求保留兩位小數,只能設置 step="0.01",這樣提交後臺時才能保留兩位小數。 241 若是隻設置 value="0.01",那麼系統提交後臺時,會去掉後面小數,只保留整數。謹記! 242 step 對應 stepMismatch:false 基本是恆等的 243 */ 244 console.log(num1.validity); 245 </script> 246 </body> 247 </html> 248 249 250 <!-- 經過輸入信息不匹配,輸出不匹配信息提示,DOM.validationMessage --> 251 <!DOCTYPE html> 252 <html lang="en"> 253 <head> 254 <meta charset="UTF-8" /> 255 <title>Document</title> 256 </head> 257 <body> 258 <form action="" method="get" id="forms"> 259 <input type="text" id="username" required> 260 <input type="email" placeholder="請輸入郵箱" value="aaaa" required> 261 <input type="url" placeholder="請輸入網址" value="sdfa" required> 262 <input type="submit" value="提交" id="submitBtn"> 263 </form> 264 <script> 265 var form = document.getElementById("forms"), 266 val = null; 267 submitBtn = document.getElementById("submitBtn"); 268 submitBtn.addEventListener("click", function() { 269 var invalidFields = form.querySelectorAll(":invalid"); 270 for (var i = 0; i < invalidFields.length; i++) { 271 console.log(invalidFields[i].validationMessage); 272 } 273 }); 274 </script> 275 </body> 276 </html> 277 278 ============ 279 280 HTML5自帶驗證美化,涉及的僞類及CSS選擇器 281 1,:required 和 :optional 必填/選填 282 2,:in-range 和 :out-of-range 在範圍以內/不在範圍以內 一般與type="number" max 和 min 相對應 283 3,:valid 和 :invalid 符合驗證/不符合驗證 284 4,:read-only 和 :read-write 只讀/讀寫 285 <div contenteditable="true">能夠讀寫的div,contenteditable是能夠被 :read-write 匹配的,當值爲false時,則不能寫</div> 286 287 288 <!-- 使用僞類 :required 和 :optional 美化表單的基本樣式 --> 289 去除webkit內核中表單的默認樣式,通常用 -webkit-appearance: none。再進行自定義設置 290 291 <!DOCTYPE html> 292 <html lang="en"> 293 <head> 294 <meta charset="UTF-8"> 295 <title>經常使用表單樣式</title> 296 </head> 297 <style type="text/css" media="screen"> 298 /*設置容器屬性*/ 299 .container{max-width: 400px;margin: 20px auto;} 300 301 /*表單公共樣式*/ 302 input,select,textarea{width: 240px;line-height:20px;margin: 10px 0;border: 1px solid #999;} 303 label{color:#999;margin-left: 10px;} 304 input[type="radio"]{width: 20px;} 305 input[type="radio"]+label:after{content: ""!important;} 306 307 /*在search搜索框輸入內容時,移除右邊的叉號按鈕樣式 308 在PC端徹底沒問題,在手機端-webkit-有可能存在 一些問題,因此手機端不推薦使用該種方式,儘可能使用原生代碼進行操做 309 */ 310 #search1::-webkit-search-cancel-button{-webkit-appearance: none;width: 15px;height: 15px;background-color: red;} 311 312 /*必填/選填表單的右邊框樣式*/ 313 input:required,textarea:required{border-right: 3px solid #aa0088;} 314 input:optional,select:optional{border-right: 3px solid #999;} 315 316 /*必填/選填表單後面第一個兄弟label 添加after僞類*/ 317 input:required+label::after{content: "(必填)"} 318 input:optional+label::after{content: "(選填)"} 319 320 /*清除表單獲取焦點時的默認外邊框*/ 321 input:focus,select:focus,textarea:focus{outline: none;} 322 323 /*必填/選填表單獲取焦點時的樣式*/ 324 input:required:focus,textarea:required:focus{box-shadow: 0 0 3px 1px #aa0088;} 325 input:optional:focus,select:optional:focus{box-shadow: 0 0 3px 1px #999;} 326 327 /*提交按鈕樣式*/ 328 input[type="submit"]{background: #ccc;padding: 3px 0;} 329 input[type="submit"]:hover{background: #aa0088;color: #fff} 330 331 /*文本域不可改變寬高*/ 332 textarea{resize:none;} 333 </style> 334 <body> 335 <div class="container"> 336 <form action="#" method="get" accept-charset="utf-8"> 337 <input type="name" required><label for="">名稱</label> 338 339 <input type="email" required id="email"><label for="">郵箱</label> 340 <input type="tel" ><label for="">電話</label> 341 <input type="url" ><label for="">網址</label> 342 <input type="search" id="search1" placeholder="輸入時,修改叉號圖標"> 343 <input type="search" id="search2" placeholder="輸入時,有叉號的輸入框"> 344 <div> 345 <label for="man">男:</label><input type="radio" id="man" name="sex"> 346 <label for="woman">女:</label><input type="radio" id="woman" name="sex"> 347 </div> 348 <select name="" > 349 <option value="">非必填選項一</option> 350 <option value="">非必填選項二</option> 351 <option value="">非必填選項三</option> 352 <option value="">非必填選項四</option> 353 </select> 354 <textarea name="" rows="5" cols="30" placeholder="留言(選填31)" required></textarea> 355 <input type="submit" value="表單提交"> 356 </form> 357 </div> 358 <script type="text/javascript"> 359 //如下兩個是全等的,可是極力不推薦直接使用id進行操做,1,容易與變量混淆,不易閱讀和維護。2,id 是html5的新屬性。 360 console.log(document.getElementById("email") === email); 361 console.log(document.getElementById("email") === 'email'); 362 363 // 輸出指定對象的validity屬性對象,validity是一個validityState對象 364 var ema = document.getElementById("email"); 365 console.log(ema.validity); 366 </script> 367 </body> 368 </html> 369 ========= 370 注意點: 371 input[type="email"]:focus:invalid~label::after{content: "格式不對!";color: red;} 372 這裏是有順序的:先獲取焦點,再驗證不符合的input後面的label 後面添加樣式 373 374 <!-- 使用僞類 :valid 和 :invalid 符合驗證/不符合驗證 美化表單的基本樣式 --> 375 <!DOCTYPE html> 376 <html lang="en"> 377 <head> 378 <meta charset="UTF-8"> 379 <title>僞類 :valid 和 :invalid</title> 380 <style type="text/css" media="screen"> 381 .container{position: relative;margin: 200px;} 382 input[type="email"]{width: 140px;height: 30px;line-height: 30px;border: 1px solid #999;text-indent: 36px;transition: all .3s;outline: none;border-radius: 5px;} 383 span.title{position: absolute;left: 2px;height: 30px;line-height: 30px;transition: all .3s;} 384 /*鼠標懸浮,得到焦點時的操做*/ 385 input[type="email"]:focus,input[type="email"]:hover{text-indent: 5px;} 386 input[type="email"]:focus+span.title,input[type="email"]:hover+span.title{transform: translateX(-120%);} 387 388 /*使用僞類 :valid / :invalid 符合驗證 / 不符合驗證來寫CSS*/ 389 input[type="email"]:valid~label::after{content:"格式正確!";color: green;} 390 input[type="email"]:valid{border: 1px solid green;} 391 input[type="email"]:focus:invalid~label::after{content: "格式不對!";color: red;} 392 input[type="email"]:focus:invalid{border: 1px solid red;} 393 </style> 394 </head> 395 <body> 396 <div class="container"> 397 <input type="email" required placeholder="請輸入郵箱" id="email"> 398 <span class="title">郵箱:</span> 399 <label for="email"></label> 400 </div> 401 </body> 402 </html> 403 404 ======== 405 406 HTMLL5 自帶美化驗證 之 事件篇 407 1,oninput事件 408 2,oninvalid事件 409 3,onchange事件 410 411 注意點: 412 1,input表單前面的label 對齊,能夠把label設置成行內跨元素,設置width。label內容便可對齊。 413 2,給input設置背景圖片,做爲必填圖標的設置。 414 3,oninput/oninvalid 事件 415 oninput="this.setCustomValidity('')" 表示輸入時觸發事件,修改默認提示信息爲空。 416 oninvalid="this.setCustomValidity('請輸入正確手機號碼')" 進行表單驗證不經過,直接修改提示信息 417 4,小技巧: select 第一個option沒有做爲選項時,必定要把value設置爲空,不然樣式設置會出現異常。 418 <select name="know" id="know" required oninvalid="this.setCustomValidity('請在下列選項中選擇一項:')"> 419 <option value="">==請選擇==</option> 420 <option value="2">搜索引擎</option> 421 <option value="3">朋友圈</option> 422 </select> 423 424 用戶輸入或者值發生變化時,會馬上觸發什麼事件:B 425 A:onchange事件雖然觸發值會發生變化,但不是馬上觸發,要鼠標失去焦點時才能觸發。 426 B:oninput會在值發生變化時立馬觸發 。 427 C:oninvalid是在不符合驗證的時候觸發。 428 D:onfocus是在得到焦點的時候觸發 。 429 430 431 432 <!DOCTYPE html> 433 <html lang="en"> 434 <head> 435 <meta charset="UTF-8"> 436 <title>Document</title> 437 <style> 438 .onelist{margin: 10px} 439 /*只要涉及到對齊問題,均可以使用display屬性來調整,這裏的label是最典型的例子*/ 440 .onelist label{width: 80px;display: inline-block;} 441 .onelist input,.onelist select{height:25px;line-height: 25px;width: 220px;border-radius: 3px;border: 1px solid #e2e2e2;padding: .3em .5em;} 442 443 /* input:required,select:required{background: #fff url(img/star.jpg) no-repeat 90% center;} 444 input:required:valid,select:required:valid{box-shadow: 0 0 0 3px green;background: #fff url(img/right.png) no-repeat 90% center;border-color: green;} 445 input:focus:invalid,select:focus:invalid{box-shadow: 0 0 0 3px red;background: #fff url(img/error.png) no-repeat 90% center;border-color: red; outline: 1px solid red;} */ 446 select:required, 447 input:required, 448 textarea:required { 449 background: #fff url(img/star.jpg) no-repeat 90% center; 450 } 451 452 select:required:valid, 453 input:required:valid, 454 textarea:required:valid { 455 background: #fff url(img/right.png) no-repeat 90% center; 456 box-shadow: 0 0 5px #5cd053; 457 border-color: #28921f; 458 } 459 460 select:focus:invalid, 461 input:focus:invalid, 462 textarea:focus:invalid { 463 background: #fff url(img/error.png) no-repeat 90% center; 464 box-shadow: 0 0 5px red; 465 border-color: red; 466 outline: red solid 1px; 467 } 468 </style> 469 </head> 470 <body> 471 <form action="#" class="myform"> 472 <div class="onelist"> 473 <label for="UserName">手機號:</label> 474 <input type="text" required id="UserName" name="UserName" placeholder="請輸入手機號" pattern="^1[0-9]{10}$" required oninput="this.setCustomValidity('')" oninvalid="this.setCustomValidity('請輸入正確手機號碼')"> 475 </div> 476 <div class="onelist"> 477 <label for="Password">密碼:</label> 478 <input type="password" name="Password" id="Password" pattern="^[a-zA-Z0-9]\w{5,19}$" placeholder="6~20位" required oninvalid="this.setCustomValidity('請輸入正確密碼!')" oninput="this.setCustomValidity('')" onchange="checkpassword()"> 479 </div> 480 <div class="onelist"> 481 <label for="Repassword">確認密碼:</label> 482 <input type="password" name="Repassword" id="Repassword" placeholder="確認密碼" required oninput="this.setCustomValidity('')" onchange="checkpassword()"> 483 </div> 484 <div class="onelist"> 485 <label for="know">瞭解方式:</label> 486 <select name="know" id="know" required oninvalid="this.setCustomValidity('請在下列選項中選擇一項:')"> 487 <option value="">==請選擇==</option> 488 <option value="2">搜索引擎</option> 489 <option value="3">朋友圈</option> 490 <option value="4">朋友推廣</option> 491 <option value="5">廣告投放</option> 492 </select> 493 </div> 494 <div class="onelist"> 495 <input type="submit" value="提 交"> 496 </div> 497 </form> 498 <script type="text/javascript"> 499 function checkpassword(){ 500 var pwd1 = document.getElementById('Password'), 501 pwd2 = document.getElementById('Repassword'); 502 if (pwd1.value != pwd2.value) { 503 pwd1.setCustomValidity('兩次密碼輸入不一致,請從新輸入!'); 504 }else{ 505 pwd1.setCustomValidity(''); 506 } 507 } 508 </script> 509 </body> 510 </html> 511 512 ========= 513 514 輸出:用戶輸入信息不匹配的信息提示。:validationmessage 515 <!DOCTYPE html> 516 <html lang="en"> 517 <head> 518 <meta charset="UTF-8" /> 519 <title>Document</title> 520 </head> 521 <body> 522 <form action="" method="get" id="forms"> 523 <input type="text" id="username" required> 524 <input type="email" placeholder="請輸入郵箱" required> 525 <input type="url" placeholder="請輸入網址" required> 526 <input type="submit" value="提交" id="submitBtn"> 527 </form> 528 <script> 529 var form = document.getElementById("forms"), 530 val = null; 531 submitBtn = document.getElementById("submitBtn"); 532 submitBtn.addEventListener("click", function() { 533 var invalidFields = form.querySelectorAll(":invalid"); 534 for (var i = 0; i < invalidFields.length; i++) { 535 console.log(invalidFields[i].validationMessage); 536 } 537 }); 538 </script> 539 </body> 540 </html> 541 542 ========= 543 544 <!-- H5表單美化,修改默認氣泡 --> 545 重點: 546 一,表單提交後,發生事件順序以下: 547 (1)submit按鈕的click事件,若取消默認事件,則終止 548 (2)html5表單驗證和提示,若表單驗證不經過,則提示第一個不合法輸入,並終止 549 (3)form表單的submit事件,若取消默認事件,則終止 550 因此,HTML5自帶的驗證,發生在表單的onsubmit事件以前,自定義以前必須阻止瀏覽器默認錯誤信息提示。 551 552 二,封裝自定義錯誤信息氣泡提示,能夠無限調用。 553 554 三,調用時必須知足三個條件, 555 1,寫好錯誤信息樣式 .error-message 樣式。 556 2,獲取表單對象 form. 557 3,獲取提交按鈕對象 submitBtn. 558 559 560 谷歌瀏覽器29版本以前,後面廢棄了,用下面僞元素修改默認氣泡樣式: ::-webkit-validation-bubble 561 1,使用第三方插件 562 2,本身建立氣泡 563 a,阻止默認氣泡 564 b,建立新的氣泡 565 566 <!DOCTYPE html> 567 <html lang="en"> 568 <head> 569 <meta charset="UTF-8"> 570 <title>H5表單美化,修改默認氣泡</title> 571 <style> 572 .oneline{line-height: 1.5;margin: 10px auto;} 573 .oneline label{width: 100px;text-indent: 15px;font-size: 14px;font-family: "微軟雅黑";display: inline-block;} 574 .oneline .sinput{width: 60%;height: 30px;border-radius: 6px;border: 1px solid #e2e2e2;} 575 .oneline input[type="submit"]{margin-left: 20px; width: 100px;height: 30px;border: 0;background-color: #5899d0;color: #fff;font-size: 14px;border-radius: 6px;} 576 .error-message{color: red;font-size: 12px;text-indent: 108px;} 577 </style> 578 </head> 579 <body> 580 <form action="#" id="forms"> 581 <div class="oneline"> 582 <label for="name">用戶名:</label> 583 <input type="text" id="name" class="sinput" name="name" required> 584 </div> 585 <div class="oneline"> 586 <label for="email">郵箱:</label> 587 <input type="email" id="email" class="sinput" name="email" required> 588 </div> 589 <div class="oneline"> 590 <input type="submit" id="thesubmit" value="提 交"> 591 </div> 592 </form> 593 <script type="text/javascript"> 594 595 // 自定義封裝表單氣泡,能夠無限調用 596 //封裝表單自定義錯誤信息提示 (阻止表單默認信息提示,添加自定義錯誤信息提示) 597 function replaceInvalidityUi(form,submitBtn){ 598 //阻止表單驗證不經過時觸發的默認事件 599 form.addEventListener('invalid',function(event){ 600 event.preventDefault(); 601 },true) 602 603 //阻止提交按鈕提交時觸發的默認事件 604 form.addEventListener('submit',function(event){ 605 event.preventDefault(); 606 },true) 607 608 //監聽提交按鈕的單擊事件 609 submitBtn.addEventListener("click", function(event) { 610 var inValidityField = form.querySelectorAll(":invalid"),//全部驗證不經過的對象 611 errorMessage = form.querySelectorAll(".error-message"),//全部錯誤信息,瀏覽器默認錯誤信息類名 612 parent; 613 614 //移除全部默認錯誤信息提示 615 for (var i = 0; i < errorMessage.length; i++) { 616 errorMessage[i].parentNode.removeChild(errorMessage[i]); 617 } 618 //添加自定義錯誤信息提示,只有不符合驗證的纔會添加錯誤信息,經過驗證的input後面不會添加錯誤信息 619 for (var i = 0; i < inValidityField.length; i++) { 620 parent = inValidityField[i].parentNode; 621 parent.insertAdjacentHTML("beforeend", "<div class='error-message'>" + inValidityField[i].validationMessage + "</div>") 622 } 623 //若是存在錯誤信息,則直接在第一個錯誤信息的input位置獲取焦點。 624 if (inValidityField.length > 0) { 625 inValidityField[0].focus(); 626 } 627 }) 628 } 629 630 var submitBtn = document.getElementById("thesubmit"); 631 var form = document.getElementById("forms"); 632 replaceInvalidityUi(form,submitBtn); 633 </script> 634 </body> 635 </html> 636 637 ============ 638 關於 element.insertAdjacentHTML(position,text); 給element 相鄰的 位置添加內容 639 adjacent 英[əˈdʒeɪsnt] 與…毗連的; 鄰近的; 640 641 <!DOCTYPE html> 642 <html lang="en"> 643 <head> 644 <meta charset="UTF-8"> 645 <title>Document</title> 646 <style> 647 #one{background-color: red;color: #fff;} 648 ol{ 649 border: 1px solid #999; 650 } 651 .love{color: blue} 652 </style> 653 </head> 654 <body> 655 <div class="container"> 656 <div>內容1</div> 657 <div>內容2</div> 658 <div id="one">內容3</div> 659 <div>內容4</div> 660 <div>內容5</div> 661 <div>內容6</div> 662 </div> 663 <div> 664 <hr> 665 <!-- 給某個dom元素的指定位置添加內容 --> 666 element.insertAdjacentHTML(position, text); 667 'beforebegin': Before the element itself. 在該元素前面添加內容(外部添加內容)<br/> 668 'afterbegin': Just inside the element, before its first child.在該元素內部 第一個子元素前面 添加內容<br/> 669 'beforeend': Just inside the element, after its last child.在該元素內部 最後一個子元素後面 添加內容<br/> 670 'afterend': After the element itself.在該元素後面添加內容(外部添加內容) 671 </div> 672 <script type="text/javascript"> 673 var one = document.querySelector('#one'); 674 one.insertAdjacentHTML('beforebegin',"<b class='love'>"+"beforebegin"+'</b>'); 675 one.insertAdjacentHTML('afterbegin',"<b class='love'>"+"afterbegin"+'</b>'); 676 one.insertAdjacentHTML('beforeend',"<b class='love'>"+"beforeend"+'</b>'); 677 one.insertAdjacentHTML('afterend',"<b class='love'>"+"afterend"+'</b>'); 678 </script> 679 </body> 680 </html>