Skip to content

表单组件

http://layui.dev/docs/2.8/form

表单组件 form 是包含输入框、选择框、复选框、开关、单选框等表单项组件的集合,主要用于对表单域进行各类动态化渲染和相关的交互操作。form是 Layui 最常用的组件之一。

表单布局

form 组件自身的普通布局。其要点为:

  • 通过 class="layui-form" 定义一个表单域,通常设置在 <form> 标签上, 或普通 <div> 标签亦可。
  • 通过 class="layui-form-item" 定义一个块级元素的表单项容器
  • 通过 class="layui-form-label" 定义标签
  • 通过 class="layui-form-block" 定义表单项父容器为块级元素
  • 通过 class="layui-form-inline"class="layui-inline" 定义表单项父容器为行内块元素

即必须按照规定的层级定义相应的 class

官网注册页面案例

html
<body>
  <style>
    .demo-reg-container {
      width: 320px;
      margin: 21px auto 0;
    }

    .demo-reg-other .layui-icon {
      position: relative;
      display: inline-block;
      margin: 0 2px;
      top: 2px;
      font-size: 26px;
    }
  </style>
  <form class="layui-form">
    <div class="demo-reg-container">
      <div class="layui-form-item">
        <div class="layui-row">
          <div class="layui-col-xs7">
            <div class="layui-input-wrap">
              <div class="layui-input-prefix">
                <i class="layui-icon layui-icon-cellphone"></i>
              </div>
              <input
                type="text"
                name="cellphone"
                value=""
                lay-verify="required|phone"
                placeholder="手机号"
                lay-reqtext="请填写手机号"
                autocomplete="off"
                class="layui-input"
                id="reg-cellphone"
              />
            </div>
          </div>
          <div class="layui-col-xs5">
            <div style="margin-left: 11px;">
              <button
                type="button"
                class="layui-btn layui-btn-fluid layui-btn-primary"
                lay-on="reg-get-vercode"
              >
                获取验证码
              </button>
            </div>
          </div>
        </div>
      </div>
      <div class="layui-form-item">
        <div class="layui-input-wrap">
          <div class="layui-input-prefix">
            <i class="layui-icon layui-icon-vercode"></i>
          </div>
          <input
            type="text"
            name="vercode"
            value=""
            lay-verify="required"
            placeholder="验证码"
            lay-reqtext="请填写验证码"
            autocomplete="off"
            class="layui-input"
          />
        </div>
      </div>
      <div class="layui-form-item">
        <div class="layui-input-wrap">
          <div class="layui-input-prefix">
            <i class="layui-icon layui-icon-password"></i>
          </div>
          <input
            type="password"
            name="password"
            value=""
            lay-verify="required"
            placeholder="密码"
            autocomplete="off"
            class="layui-input"
            id="reg-password"
            lay-affix="eye"
          />
        </div>
      </div>
      <div class="layui-form-item">
        <div class="layui-input-wrap">
          <div class="layui-input-prefix">
            <i class="layui-icon layui-icon-password"></i>
          </div>
          <input
            type="password"
            name="confirmPassword"
            value=""
            lay-verify="required|confirmPassword"
            placeholder="确认密码"
            autocomplete="off"
            class="layui-input"
            lay-affix="eye"
          />
        </div>
      </div>
      <div class="layui-form-item">
        <div class="layui-input-wrap">
          <div class="layui-input-prefix">
            <i class="layui-icon layui-icon-username"></i>
          </div>
          <input
            type="text"
            name="nickname"
            value=""
            lay-verify="required"
            placeholder="昵称"
            autocomplete="off"
            class="layui-input"
            lay-affix="clear"
          />
        </div>
      </div>
      <div class="layui-form-item">
        <input
          type="checkbox"
          name="agreement"
          lay-verify="required"
          lay-skin="primary"
          title="同意"
        />
        <a
          href="#terms"
          target="_blank"
          style="position: relative; top: 6px; left: -15px;"
        >
          <ins>用户协议</ins>
        </a>
      </div>
      <div class="layui-form-item">
        <button
          class="layui-btn layui-btn-fluid"
          lay-submit
          lay-filter="demo-reg"
        >
          注册
        </button>
      </div>
      <div class="layui-form-item demo-reg-other">
        <label>社交账号注册</label>
        <span style="padding: 0 21px 0 6px;">
          <a href="javascript:;"
            ><i
              class="layui-icon layui-icon-login-qq"
              style="color: #3492ed;"
            ></i
          ></a>
          <a href="javascript:;"
            ><i
              class="layui-icon layui-icon-login-wechat"
              style="color: #4daf29;"
            ></i
          ></a>
          <a href="javascript:;"
            ><i
              class="layui-icon layui-icon-login-weibo"
              style="color: #cf1900;"
            ></i
          ></a>
        </span>
        <a href="#login">登录已有帐号</a>
      </div>
    </div>
  </form>
  <script src="/static/layui.js"></script>
  <script>
    layui.use(function () {
      var $ = layui.$;
      var form = layui.form;
      var layer = layui.layer;
    });
  </script>
</body>

属性

http://layui.dev/docs/2.8/form/#attr

在表单域中,有时还需要定义一些特定属性来配合组件的使用,它们一般以 lay-* 为命名格式,如:

html
<form class="layui-form" lay-filter="form-1">
  <input type="text" class="layui-input" lay-verify="email" />
  <input type="checkbox" lay-skin="switch" lay-filter="agree" title="同意" />
  <button class="layui-btn" lay-submit>提交</button>
</form>

以下为 form 组件的特定属性列表:

属性描述
title自定义设置表单元素标题,一般用于 checkbox,radio 元素
lay-filter自定义设置表单元素的过滤器,以便用于执行相关方法时的参数匹配
lay-verifyrequired必填项
phone手机号
email邮箱
url网址
number数字
date日期
identity身份证
自定义规则值
设置表单项的验证规则,支持单条或多条规则(多条用 竖线 分隔),如: lay-verify="required"
lay-verify="required 竖线 email"
lay-verify="其他自定义规则值"
自定义规则的用法:#详见
lay-vertypetips吸附层 alert 对话框 msg 默认设置验证异常时的提示层模式
lay-reqtext自定义设置必填项lay-verify="required")的默认提示文本
lay-affix#详见输入框动态点缀,<input type="text">元素 私有属性
lay-skin#详见设置 UI 风格。 <input type="checkbox"> 元素 私有属性
lay-search默认不区分大小写; 设置cs区分大小写select 组件开启搜索功能。<select> 元素 私有属性
lay-submit无需值设置元素(一般为<button> 标签)触发 submit 提交事件
lay-ignore无需值设置表单元素忽略渲染,即让元素保留系统原始 UI 风格

渲染

form.render(type, filter);
  • 参数 type 可选,对应表单组件类型,支持:input,select,checkbox,radio;若不填,则指向所有类型。
  • 参数 filter 可选,对应 class="layui-form" 所在元素的 lay-filter 属性值,用于指定需渲染的表单区域。

常规渲染

form 组件会在元素加载完毕后,自动对所有表单区域完成一次渲染,因此该方法主要用于对动态插入的表单元素的渲染。

html
<form class="layui-form" lay-filter="test">动态插入的表单域</form>

<!-- import layui -->
<script>
  layui.use(function () {
    var form = layui.form;

    // 当表单元素被插入插入时,需进行组件渲染才能显示
    form.render(); // 渲染全部表单
    form.render("select"); // 仅渲染 select 元素
    form.render(null, "test"); // 仅渲染 lay-filter="test" 的容器内的全部表单
    form.render("checkbox", "test"); // 仅渲染  lay-filter="test" 的容器内的 checkbox 元素
  });
</script>

定向渲染

该方法还允许指定表单元素的 jQuery 对象,从而完成定向渲染。且支持两种方式的指向:

  • 若 jQuery 对象指向表单域容器(class="layui-form"),则渲染该表单域中的所有表单项;
  • 若 jQuery 对象指向的不是表单域容器,则只对该对象进行渲染

定向渲染在页面出现大量表单时,可以极大地减少表单组件渲染时的性能开销,建议灵活运用。

html
<div class="layui-form" id="form-id">
  <select id="select-id">
    <option value="a">A</option>
  </select>
  <!-- 其他表单元素 -->
</div>

<!-- import layui -->
<script>
  layui.use("form", function () {
    var $ = layui.$;
    var form = layui.form;

    // 定向渲染(一般当表单存在动态生成时,进行渲染)
    // 传入需要渲染的相应表单元素的 jQuery 对象
    form.render($("#form-id")); // 渲染 id="form-id" 的表单域中的所有表单项
    form.render($("#select-id")); // 仅渲染 id="select-id" 的表单项
  });
</script>

忽略渲染

若表单域中的部分表单不需要 Layui 来渲染,那么可通过 lay-ignore 属性让其保留系统原始 UI 风格。

html
<body>
  <div class="layui-form">
    <select>
      <option value="a">正常渲染的 select</option>
    </select>
    <input type="checkbox" lay-skin="primary" title="正常渲染的 checkbox" />
    <hr />
    <select lay-ignore>
      <option value="">忽略渲染的 select</option>
    </select>
    <input type="checkbox" lay-ignore /> 忽略渲染的 checkbox
  </div>
</body>

验证

Layui 对表单做了相对巧妙的支持,只需在表单元素上设置 lay-verify="" 属性值即可指定验证规则,如:

html
<div class="layui-form">
  <input type="text" lay-verify="required" />
  <input type="text" lay-verify="email" />
  <input type="text" lay-verify="required|phone|number" />
  <button class="layui-btn" lay-submit>提交</button>
</div>

其中,lay-verify 属性的内置规则值可参考上文的。 当表单提交时,会自动触发验证。

自定义验证规则

form.verify(obj);
  • 参数 obj 是一个对象,用于定义验证规则的集合。

当内置的验证规则无法满足业务需求时,我们可以通过该方法自定义验证规则。如:

html
<body>
  <form class="layui-form">
    <input
      type="text"
      name="username"
      lay-verify="required|username"
      placeholder="用户名"
      class="layui-input"
    />
    <hr />
    <input
      type="password"
      name="password"
      lay-verify="password"
      placeholder="密码"
      class="layui-input"
    />
    <hr />
    <button class="layui-btn" lay-submit lay-filter="demo-verify">提交</button>
  </form>

  <script src="/static/layui.js"></script>
  <script>
    layui.use(function () {
      var form = layui.form;
      // 自定义验证规则,如下以验证用户名和密码为例
      form.verify({
        // 函数写法
        // 参数 value 为表单的值;参数 item 为表单的 DOM 对象
        username: function (value, item) {
          if (!new RegExp("^[a-zA-Z0-9_\u4e00-\u9fa5\\s·]+$").test(value)) {
            return "用户名不能有特殊字符";
          }
          if (/(^_)|(__)|(_+$)/.test(value))
            return "用户名首尾不能出现 _ 下划线";
          if (/^\d+$/.test(value)) return "用户名不能全为数字";

          // 若不想自动弹出默认提示框,可返回 true,这时你可以通过其他提示方式替代(v2.5.7 新增)
          if (value === "xxx") {
            alert("用户名不能为敏感词");
            return true;
          }
        },
        // 数组写法。
        // 数组中两个成员值分别代表:[正则表达式、正则匹配不符时的提示文字]
        password: [/^[\S]{6,12}$/, "密码必须为6到12位的非空字符"],
      });
      // 提交事件
      form.on("submit(demo-verify)", function (data) {
        var field = data.field; // 获取表单字段值
        // 显示填写结果,仅作演示用
        layer.alert(JSON.stringify(field), {
          title: "当前填写的字段值",
        });
        // 此处可执行 Ajax 等操作
        // …
        return false; // 阻止默认 form 跳转
      });
    });
  </script>
</body>

主动触发验证

form.validate(elem);
  • 参数 elem 为元素选择器或 jQuery 对象; 若验证通过,该方法将返回 true,否则返回 false
html
<body>
  <div class="layui-form">
    <div class="layui-form-item">
      <label class="layui-form-label">手机</label>
      <div class="layui-input-block">
        <input
          type="tel"
          name="phone"
          lay-verify="required|phone"
          class="layui-input"
          id="validate-phone"
        />
      </div>
    </div>
    <div class="layui-form-item">
      <label class="layui-form-label">验证码</label>
      <div class="layui-input-inline">
        <input
          type="text"
          name="vercode"
          lay-verify="required"
          class="layui-input"
        />
      </div>
      <div class="layui-inline">
        <button
          type="button"
          class="layui-btn layui-btn-primary"
          id="validate-get-vercode"
        >
          获取验证码
        </button>
      </div>
    </div>
    <div class="layui-form-item">
      <div class="layui-input-block">
        <button class="layui-btn" lay-submit lay-filter="demo-validate">
          提交
        </button>
      </div>
    </div>
  </div>

  <script src="/static/layui.js"></script>
  <script>
    layui.use(function () {
      var $ = layui.$;
      var form = layui.form;
      var layer = layui.layer;

      // 点击获取验证码
      $("#validate-get-vercode").on("click", function () {
        var isValid = form.validate("#validate-phone"); // 主动触发验证,v2.7.0 新增
        // 验证通过
        if (isValid) {
          layer.msg("手机号规则验证通过");
          // 此处可继续书写「发送验证码」等后续逻辑
          // …
        }
      });
      // 提交事件
      form.on("submit(demo-validate)", function (data) {
        var field = data.field; // 获取表单字段值
        // 显示填写结果,仅作演示用
        layer.alert(JSON.stringify(field), {
          title: "当前填写的字段值",
        });
        // 此处可执行 Ajax 等操作
        // …
        return false; // 阻止默认 form 跳转
      });
    });
  </script>
</body>

赋值/取值

form.val(filter, obj);
  • 参数 filter 为表单域容器(class="layui-form")的 lay-filter 属性值
  • 参数 obj 可选。若参数存在,则对表单域进行赋值;若参数不存在,则为对表单域进行取值。
html
<body>
  <form class="layui-form" action="" lay-filter="demo-val-filter">
    <div
      class="layui-btn-container"
      style="margin-bottom: 6px; text-align: center;"
    >
      <button
        type="button"
        class="layui-btn layui-btn-normal"
        id="LAY-component-form-setval"
      >
        赋值
      </button>
      <button
        type="button"
        class="layui-btn layui-btn-normal"
        id="LAY-component-form-getval"
      >
        取值
      </button>
    </div>
    <div class="layui-form-item">
      <label class="layui-form-label">输入框</label>
      <div class="layui-input-block">
        <input
          type="text"
          name="username"
          lay-verify="title"
          autocomplete="off"
          placeholder="请输入"
          class="layui-input"
        />
      </div>
    </div>
    <div class="layui-form-item">
      <label class="layui-form-label">密码框</label>
      <div class="layui-input-block">
        <input
          type="password"
          name="password"
          placeholder="请输入"
          autocomplete="off"
          class="layui-input"
        />
      </div>
    </div>
    <div class="layui-form-item">
      <label class="layui-form-label">选择框</label>
      <div class="layui-input-block">
        <select name="interest" lay-filter="aihao">
          <option value=""></option>
          <option value="0">写作</option>
          <option value="1">阅读</option>
          <option value="2">游戏</option>
          <option value="3">音乐</option>
          <option value="4">旅行</option>
        </select>
      </div>
    </div>
    <div class="layui-form-item">
      <label class="layui-form-label">复选框</label>
      <div class="layui-input-block">
        <input type="checkbox" name="like[write]" title="写作" />
        <input type="checkbox" name="like[read]" title="阅读" />
        <input type="checkbox" name="like[daze]" title="发呆" />
      </div>
    </div>
    <div class="layui-form-item">
      <label class="layui-form-label">开关</label>
      <div class="layui-input-block">
        <input
          type="checkbox"
          name="close"
          lay-skin="switch"
          lay-text="ON|OFF"
        />
      </div>
    </div>
    <div class="layui-form-item">
      <label class="layui-form-label">单选框</label>
      <div class="layui-input-block">
        <input type="radio" name="sex" value="男" title="男" checked />
        <input type="radio" name="sex" value="女" title="女" />
      </div>
    </div>
    <div class="layui-form-item layui-form-text">
      <label class="layui-form-label">文本域</label>
      <div class="layui-input-block">
        <textarea
          placeholder="请输入"
          class="layui-textarea"
          name="desc"
        ></textarea>
      </div>
    </div>
    <div class="layui-form-item">
      <div class="layui-input-block">
        <button
          type="submit"
          class="layui-btn"
          lay-submit
          lay-filter="demo-val"
        >
          立即提交
        </button>
        <button type="reset" class="layui-btn layui-btn-primary">重置</button>
      </div>
    </div>
  </form>

  <script src="/static/layui.js"></script>
  <script>
    layui.use(function () {
      var $ = layui.$;
      var form = layui.form;
      // 表单赋值
      $("#LAY-component-form-setval").on("click", function () {
        form.val("demo-val-filter", {
          username: "贤心", // "name": "value"
          password: "AAAAAA",
          interest: 1,
          "like[write]": true, // 复选框选中状态
          close: true, // 开关状态
          sex: "女",
          desc: "Layui 用于更简单快速地构建网页界面",
        });
      });
      // 表单取值
      layui.$("#LAY-component-form-getval").on("click", function () {
        var data = form.val("demo-val-filter");
        alert(JSON.stringify(data));
      });
      // 提交事件
      form.on("submit(demo-val)", function (data) {
        var field = data.field; // 获取表单字段值
        // 显示填写结果,仅作演示用
        layer.alert(JSON.stringify(field), {
          title: "当前填写的字段值",
        });
        // 此处可执行 Ajax 等操作
        // …
        return false; // 阻止默认 form 跳转
      });
    });
  </script>
</body>

提交

表单的提交可以通过事件触发或方法触发

提交事件

在表单域中,对指定按钮设置 lay-submit 属性,即意味着点击该按钮时,将触发提交事件。如:

html
<body>
  <form class="layui-form">
    <input
      type="text"
      name="nickname"
      lay-verify="required"
      class="layui-input"
    />
    <hr />
    <button class="layui-btn" lay-submit lay-filter="demo-submit">
      提交按钮
    </button>
    <button class="layui-btn" id="test-btn-other">普通按钮</button>
  </form>

  <!-- 请勿在项目正式环境中引用该 layui.js 地址 -->
  <script src="/static/layui.js"></script>
  <script>
    layui.use(function () {
      var $ = layui.$;
      var form = layui.form;
      var layer = layui.layer;
      // 提交事件
      form.on("submit(demo-submit)", function (data) {
        var field = data.field; // 获取表单全部字段值
        var elem = data.elem; // 获取当前触发事件的元素 DOM 对象,一般为 button 标签
        var elemForm = data.form; // 获取当前表单域的 form 元素对象,若容器为 form 标签才会返回。
        // 显示填写结果,仅作演示用
        layer.alert(JSON.stringify(field), {
          title: "当前填写的字段值",
        });
        // 此处可执行 Ajax 等操作
        // …
        return false; // 阻止默认 form 跳转
      });
      // 普通按钮
      $("#test-btn-other").on("click", function () {
        layer.msg("点击未设置特定属性的按钮不会触发组件的提交事件");
        return false;
      });
    });
  </script>
</body>

提交方法

form.submit(filter, callback);
  • 参数 filter 为表单域容器的 lay-filter 属性值
  • 参数 callback 为执行提交事件后的回调函数

使用该方法可以实现在任意位置对指定表单的主动提交,相比上述的提交事件更加灵活。

html
<body>
  <fieldset class="layui-elem-field">
    <legend>表单内部</legend>
    <div class="layui-field-box">
      <form class="layui-form" lay-filter="form-demo-submit">
        <input
          type="text"
          name="nickname"
          lay-verify="required"
          class="layui-input"
        />
      </form>
    </div>
  </fieldset>
  <button class="layui-btn" id="test-btn-submit">任意位置按钮</button>

  <!-- 请勿在项目正式环境中引用该 layui.js 地址 -->
  <script src="/static/layui.js"></script>
  <script>
    layui.use(function () {
      var $ = layui.$;
      var form = layui.form;
      var layer = layui.layer;
      // 任意位置按钮触发提交
      $("#test-btn-submit").on("click", function () {
        form.submit("form-demo-submit", function (data) {
          var field = data.field; // 获取表单全部字段值
          console.log(data); // 回调函数返回的 data 参数和提交事件中返回的一致
          // 执行提交
          layer.confirm("确定提交吗?", function (index) {
            layer.close(index); // 关闭确认提示框
            // 显示填写结果,仅作演示用
            layer.alert(JSON.stringify(field), {
              title: "当前填写的字段值",
            });
            // 此处可执行 Ajax 等操作
            // …
          });
        });
        return false;
      });
    });
  </script>
</body>

事件

form.on('event(filter)', callback);
  • 参数 event(filter) 是一个特定结构。event 为事件名,支持:select,checkbox,switch,radio,submitfilter 为元素属性 lay-filter 对应的值,若不填,则指向所有同类组件的事件。
  • 参数 callback 为事件执行时的回调函数,并返回一个包含各种值的 object 类型的参数。

如下以 select 事件为例:

js
// 指向所有 select 组件的选择事件
form.on("select", function (data) {
  console.log(data);
});

// 指向元素为 `<select lay-filter="test"></select>` 的选择事件
form.on("select(test)", function (data) {
  console.log(data);
});