首页 > 其他分享 >HTML5 表单验证

HTML5 表单验证

时间:2024-07-24 14:50:34浏览次数:9  
标签:false 验证 color 表单 HTML5 background input

0x01 概述

  • 表单验证的两种方式:

    1. form 表单提交到后台
    2. 无刷新页面的 ajax 提交

    以下内容主要为 form 表单验证

  • HTML5 表单基本特性与新特性:

    1. placeholder:输入框中的灰色文字提示

      <input placeholder="Enter username" />
      
    2. type:HTML5 新增类型

      color、date、email、number、range、search、tel、url 等

      <input type="color" />
      
    3. datalist:下拉框选择提示

      <input list="myList" />
      <datalist id="myList">
        <option value="1">Alex</option>
        <option value="2">Alice</option>
        <option value="3">Bob</option>
      </datalist>
      
    4. autocomplete:自动输入补全提示

      <input autocomplete="off" />
      
    5. autofocus:初始化页面后自动获取焦点

      <input autofocus />
      
    6. required:设置表单元素必填

      <input required />
      
      • 对于必填项,设置提交表单时做到不验证

        <form novalidate></form>
        

        <button formnovalidate></button>
        
    7. pattern:使用正则验证

      <input pattern="/^\d+$/" />
      

0x02 约束验证 API

  • HTML5 的约束验证 API 包括:

    1. willValidate:验证元素约束是否被符合
    2. validity:本质上是 validate state 对象,表示元素当前所处的验证状态
    3. validationMessage:描述与元素相关约束的失败信息
    4. checkValidity():判断元素是否满足任意约束
    5. setCustomValidity():设置自定义验证信息
  • validity 属性

    1. 表单与 JS

      <body>
        <form action="" method="POST">
          <input
            type="text"
            name="username"
            id="username"
            placeholder="Enter your username"
            required="required"
            pattern="^\d{4}$"
            autofocus
          />
          <input type="submit" value="Submit" />
        </form>
        <script type="text/javascript">
          let input = document.getElementById("username");
          console.log(input.validity);
          console.log(username.validity);
        </script>
      </body>
      
    2. 输出结果

      ValidityState {
          badInput: false
          customError: false
          patternMismatch: false
      	rangeOverflow: false
      	rangeUnderflow: false
      	stepMismatch: false
      	tooLong: false
      	tooShort: false
      	typeMismatch: false
      	valid: false
      	valueMissing: true
      }
      
      • badInput:用户是否提供了一个浏览器无法转换的输入
      • customError:setCustomValidity()
      • patternMismatch:pattern,正则是否匹配
      • rangeOverflow:max,是否超过最大时
      • rangeUnderflow:min,是否小于最小值
      • stepMismatch:step,步长是否匹配
      • tooLong:maxlength,是否过长
      • tooShort:minlength,是否过短
      • typeMismatch:类型是否匹配
      • valueMissing:required,数据是否必填
  • checkValidity() 方法

    • 如果元素没有满足该方法的任意约束,则返回 false
  • setCustomValidity() 方法

    • 设置自定义验证信息,用于即将实施与验证的约束来覆盖预定义的信息
    <body>
      <form action="" method="POST">
        <input type="text" id="username" value="" pattern="^\d{2}" oninput="checkit(this)" />
        <input type="submit" value="Submit" />
      </form>
      <script type="text/javascript">
        function checkit(obj) {
          const it = obj.validity
          if (it.valueMissing) {
            obj.setCustomValidity("注意,此项不能为空")
            obj.reportValidity()
          } else if (it.patternMismatch) {
            obj.setCustomValidity("请输入两位数字")
            obj.reportValidity()
          } else {
            obj.setCustomValidity("")
          }
        }
      </script>
    </body>
    

0x03 验证美化

(1)伪类

  1. :required:optional

    <head>
      <meta charset="UTF-8" />
      <style>
        input:required {
          background-color: #ff7777;
        }
    
        input:optional {
          background-color: #77ff77;
        }
    
        input[type="submit"] {
          background-color: white;
        }
      </style>
    </head>
    
    <body>
      <form action="" method="POST">
        <input type="text" required />
        <input type="text" pattern="^\d{6}" />
        <input type="submit" value="Submit" />
      </form>
    </body>
    
  2. :in-range:out-of-range

    <head>
      <meta charset="UTF-8" />
      <style>
        input:in-range {
          background-color: #ff7777;
        }
    
        input:out-of-range {
          background-color: #77ff77;
        }
    
        input[type="submit"] {
          background-color: white;
        }
      </style>
    </head>
    
    <body>
      <form action="" method="POST">
        <input type="number" min="5" max="10" />
        <input type="submit" value="Submit" />
      </form>
    </body>
    
  3. :valid:invalid

    <head>
      <meta charset="UTF-8" />
      <style>
        input:valid {
          background-color: #ff7777;
        }
    
        input:invalid {
          background-color: #77ff77;
        }
    
        input[type="submit"] {
          background-color: white;
        }
      </style>
    </head>
    
    <body>
      <form action="" method="POST">
        <input type="text" required />
        <input type="text" pattern="^\d{6}" />
        <input type="submit" value="Submit" />
      </form>
    </body>
    
  4. :read-only:read-write

    <head>
      <meta charset="UTF-8" />
      <style>
        input:read-only {
          background-color: #ff7777;
        }
    
        input:read-write {
          background-color: #77ff77;
        }
    
        input[type="submit"] {
          background-color: white;
        }
      </style>
    </head>
    
    <body>
      <form action="" method="POST">
        <input type="text" readonly />
        <input type="text" />
        <input type="submit" value="Submit" />
      </form>
    </body>
    

(2)事件

  1. oninput 事件
  2. oninvalid 事件
  3. onchange 事件

(3)自定义提示气泡

<body>
  <form action="" method="POST">
    <input type="tel" required />
    <input type="submit" value="Submit" id="submit" />
  </form>
  <script type="text/javascript">
    const form = document.querySelector("form");
    form.addEventListener("invalid", (e) => e.preventDefault(), true);
    form.addEventListener(
      "submit",
      (e) => {
        if (!this.checkValidity()) e.preventDefault();
      },
      true
    );
    document.getElementById("submit").addEventListener("click", () => {
      const errorMessages = document.querySelectorAll(".error-message");
      errorMessages.forEach((item) => item.parentNode.removeChild(item));
      const inVaildityFields = document.querySelectorAll(":invalid");
      inVaildityFields.forEach((item) =>
        item.parentNode.insertAdjacentHTML(
          "beforeend",
          `<div class="error-message">${item.validationMessage}</div>`
        )
      );
      if (inVaildityFields.length > 0) inVaildityFields[0].focus();
    })
  </script>
</body>

-End-

标签:false,验证,color,表单,HTML5,background,input
From: https://www.cnblogs.com/SRIGT/p/18320888

相关文章

  • Form表单随页面大小变动:大屏幕item占两行,小屏幕item占整行(对话框表单、页面树形表单、
    1、效果如下:对话框内的表单组件,大屏幕item占两行,小屏幕item占整行 实现:App.vue内写一个全局公共样式;随后再调用方法传入表单ref以及需要判断的宽度,判断类名是否添加  2、效果如下:页面表单及页面左侧tree右侧表单,利用媒体查询实现:大屏幕一行两个item,小屏幕一行一个item......
  • harmonyOS Next 实现验证码功能遇到的坑
    前言第一次写博记录学习harmonyOS开发的过程,文案功底差请见谅!场景刚开始学习harmonyOS开发,近期有一个翻译网报APP的需求,在登录的时候需要验证码过滤验证码机器人试错。参考https://blog.csdn.net/zcczero/article/details/137057040  感谢zcczero 大神的帖子可以直接拿......
  • 遇到有验证码的登陆框的爆破思路
    ***使用工具burpsuit、xp_CAPTCHA3.2(这两个工具网上一找一堆,我就不分享了,但是要注意捕获验证码的工具xp_CAPTCHA3.2最好基于python3.6以上版本运行)***模拟环境海洋网站(登陆界面)点击以下链接下载,利用phpstudy配置靶场海洋CMS-开源免费PHP影视系统,影视CMS,视频CMS,电影CMS,......
  • RV芯片验证工具链基础6--高级教程
    高级教程开放验证平台工具链的高级特性教程。picker目前已经支持使用vcs进行仿真,相关文档还在完善中回调函数利用回调处理电路事件异步编程利用异步模式简化回调消息驱动利用消息对电路和软件激励进行解耦验证框架MLVP验证框架。回调函数利用回调处理电路事......
  • 基于 HTML5 和 Canvas 开发的在线图片编辑器
    预览https://zaixianps.net技术栈HTML5:构建用户界面,提供语义化标签。CSS3:美化界面,增强用户体验。JavaScript:处理用户交互,管理Canvas操作。CanvasAPI:主要绘图工具,用于图像处理。项目结构image-editor/│├──index.html//主页面├──style.css//......
  • 织梦dedecms自定义表单选项必填怎么修改?
    我们先在plus/diy.php文件中的的第40行下加上一下代码//增加必填字段判断if($required!=&#39;&#39;){if(preg_match(&#39;/,/&#39;,$required)){$requireds=explode(&#39;,&#39;,$required);foreach($requiredsas$field){if($$field==&#39;&#39;){......
  • 白话理解Jwt验证
    一、jwt叫jsonwebtoken,也就是个token,这个token按照json格式在客户端与服务器之间传输。jwt的产生过程1.客户端提交用户、密码、验证码...2.服务端验证用户密码,通过后,随机成uuid,以服务端保密的secureKey,通过加密手段一般为HS512加密方式,加密成一串JSON密文,也就是jwt3......
  • react + Ant表单数据回调不更新
    刚学react,拿项目练手,有个问题恶心死了,折腾了好久,百度上也没找到很合适的,觉得有必要分享一下,不为别的,以后自己遇到了,再复习一下,方案不是最优解,但能解决问题业务描述   就是点击编辑,新增的时候,数据发生变化,我获取到了,第一次更新成功,后面就只会有第一次的值代码描述   ......
  • 如何解决虾皮抓取数据时验证流量错误?
    我目前正在开展一个项目,需要从Shopee抓取产品数据。我将Python与requests和BeautifulSoup库一起使用。但是,当我尝试访问某些页面时,我总是遇到验证流量错误。以前有人遇到过这个问题吗?如何绕过此验证或有效处理此错误?解决Shopee抓取数据时验证流量错误......
  • 实现登录验证,有3次机会,如果用户名为“丁真”,密码为“666”提示登录成功
    1importjava.util.Scanner;2publicclassexercise06{3//编写一个main方法4publicstaticvoidmain(String[]args){56//实现登录验证,有3次机会,如果用户名为“丁真”,密码为“666”提示登录成功,7//否则提示还有几次机会,请使用f......