layui-表单集合

layui-表单集合


<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>表达集合</title>
        <link rel="stylesheet" href="layui/css/layui.css">
    </head>
    <body>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
  <legend>响应式的表单集合</legend>
</fieldset>

<form class="layui-form" action="">
  <div class="layui-form-item">
    <label class="layui-form-label">单行输入框</label>
    <div class="layui-input-block">
      <input type="text" name="title" 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="text" name="username" lay-verify="required" placeholder="请输入" autocomplete="off" class="layui-input">
    </div>
  </div>

  <div class="layui-form-item">
    <div class="layui-inline">
      <label class="layui-form-label">验证手机</label>
      <div class="layui-input-inline">
        <input type="tel" name="phone" lay-verify="phone" autocomplete="off" class="layui-input">
      </div>
    </div>
    <div class="layui-inline">
      <label class="layui-form-label">验证邮箱</label>
      <div class="layui-input-inline">
        <input type="text" name="email" lay-verify="email" autocomplete="off" class="layui-input">
      </div>
    </div>
  </div>

  <div class="layui-form-item">
    <div class="layui-inline">
      <label class="layui-form-label">多规则验证</label>
      <div class="layui-input-inline">
        <input type="text" name="number" lay-verify="required|number" autocomplete="off" class="layui-input">
      </div>
    </div>
    <div class="layui-inline">
      <label class="layui-form-label">验证日期</label>
      <div class="layui-input-inline">
        <input type="text" name="date" id="date" lay-verify="date" placeholder="yyyy-mm-dd" autocomplete="off" class="layui-input" onclick="layui.laydate({elem: this})">
      </div>
    </div>
    <div class="layui-inline">
      <label class="layui-form-label">验证链接</label>
      <div class="layui-input-inline">
        <input type="tel" name="url" lay-verify="url" autocomplete="off" class="layui-input">
      </div>
    </div>
  </div>

  <div class="layui-form-item">
    <label class="layui-form-label">验证身份证</label>
    <div class="layui-input-block">
      <input type="text" name="identity" lay-verify="identity" placeholder="" autocomplete="off" class="layui-input">
    </div>
  </div>
  <div class="layui-form-item">
    <label class="layui-form-label">自定义验证</label>
    <div class="layui-input-inline">
      <input type="password" name="password" lay-verify="pass" placeholder="请输入密码" autocomplete="off" class="layui-input">
    </div>
    <div class="layui-form-mid layui-word-aux">请填写6到12位密码</div>
  </div>

  <div class="layui-form-item">
    <div class="layui-inline">
      <label class="layui-form-label">范围</label>
      <div class="layui-input-inline" style="width: 100px;">
        <input type="text" name="price_min" placeholder="¥" autocomplete="off" class="layui-input">
      </div>
      <div class="layui-form-mid">-</div>
      <div class="layui-input-inline" style="width: 100px;">
        <input type="text" name="price_max" placeholder="¥" autocomplete="off" class="layui-input">
      </div>
    </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" selected="">阅读</option>
        <option value="2">游戏</option>
        <option value="3">音乐</option>
        <option value="4">旅行</option>
      </select>
    </div>
  </div>


  <div class="layui-form-item">
    <div class="layui-inline">
      <label class="layui-form-label">分组选择框</label>
      <div class="layui-input-inline">
        <select name="quiz">
          <option value="">请选择问题</option>
          <optgroup label="城市记忆">
            <option value="你工作的第一个城市">你工作的第一个城市</option>
          </optgroup>
          <optgroup label="学生时代">
            <option value="你的工号">你的工号</option>
            <option value="你最喜欢的老师">你最喜欢的老师</option>
          </optgroup>
        </select>
      </div>
    </div>
    <div class="layui-inline">
      <label class="layui-form-label">搜索选择框</label>
      <div class="layui-input-inline">
        <select name="modules" lay-verify="required" lay-search="">
          <option value="">直接选择或搜索选择</option>
          <option value="1">layer</option>
          <option value="2">form</option>
          <option value="3">layim</option>
          <option value="4">element</option>
          <option value="5">laytpl</option>
          <option value="6">upload</option>
          <option value="7">laydate</option>
          <option value="8">laypage</option>
          <option value="9">flow</option>
          <option value="10">util</option>
          <option value="11">code</option>
          <option value="12">tree</option>
          <option value="13">layedit</option>
          <option value="14">nav</option>
          <option value="15">tab</option>
          <option value="16">table</option>
          <option value="17">select</option>
          <option value="18">checkbox</option>
          <option value="19">switch</option>
          <option value="20">radio</option>
        </select>
      </div>
    </div>
  </div>

  <div class="layui-form-item">
    <label class="layui-form-label">联动选择框</label>
    <div class="layui-input-inline">
      <select name="quiz1">
        <option value="">请选择省</option>
        <option value="浙江" selected="">浙江省</option>
        <option value="你的工号">江西省</option>
        <option value="你最喜欢的老师">福建省</option>
      </select>
    </div>
    <div class="layui-input-inline">
      <select name="quiz2">
        <option value="">请选择市</option>
        <option value="杭州">杭州</option>
        <option value="宁波" disabled="">宁波</option>
        <option value="温州">温州</option>
        <option value="温州">台州</option>
        <option value="温州">绍兴</option>
      </select>
    </div>
    <div class="layui-input-inline">
      <select name="quiz3">
        <option value="">请选择县/区</option>
        <option value="西湖区">西湖区</option>
        <option value="余杭区">余杭区</option>
        <option value="拱墅区">临安市</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="阅读" checked="">
      <input type="checkbox" name="like[game]" title="游戏">
    </div>
  </div>

  <div class="layui-form-item" pane="">
    <label class="layui-form-label">原始复选框</label>
    <div class="layui-input-block">
      <input type="checkbox" name="like1[write]" lay-skin="primary" title="写作" checked="">
      <input type="checkbox" name="like1[read]" lay-skin="primary" title="阅读">
      <input type="checkbox" name="like1[game]" lay-skin="primary" title="游戏" disabled="">
    </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="checkbox" checked="" name="open" lay-skin="switch" lay-filter="switchTest" 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="女">
      <input type="radio" name="sex" value="禁" title="禁用" disabled="">
    </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"></textarea>
    </div>
  </div>
  <div class="layui-form-item layui-form-text">
    <label class="layui-form-label">编辑器</label>
    <div class="layui-input-block">
      <textarea class="layui-textarea layui-hide" name="content" lay-verify="content" id="LAY_demo_editor"></textarea>
    </div>
  </div>
  <div class="layui-form-item">
    <div class="layui-input-block">
      <button class="layui-btn" lay-submit="" lay-filter="demo1">立即提交</button>
      <button type="reset" class="layui-btn layui-btn-primary">重置</button>
    </div>
  </div>
</form>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 50px;">
  <legend>方框风格的表单集合</legend>
</fieldset>
<form class="layui-form layui-form-pane" action="">
  <div class="layui-form-item">
    <label class="layui-form-label">长输入框</label>
    <div class="layui-input-block">
      <input type="text" name="title" autocomplete="off" placeholder="请输入标题" class="layui-input">
    </div>
  </div>
  <div class="layui-form-item">
    <label class="layui-form-label">短输入框</label>
    <div class="layui-input-inline">
      <input type="text" name="username" lay-verify="required" placeholder="请输入" autocomplete="off" class="layui-input">
    </div>
  </div>

  <div class="layui-form-item">
    <div class="layui-inline">
      <label class="layui-form-label">日期选择</label>
      <div class="layui-input-block">
        <input type="text" name="date" id="date" autocomplete="off" class="layui-input" onclick="layui.laydate({elem: this})">
      </div>
    </div>
    <div class="layui-inline">
      <label class="layui-form-label">行内表单</label>
      <div class="layui-input-inline">
        <input type="number" name="number" autocomplete="off" class="layui-input">
      </div>
    </div>
  </div>
  <div class="layui-form-item">
    <label class="layui-form-label">密码</label>
    <div class="layui-input-inline">
      <input type="password" name="password" placeholder="请输入密码" autocomplete="off" class="layui-input">
    </div>
    <div class="layui-form-mid layui-word-aux">请务必填写用户名</div>
  </div>

  <div class="layui-form-item">
    <div class="layui-inline">
      <label class="layui-form-label">范围</label>
      <div class="layui-input-inline" style="width: 100px;">
        <input type="text" name="price_min" placeholder="¥" autocomplete="off" class="layui-input">
      </div>
      <div class="layui-form-mid">-</div>
      <div class="layui-input-inline" style="width: 100px;">
        <input type="text" name="price_max" placeholder="¥" autocomplete="off" class="layui-input">
      </div>
    </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" selected="">阅读</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-inline">
      <select name="quiz1">
        <option value="">请选择省</option>
        <option value="浙江" selected="">浙江省</option>
        <option value="你的工号">江西省</option>
        <option value="你最喜欢的老师">福建省</option>
      </select>
    </div>
    <div class="layui-input-inline">
      <select name="quiz2">
        <option value="">请选择市</option>
        <option value="杭州">杭州</option>
        <option value="宁波" disabled="">宁波</option>
        <option value="温州">温州</option>
        <option value="温州">台州</option>
        <option value="温州">绍兴</option>
      </select>
    </div>
    <div class="layui-input-inline">
      <select name="quiz3">
        <option value="">请选择县/区</option>
        <option value="西湖区">西湖区</option>
        <option value="余杭区">余杭区</option>
        <option value="拱墅区">临安市</option>
      </select>
    </div>
  </div>
  <div class="layui-form-item" pane="">
    <label class="layui-form-label">开关-开</label>
    <div class="layui-input-block">
      <input type="checkbox" checked="" name="open" lay-skin="switch" lay-filter="switchTest" title="开关">
    </div>
  </div>
  <div class="layui-form-item" pane="">
    <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="女">
      <input type="radio" name="sex" value="禁" title="禁用" disabled="">
    </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"></textarea>
    </div>
  </div>
  <div class="layui-form-item">
    <button class="layui-btn" lay-submit="" lay-filter="demo2">跳转式提交</button>
  </div>
</form>

<script src="layui/layui.js" charset="utf-8"></script>
<script>
layui.use(['form', 'layedit', 'laydate'], function(){
  var form = layui.form()
  ,layer = layui.layer
  ,layedit = layui.layedit
  ,laydate = layui.laydate;

  //创建一个编辑器
  var editIndex = layedit.build('LAY_demo_editor');

  //自定义验证规则
  form.verify({
    title: function(value){
      if(value.length < 5){
        return '标题至少得5个字符啊';
      }
    }
    ,pass: [/(.+){6,12}$/, '密码必须6到12位']
    ,content: function(value){
      layedit.sync(editIndex);
    }
  });

  //监听指定开关
  form.on('switch(switchTest)', function(data){
    layer.msg('开关checked:'+ (this.checked ? 'true' : 'false'), {
      offset: '6px'
    });
    layer.tips('温馨提示:请注意开关状态的文字可以随意定义,而不仅仅是ON|OFF', data.othis)
  });

  //监听提交
  form.on('submit(demo1)', function(data){
    layer.alert(JSON.stringify(data.field), {
      title: '最终的提交信息'
    })
    return false;
  });


});
</script>
    </body>
</html>

这里写图片描述


官网表单集合

form表单元素包括:text 文本输入框,password密码输入框,checkbox复选框,radio单选框,file 文件域,submit表单提交action指向的文件,reset表单清空,image图片提交按钮,button按钮,hidden隐藏域。 select option select 实现下拉选 callback 是回调函数 layui.模块   模块可以是layui已经存在的模块,也可以通过layui.define([mods], callback) 来自己自定义模块。 如果想要使用模块首先要做的必然是加载模块,layui.use(['laypage', 'layedit'], function(){}); 接下来使用layui风格控件  其实感觉layui帮我们定义好了CSS和许多JS文本,我们需要做的只是按照layui的命名规范选好样式进而使用就可以了。  layu官方文档的命名规范为: CSS命名规范 class命名前缀:layui,连接符:-,如:class="layui-form" 命名格式一般分为两种: 一:layui-模块名-状态或类型 二:layui-状态或类型 因为有些类并非是某个模块所特有,他们通常会是一些公共类。如: 一(定义按钮的原始风格):class="layui-btnlayui-btn-primary" 二(定义内联块状元素):class="layui-inline" 1 2 3 4 5 6 7 8 9 当然还有前面提到的使用模块的js代码: layui.use(['form', 'layedit', 'laydate'], function(){   var form = layui.form   ,layer = layui.layer   ,layedit = layui.layedit   ,laydate = layui.laydate;   //日期   laydate.render({     elem: '#date'   });   laydate.render({     elem: '#date1'   });   //创建一个编辑器   var editIndex = layedit.build('LAY_demo_editor');   //自定义验证规则   form.verify({     title: function(value){       if(value.length < 5){         return '标题至少得5个字符啊';       }     }     ,pass: [/(.+){6,12}$/, '密码必须6到12位']     ,content: function(value){       layedit.sync(editIndex);     }   });   //监听指定开关   form.on('switch(switchTest)', function(data){     layer.msg('开关checked:'+ (this.checked ? 'true' : 'false'), {       offset: '6px'     });     layer.tips('温馨提示:请注意开关状态的文字可以随意定义,而不仅仅是ON|OFF', data.othis)   });   //监听提交   form.on('submit(demo1)', function(data){     layer.alert(JSON.stringify(data.field), {       title: '最终的提交信息'     })     return false;   }); }); 下面我们按照官方文档的开发规范使用一下form表单的例子       表单集合演示           单行输入框                       验证必填项                             验证手机                                   验证邮箱                                       多规则验证                                   验证日期                                   验证链接                                 验证身份证                       自定义验证                   请填写6到12位密码               范围                           -                                 单行选择框                   </opt
<think>我们有一个已经选中的复选框(带layui-form-checked类),我们要通过jQuery清空其他复选框的选中状态。 根据描述,当前代码是:$('.secondary-container').not('#constructionSecondary').find('input[type="checkbox"]').prop('layui-form-checked', false); 但是,这里有一个问题:layui的复选框状态并不是通过设置input的property来控制的,而是通过操作外层div的类名和内部i标签的类名来实现的。 在layui中,复选框的结构通常如下: <div class="layui-unselect layui-form-checkbox [layui-form-checked]" lay-skin="primary"> <i class="layui-icon layui-icon-ok"></i> ... 可能还有文本 </div> 当选中,会添加类名"layui-form-checked",未选中则没有。 因此,要清空选中状态,我们需要移除类名"layui-form-checked",同也要更新内部的i标签(layui可能通过i标签来显示对勾,但实际上是靠外层div的类控制)。 但是注意,我们不应该直接操作i标签,而是操作整个复选框元素(即上面的div)。 另外,代码中查找的是input[type="checkbox"],但实际上在layui中,原始的input是被隐藏的,我们操作的是外层包裹的元素。 所以,我们需要修改选择器,找到对应的包裹元素,然后移除类"layui-form-checked",并同步更新原始input的状态。 步骤: 1. 找到需要清空的复选框的包裹元素(div.layui-form-checkbox)。 2. 移除类"layui-form-checked"。 3. 同,将对应的原始input的checked属性设置为false。 但是,原代码中查找的是input,我们可以通过找到原始input,然后找到其相邻的包裹元素,或者直接操作包裹元素。 然而,原代码中使用了`find('input[type="checkbox"]')`,那么我们可以这样: 方法一:通过input找到其父级或祖先元素中的复选框包裹元素,然后移除类,并更新input的checked属性。 但是,更直接的方法是:我们直接操作包裹元素,而不是input。因为layui的样式和状态都在包裹元素上。 因此,我们修改选择器,直接找到包裹元素: 原代码:$('.secondary-container').not('#constructionSecondary').find('input[type="checkbox"]') 改为:$('.secondary-container').not('#constructionSecondary').find('.layui-form-checkbox') 然后,移除类"layui-form-checked",并将对应的input的checked设为false。 注意:一个包裹元素对应一个input,我们可以通过包裹元素找到input(通常包裹元素和input是相邻兄弟关系,或者包裹元素内部有input)。 根据layui的结构,一般如下: <div class="layui-form-item"> <div class="layui-input-block"> <input type="checkbox" name="..." title="..."> <div class="layui-unselect layui-form-checkbox ..."> ... </div> </div> </div> 但是,实际上,layui在渲染会把input隐藏,并在后面生成一个div作为复选框的显示。所以,我们可以通过以下方式关联: 包裹元素(div.layui-form-checkbox)的前一个兄弟元素就是input(因为layui渲染在input后面生成div)。 因此,我们可以这样: $('.secondary-container').not('#constructionSecondary').find('.layui-form-checkbox').each(function() { // 移除选中样式 $(this).removeClass('layui-form-checked'); // 找到前一个兄弟元素,即原始input,并设置checked为false $(this).prev('input[type="checkbox"]').prop('checked', false); }); 但是,注意,有可能有多个复选框,所以我们用each遍历。 另外,layui可能还监听了事件,所以我们最好触发一下change事件,以确保layui知道状态变化。不过,如果我们只是设置input的属性和移除类,可能已经同步了,但为了确保,可以触发input的change事件。 所以,完整的代码可以写成: $('.secondary-container').not('#constructionSecondary').find('.layui-form-checkbox').each(function() { var $checkbox = $(this).prev('input[type="checkbox"]'); $checkbox.prop('checked', false); $(this).removeClass('layui-form-checked'); // 触发change事件,让layui更新 $checkbox.trigger('change'); }); 但是,layui的复选框事件监听可能是在包裹元素上的,所以也可以直接触发包裹元素上的事件。不过,按照layui的机制,改变原始input并触发change,layui会更新样式。 因此,我们采用上述方法。 但是,原代码中使用了prop('layui-form-checked', false),这显然是不对的,因为layui-form-checked是一个类,不是属性。 所以,我们修改代码为: $('.secondary-container').not('#constructionSecondary').find('.layui-form-checkbox').removeClass('layui-form-checked').prev('input[type="checkbox"]').prop('checked', false).trigger('change'); 注意:这里我们使用了链式操作,但是要注意,prev()返回的是前一个元素,然后我们设置其checked属性并触发change。但是,这样写只能处理一个,因为find返回的是多个元素,所以我们需要用each,或者用链式操作,每个方法都会对集合中每个元素操作,但是prev()返回的是每个元素的前一个元素,所以可以这样: $('.secondary-container').not('#constructionSecondary').find('.layui-form-checkbox') .removeClass('layui-form-checked') .prev('input[type="checkbox"]') .prop('checked', false) .trigger('change'); 这样,我们移除了所有找到的包裹元素的类,然后找到它们前面的input,设置checked为false,并触发change事件。 但是,需要注意的是,如果包裹元素前面不是input(比如有其他元素),那么prev('input[type="checkbox"]')可能找不到。所以,确保结构是input紧接着包裹元素。 如果结构不是这样,我们可以用其他方式,比如用closest找到父容器,再在父容器内找input。 不过,layui的标准结构就是input后面紧跟生成的div,所以prev()是可行的。 因此,最终代码为: $('.secondary-container').not('#constructionSecondary').find('.layui-form-checkbox') .removeClass('layui-form-checked') .prev('input[type="checkbox"]') .prop('checked', false) .trigger('change'); 但是,如果有些复选框没有被渲染(即没有生成包裹元素),那么我们就需要直接操作input。不过,按照题目,我们只处理已经渲染的,所以这样就可以了。 另外,如果layui的版本不同,可能结构有差异,但一般情况都是这样。 所以,修改后的代码就是上面这样。 但是,原代码中有一个条件:.not('#constructionSecondary'),这是排除id为constructionSecondary的容器,所以我们的代码也是在这个范围内操作。 总结:原代码错误在于使用了prop设置layui-form-checked属性,而实际上应该操作类名和原始input的checked属性。</think>要解决清空 Layui 复选框选中状态的问题,需要修改代码以正确操作 Layui 的 DOM 结构和类名。以下是修正后的代码和详细说明: ```javascript // 正确清空复选框选中状态的代码 $('.secondary-container').not('#constructionSecondary').find('.layui-form-checkbox') .removeClass('layui-form-checked') .find('.layui-icon') .removeClass('layui-icon-ok') .end() .prev('input[type="checkbox"]') .prop('checked', false); ``` ### 完整实现方案: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Layui 复选框状态管理</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/layui@2.6.8/dist/css/layui.min.css"> </head> <body> <div class="layui-container"> <div class="secondary-container" id="mainSecondary"> <div class="layui-form"> <!-- 复选框组 --> <div class="layui-form-item"> <label class="layui-form-label">选项</label> <div class="layui-input-block"> <input type="checkbox" name="option1" title="选项1"> <input type="checkbox" name="option2" title="选项2" checked> <input type="checkbox" name="option3" title="选项3" checked> </div> </div> <!-- 操作按钮 --> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" id="clearBtn">清空选中</button> <button class="layui-btn" id="resetBtn">重置状态</button> </div> </div> </div> </div> <div class="secondary-container" id="constructionSecondary"> <h3>排除区域(不会被清空)</h3> <div class="layui-form"> <input type="checkbox" name="excluded" title="排除的选项" checked> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/layui@2.6.8/dist/layui.min.js"></script> <script> layui.use(['form'], function(){ var form = layui.form; form.render(); // 渲染表单 // 清空选中状态 $('#clearBtn').click(function(e){ e.preventDefault(); // 正确清空复选框 $('.secondary-container').not('#constructionSecondary').find('.layui-form-checkbox') .removeClass('layui-form-checked') .find('.layui-icon') .removeClass('layui-icon-ok') .end() .prev('input[type="checkbox"]') .prop('checked', false); // 更新表单状态 form.render(); }); // 重置状态 $('#resetBtn').click(function(){ // 重置为初始选中状态 $('input[type="checkbox"]').each(function(){ $(this).prop('checked', $(this).attr('data-original') === 'true'); }); form.render(); }); // 保存初始状态 $('input[type="checkbox"]').each(function(){ $(this).attr('data-original', $(this).prop('checked')); }); }); </script> </body> </html> ``` ### 问题分析和解决方案: 1. **原代码问题分析**: ```javascript // 错误代码: $('.secondary-container').not('#constructionSecondary').find('input[type="checkbox"]') .prop('layui-form-checked', false); ``` - 错误1:`layui-form-checked` 是类名,不是属性 - 错误2:操作的是原始 input,而非 Layui 生成的 DOM 元素 - 错误3:没有处理图标元素的状态 2. **正确操作步骤**: ```javascript // 1. 找到复选框容器 .find('.layui-form-checkbox') // 2. 移除选中类 .removeClass('layui-form-checked') // 3. 找到图标元素并移除选中图标 .find('.layui-icon').removeClass('layui-icon-ok') // 4. 返回上级操作原始 input .end().prev('input[type="checkbox"]') // 5. 更新原始 input 状态 .prop('checked', false) ``` ### Layui 复选框结构解析: 当 Layui 渲染复选框,会生成以下 DOM 结构: ```html <!-- 原始 input (隐藏) --> <input type="checkbox" name="option" title="选项"> <!-- Layui 生成的复选框 --> <div class="layui-unselect layui-form-checkbox layui-form-checked" lay-skin="primary"> <i class="layui-icon layui-icon-ok"></i> <span>选项</span> </div> ``` 需要同操作三个元素: 1. 原始 input:控制实际值 2. 外层 div:控制选中样式 3. i 图标:显示对勾图标 ### 进阶解决方案:封装复用函数 ```javascript // 封装复选框操作函数 function setCheckboxState(selector, checked) { $(selector).each(function() { const $div = $(this).closest('.layui-form-checkbox'); // 设置外层div $div.toggleClass('layui-form-checked', checked); // 设置图标 $div.find('.layui-icon') .toggleClass('layui-icon-ok', checked); // 设置原始input $div.prev('input[type="checkbox"]') .prop('checked', checked); }); } // 使用示例 - 清空选中 $('#clearBtn').click(function() { setCheckboxState('.secondary-container:not(#constructionSecondary) .layui-form-checkbox', false); layui.form.render(); // 更新表单状态 }); ``` ### 常见问题处理: 1. **动态添加的复选框**: ```javascript // 渲染新添加的复选框 form.render('checkbox'); // 保存初始状态 $('input[type="checkbox"]').each(function(){ if(!$(this).attr('data-original')) { $(this).attr('data-original', $(this).prop('checked')); } }); ``` 2. **批量操作性能优化**: ```javascript // 使用文档片段减少重绘 const fragment = document.createDocumentFragment(); $('.layui-form-checkbox').each(function() { // 克隆修改后的元素 const clone = this.cloneNode(true); // 修改状态... fragment.appendChild(clone); }); $('.layui-form-checkbox').replaceWith(fragment); ``` 3. **与其他组件联动**: ```javascript // 当复选框状态改变更新其他组件 form.on('checkbox', function(data){ // 获取关联元素 const relatedSelect = $('[data-related="' + data.elem.name + '"]'); // 根据复选框状态启用/禁用 relatedSelect.prop('disabled', !data.elem.checked); form.render('select'); // 重新渲染下拉框 }); ``` ### 状态管理最佳实践: | 方法 | 优点 | 适用场景 | |------|------|----------| | **DOM 操作** | 直接快速 | 简单状态切换 | | **form.val()** | 官方推荐 | 表单整体操作 | | **数据驱动** | 易于维护 | 复杂交互场景 | | **自定义属性** | 灵活扩展 | 需要保存额外数据 | ```javascript // 数据驱动示例 const formData = { options: [true, false, true] // 初始状态 }; // 渲染表单 function renderForm() { $('input[name^="option"]').each(function(index) { $(this).prop('checked', formData.options[index]); }); layui.form.render(); } // 更新状态 function updateState(index, state) { formData.options[index] = state; renderForm(); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值