You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Select2事件多次触发问题:动态添加的多选下拉框单次操作生成多条日志

问题根源分析

你遇到的事件重复触发问题,核心原因是每次.optionsDropDown的change事件触发时,你都给#myid重复绑定了select2:select和select2:unselect事件。随着change事件多次触发,#myid上会累积多个相同的事件监听器,导致每次选择/取消操作时,这些监听器都会执行一遍,就出现了重复日志。

解决方案

有几种可行的修复方式,推荐优先使用以下两种:

方式1:绑定前先解绑旧的事件监听器

在绑定新的事件之前,先用.off()移除之前绑定的同名事件,避免监听器叠加:

$(document).on('change', '.optionsDropDown', function (e) {
  // 先解绑之前的select2事件,再重新绑定
  $('#myid')
    .off('select2:select select2:unselect')
    .on('select2:select', function (e) {
      var data = e.params.data;
      console.log(data)
    })
    .on('select2:unselect', function (e) {
      var data = e.params.data;
      console.log(data)
    })
})

方式2:直接使用事件委托绑定到文档(更适合动态元素)

既然你的下拉框是动态添加的,完全可以把select2的事件直接委托到document上,不需要嵌套在.optionsDropDown的change事件里,这样只会绑定一次,从根源避免重复:

// 直接委托select2事件到document,适配动态生成的#myid
$(document).on('select2:select', '#myid', function (e) {
  var data = e.params.data;
  console.log(data)
})

$(document).on('select2:unselect', '#myid', function (e) {
  var data = e.params.data;
  console.log(data)
})

// 原来的.optionsDropDown change事件保留你需要的其他逻辑即可
$(document).on('change', '.optionsDropDown', function (e) {
  // 这里写你原本需要在change时执行的其他操作,无需再绑定select2事件
})
为什么非动态元素没问题?

非动态添加的下拉框,你应该是页面加载完成后只绑定了一次select2事件,没有重复绑定的过程,所以不会出现监听器叠加的情况。

内容的提问来源于stack exchange,提问作者Ashish Chinchkhede

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:47:36