您好,欢迎访问宜昌市隼壹珍商贸有限公司
本文讲解如何在动态生成多个 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 的独立显隐控制。
# jquery # html # js # 处理器 # 属性选择器 # for # select # 标识符 # 循环 # class # 委托 # 事件 # dom # this # 选择器 # 绑定 # 多个 # 表单 # 第一个 # 还会 # 推荐使用 # 要对 # 报错 # 而非
相关栏目: 【 行业新闻 】 【 网络资讯 】 【 网络推广 】 【 技术学院 】 【 营销学院 】 【 云计算 】 【 AI营销 】 【 百度推广 】
相关推荐: Laravel如何发送系统通知?(Notification渠道示例) Laravel如何使用队列处理后台任务?(Queue实战指南) Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】 Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】 Laravel如何实现API速率限制?(Rate Limiting教程) Win11怎么关闭自动调节亮度 Win11禁用内容自适应亮度【设置】 Cython 三分钟入门教程 Win11怎样彻底卸载自带应用_Win11彻底卸载自带应用方法【步骤】 Laravel如何测试发送邮件和通知的功能 laravel怎么在测试中断言(assert)一个事件被分发_laravel测试中事件断言方法 Laravel如何配置和使用多个数据库连接 laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程 Win11怎么关闭系统推荐内容_Windows11开始菜单布局设置 js 冒泡事件与事件监听使用分析 Linux怎么实现内网穿透_Linux安装Frp客户端与服务端配置【方法】 Win11鼠标灵敏度怎么调 Win11鼠标指针移动速度设置【教程】 asp 通用修改和增加函数代码 Win11怎么忘记WiFi网络_Win11删除已保存无线连接【教程】 Laravel如何实现用户密码重置功能?(完整流程代码) WindowsUSB驱动安装异常怎么办_USB驱动重建与恢复教程 Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】 Linux怎么修改用户密码_Linux系统passwd命令使用与权限管理【方法】 Laravel观察者模式如何使用_Laravel Model Observer配置 Windows10怎么备份注册表_Windows10注册表备份步骤【教程】 Win11怎么看电池循环次数_Win11笔记本电池寿命检测【命令】 Mootools 1.2教程 滑动效果(Slide) Laravel用户密码怎么加密_Laravel Hash门面使用教程 Laravel怎么实现全文搜索_Laravel Scout集成Algolia教程 Laravel中的路由模型绑定是什么以及如何使用 GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息? Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试 Windows 11怎么设置默认解压软件_Windows 11为ZIP/RAR文件指定默认打开程序 Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】 Win10如何备份驱动程序_Win10驱动备份步骤【攻略】 Mootools 1.2教程 同时进行多个形变动画 Ajax Control Toolkit 34个服务器端控件第1/2页 Laravel怎么配置和使用Horizon监控Redis队列 laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法 Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程 Win10如何卸载WindowsDefender_Win10卸载Defender教程【方法】 Win11怎么更改任务栏位置_修改注册表将Win11任务栏置顶【教程】 Win11怎么设置默认终端应用_Windows11开发者选项终端 Laravel怎么处理图片裁剪_Laravel Intervention Image使用详解 Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能 Laravel表单重复提交怎么解决_Laravel防止重复请求方法 Win10如何设置双wan路由器 Win10双wan路由器设置方法【指南】 Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理 Win11怎么更改管理员名字 Win11修改账户名称详细步骤【教程】 Laravel如何为API生成Swagger或OpenAPI文档 Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
全国统一服务电话
电子邮箱:879577@qq.com
公司地址:宜昌市西陵区黄河路5号三峡明珠10栋1051室
咨询微信
TEL:13680874598