讲师中心 微信公众号
AI工具推荐 视频效率加速

Layui如何实现多选下拉框(基于Layui的扩展组件集成)

夏涛大大_3398

夏涛大大_3398

发布时间:2026-04-05 10:25:00

|

871人浏览过

|

来源于php中文网

原创

Layui 2.x 原生 select 不支持多选,需用 lay-select 容器+内嵌 checkbox 模拟:手动构建 dl 列表、监听点击、维护选中数组、同步标题文本,并通过隐藏域提交值。

layui 2.x 默认不支持多选下拉,得靠 lay-select + 自定义 DOM 模拟

layui 原生的 layui.form.select 只支持单选,没有 multiple 属性,直接写 <select multiple></select> 也不会被 layui 渲染成多选样式——它会忽略 multiple,只当普通下拉处理。

所以必须绕过原生渲染逻辑,用自定义 HTML + JS 行为模拟:保留 lay-select 的外观和交互基础,但把内部 <dl></dl> 列表项做成可勾选状态,并维护一个选中值数组。

常见错误现象:select 加了 multiple 却点不动选项;或点了没反馈、提交时拿不到多个值;或触发 change 事件但 this.value 仍是空字符串。

  • 不要试图用 form.render('select') 激活原生 multiple —— 它不生效
  • 不要在 select 上直接绑定 click 或 change 监听,layui 会接管并屏蔽原生行为
  • 真实使用场景是:权限配置、标签筛选、多角色选择等需要显式勾选+回显的列表

用 lay-select 容器 + checkbox 手动构建多选项 DOM

核心思路是:让 layui 渲染一个“假下拉”,里面每个 <dd></dd> 内嵌一个 <input type="checkbox">,点击时阻止默认行为,手动 toggle 选中态并更新隐藏域或数据模型。

示例结构(关键部分):

<div class="layui-input-inline">
  <select id="multiTag" lay-filter="multiTag" style="display:none">
    <option value="">请选择标签</option>
    <option value="1">前端</option>
    <option value="2">后端</option>
    <option value="3">运维</option>
  </select>
  <div class="layui-unselect layui-form-select" lay-key="multiTag">
    <div class="layui-select-title">
      <input type="text" placeholder="请选择标签" readonly="" class="layui-input">
      <i class="layui-edge"></i>
    </div>
    <dl class="layui-anim layui-anim-upbit">
      <dd lay-value=""><input type="checkbox" name="tag[]" value="" title="全部"></dd>
      <dd lay-value="1"><input type="checkbox" name="tag[]" value="1" title="前端"></dd>
      <dd lay-value="2"><input type="checkbox" name="tag[]" value="2" title="后端"></dd>
      <dd lay-value="3"><input type="checkbox" name="tag[]" value="3" title="运维"></dd>
    </dl>
  </div>
</div>

注意:lay-key 必须唯一,否则多个组件会互相干扰;name 属性用于表单序列化时识别字段,但实际提交需靠 JS 收集勾选值。

  • lay-select 容器本身不参与 form 提交,只是 UI 层,所有值必须由 JS 主动读取 input[type=checkbox]:checked
  • 点击 <dd></dd> 时要调用 event.preventDefault(),否则 layui 会强制关闭下拉面板
  • 兼容性上,layui 2.8.18 及以上对自定义 dl 内容支持更稳,旧版本可能需手动调用 form.render() 补丁

监听勾选变化并同步显示文本(避免只改 DOM 不更新状态)

用户点了 checkbox,UI 要立刻反映已选内容,比如显示“前端 / 后端”或“已选 2 项”。但 layui 不知道你在 dl 里塞了 checkbox,所以必须自己监听、收集、刷新标题栏文本。

实操建议:

  • 给每个 <dd></dd> 绑定 click 事件(委托到 .layui-form-select dl 更稳妥)
  • 用 $(e.target).closest('dd').find('input:checked') 获取当前选中项
  • 拼接显示文本时注意:别直接用 val(),要读 $(dd).attr('lay-value'),因为 checkbox 的 value 可能和下拉值不一致
  • 更新标题输入框用 $('.layui-select-title .layui-input').val(text),别用 val() 写原生 select,它不会响应
  • 性能提示:频繁点击时避免重复触发 form.render(),它会导致重绘卡顿

提交前手动收集值并赋给隐藏域(否则后端收不到)

表单提交时,原生 select 元素仍为空,浏览器只会提交它自己的 value(永远是空字符串),所以必须把 checkbox 选中的值写进一个隐藏 <input>,名字和后端约定一致。

典型做法:

<input type="hidden" name="tags" id="tagsVal" value="">

然后在提交前执行:

var checkedVals = [];
$('.layui-form-select[lay-key="multiTag"] dd input:checked').each(function(){
  checkedVals.push($(this).val());
});
$('#tagsVal').val(checkedVals.join(',')); // 或 JSON.stringify(checkedVals)

容易踩的坑:

  • 忘记在 form.on('submit(...)') 里加这一步,导致后端始终收不到多选值
  • 用 serialize() 提交时,如果没设置隐藏域,tags 字段直接消失
  • 后端接收类型要匹配:逗号分隔字符串 or 数组(取决于你传的是 join 还是 JSON)
  • 移动端点击区域小,建议给 dd 加 padding: 8px 12px,别只依赖 checkbox 图标热区

最麻烦的其实是状态同步:编辑已有数据时,要预先勾选对应 checkbox,还要把原始值正确展示在标题栏。这部分逻辑一旦漏掉,用户就以为没加载成功。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2683

2023.08.11

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

5843

2023.10.09

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

6830

2024.03.19

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

6538

2024.03.22

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

943

2024.05.22

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

120

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

60

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

60

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

40

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn