导航
电话
咨询
地图
顶部
本文讲解如何在动态生成多个 select 元素时,实现每个标签独立点击展开/收起对应下拉框,避免 id 重复导致的事件绑定失效及多次触发问题。
在使用 jQuery 动态渲染表单组件(如 )时,一个常见误区是为多个元素分配相同 id(例如 id="atb11" 和 id="atbb22"),这不仅违反 HTML 规范(ID 必须唯一),还会导致 $('#atb11').on('click', ...) 仅作用于第一个匹配元素,其余无法响应。
要实现「逐个控制」——即点击某个「Ajudante」标签,只切换其紧邻的 容器,关键在于两点:
✅ 唯一标识符:为每个动态生成的 和 添加基于索引的唯一 ID,例如 atb11-0、atbb22-0、atb11-1、atbb22-1…… ✅ 事件委托 + 精确目标定位:使用 $(document).on('click', '#atb11-'+x, ...) 绑定事件,并通过 $(this).next() 精准获取相邻的 容器,而非全局查找 #atbb22。以下是优化后的核心逻辑(含关键注释):$(document).on('click', '.dad-pagamento', function() { var linha = ''; for (var x = 0; x < data.length; x++) { linha += ` Ajudante ${data[x].Id} `; } // 一次性写入全部 HTML(注意:原代码中 .html(linha) 在循环内执行,会导致重复覆盖,应移出循环) $(".pagmfalta").html(linha); $('#minhaDiv1').show(); // 初始化所有 select2 实例 $(".singlet").select2({ placeholder: "Selecione Ajudante", allowClear: true, width: '100%' }); // 为每个 label 绑定独立事件(使用事件委托,支持动态元素) for (var x = 0; x < data.length; x++) { $(document).on('click', '#atb11-' + x, function(e) { e.stopImmediatePropagation(); // 阻止其他同级事件处理器执行,防止重复绑定引发多倍触发 $(this).next('div[id^="atbb22-"]').slideToggle('slow'); // 精准匹配下一个 div(推荐用属性选择器增强健壮性) }); } });⚠️ 重要注意事项: 避免循环内重复 .html():原代码在 for 循环中反复调用 $(".pagmfalta").html(linha),每次都会覆盖前一次内容,最终只保留最后一个 。务必把拼接完成的完整 linha 在循环外一次性写入。 stopImmediatePropagation() 不可少:若多次点击「Consultar」按钮,会重复为同一 ID 绑定 click 事件,导致点击一次触发多次 slideToggle。该方法确保当前 handler 执行后立即终止后续同类型事件传播。 推荐使用更健壮的选择器:$(this).next() 依赖 DOM 结构严格相邻;若结构可能变化,建议改用 $(this).closest('.col-3').find('> div[id^="atbb22-"]') 或添加统一类名(如 class="toggle-target")进行定位。 Select2 初始化时机:必须在 插入 DOM 后调用 .select2(),且不要对已初始化的元素重复调用(否则报错)。当前逻辑安全,因每次点击都重建整个列表。 总结:动态表单交互的核心是「唯一性 + 委托 + 精准定位」。通过索引化 ID、事件委托绑定、stopImmediatePropagation 控制执行流,并配合语义清晰的 DOM 关系查找,即可优雅实现任意数量 Select 的独立显隐控制。
以下是优化后的核心逻辑(含关键注释):
$(document).on('click', '.dad-pagamento', function() { var linha = ''; for (var x = 0; x < data.length; x++) { linha += ` Ajudante ${data[x].Id} `; } // 一次性写入全部 HTML(注意:原代码中 .html(linha) 在循环内执行,会导致重复覆盖,应移出循环) $(".pagmfalta").html(linha); $('#minhaDiv1').show(); // 初始化所有 select2 实例 $(".singlet").select2({ placeholder: "Selecione Ajudante", allowClear: true, width: '100%' }); // 为每个 label 绑定独立事件(使用事件委托,支持动态元素) for (var x = 0; x < data.length; x++) { $(document).on('click', '#atb11-' + x, function(e) { e.stopImmediatePropagation(); // 阻止其他同级事件处理器执行,防止重复绑定引发多倍触发 $(this).next('div[id^="atbb22-"]').slideToggle('slow'); // 精准匹配下一个 div(推荐用属性选择器增强健壮性) }); } });
⚠️ 重要注意事项:
总结:动态表单交互的核心是「唯一性 + 委托 + 精准定位」。通过索引化 ID、事件委托绑定、stopImmediatePropagation 控制执行流,并配合语义清晰的 DOM 关系查找,即可优雅实现任意数量 Select 的独立显隐控制。
# html # js # for # 循环 # 处理器 # 多个 # 委托 # 而非 # 事件 # 绑定 # 还会 # class # 推荐使用 # 报错 # this # 表单 # select # 选择器 # 第一个 # 要对 # dom # 标识符 # jquery # 属性选择器
相关栏目: 【 行业资讯 】 【 网络运营 】 【 GEO优化 】 【 营销推广 】 【 SEO优化 】 【 技术教程 】 【 代码知识 】 【 AI推广 】
相关推荐: Go 中 := 短变量声明的类型推导机制详解 Win11怎么压缩文件 Win11自带压缩解压功能使用【教程】 Win11怎么更改系统语言_Win11中文语言包下载与安装【指南】 如何在Golang中实现基础配置管理功能_Golang配置文件读取与更新示例 Win11时间不对怎么同步_Win11自动校准互联网时间【设置】 Windows驱动签名被阻止原因_禁用签名强制检测的安全处理 如何在Golang中实现服务熔断与限流_Golang微服务容错与流控方法 Python数据挖掘进阶教程_分类回归与聚类案例解析 php中作用域操作符能访问私有静态属性吗_访问权限限制【指南】 Windows蓝屏错误0x00000018怎么处理_驱动初始化错误解决 Win11怎么更改账户头像_Windows 11自定义用户头像图片设置【步骤】 如何将竖排文本文件转换为横排字符串 如何使用Golang实现聊天室消息存档_存储聊天记录到文件 php485支持哪些操作系统_php485跨系统支持情况介绍【解答】 Python邮件系统自动化教程_批量发送解析与模板应用 如何自定义Windows终端的默认配置文件?(PowerShell/CMD) VSC里PHP变量未定义报错怎么解决_错误抑制技巧【解答】 Python类装饰器使用_元编程解析【教程】 Win11怎么关闭内容自适应亮度_Windows11显示设置CABC关闭 Win11如何设置鼠标灵敏度_Win11鼠标灵敏度调整教程【攻略】 php删除数据怎么软删除_添加is_del字段标记删除【技巧】 Win11时间格式怎么改成12小时制 Win11时间格式切换教程【步骤】 Win11怎么设置夜间模式_Windows11显示设置蓝光过滤强度 Windows10如何更改开机密码_Win10登录选项更改密码教程 Windows电脑键盘突然失灵怎么办?(驱动与硬件排查) Win11怎么调整屏幕亮度_Windows 11调节显示器亮度护眼设置【步骤】 MAC如何安装Git版本控制工具_MAC开发环境配置与Xcode插件安装【教程】 如何在 Go 同包不同文件中正确引用结构体 php本地部署后session无法保存_session存储路径与权限设置技巧【技巧】 Win11如何设置计划任务 Win11定时执行程序教程【详解】 PHP主流架构如何处理会话管理_Session与Cookie【技巧】 Mac的访达(Finder)怎么用_Mac文件管理入门教程【详解】 Win11怎么设置单手模式_Win11触控键盘布局调整教程【技巧】 C++如何使用std::transform批量处理容器元素?(代码示例) Mac系统更新下载慢或失败怎么办_解决macOS升级问题【方法】 php怎么下载安装并配置环境变量_命令行调用PHP技巧【技巧】 c++怎么操作redis数据库_c++ hiredis库连接与命令执行【实战】 Win11怎么恢复出厂设置_Win11重置此电脑保留文件方法【详解】 Win10怎么创建桌面快捷方式 Win10为应用创建快捷方式【步骤】 Win11怎么设置默认视频播放器_Windows 11关联媒体文件打开方式【步骤】 c# 在ASP.NET Core中管理和取消后台任务 如何从 Go 的 map[string]interface{} 中安全获取值 Linux如何安装Tomcat应用服务器_Linux环境部署与端口修改【教程】 如何使用Golang进行HTTP服务性能测试_测量吞吐量和延迟 Python多进程教程_multiprocessing模块实战 Windows10怎么备份注册表_Windows10注册表备份步骤【教程】 php增删改查需要哪些扩展_开启mysqli或pdo扩展方法【说明】 C++中的std::shared_from_this有什么用?C++安全获取this的shared_ptr【智能指针】 Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤 如何在Golang中处理二进制数据_Golang io与encoding/binary二进制操作方法
赣ICP备2024031479号