Select2 - 打开下拉列表后形成下拉列表时需要一个事件

Posted

技术标签:

【中文标题】Select2 - 打开下拉列表后形成下拉列表时需要一个事件【英文标题】:Select2 - need a event when drop down list is formed after opening the dropdown 【发布时间】:2016-12-08 23:48:37 【问题描述】:

我正在使用 select2 jquery 插件

我正在使用open 事件

var select2 = $('select').select2();
select2.on("select2:open", () => 
   // I want to do some code here with $('.select2-results__option')
   //$('.select2-results__option').size() is not equal to actual elements 
);

当我们点击下拉菜单时触发此事件。但我没有在这个事件中得到下拉元素。

我有 2000 个下拉元素。但在公开活动中,我没有得到。是否有任何事件检测下拉列表是否已填充。

【问题讨论】:

如果你只是想获取元素 -***.com/questions/16187672/… @rashleighp 我没有使用query,我还需要open event之后的元素 【参考方案1】:

我在打开后尝试删除项目时遇到了类似的问题。

您可以使用异步函数来检查列表是否完整:

select2.on("open", function (e) 
   asyncCheck();
);

async asyncCheck() 
  // Waiting for 0 milliseconds was enough for me, maybe you need to increase the value
  await new Promise(resolve => window.setTimeout(resolve, 0));

  // Here comes your check, if list is completly populated ...

但请注意,这 不适用于 IE 11,因为 IE 11 不支持异步和 Promise(请参阅 Can I Use 中的 Promises 和 async function em>

我的 IE 11 解决方法如下所示:

$(document).ready(checkContinuously());

function checkContinuously() 
  // Do your check here
  setTimeout(checkContinuouslyForNullOption, 100);

但是它有一个明显的缺点,就是总是执行检查,并且理论上可能会导致堆栈溢出,因为它使用递归。

【讨论】:

【参考方案2】:

尝试捕捉 select2 本身(不是 DOM)的“结果:所有”事件。

这里来自 Select2.prototype._registerEvents:

this.on('query', function (params) 
  if (!self.isOpen()) 
    self.trigger('open', );
  

  this.dataAdapter.query(params, function (data) 
    self.trigger('results:all', 
      data: data,
      query: params
    );
  );
);

正如我们所见,在查询 dataAdapter 之前触发了 open,这是因为您在其处理程序 I guest 中没有选项。

select2.on("results:all", function (args)  console.log(args.data););

【讨论】:

我想对open事件中的$('.select2-results__option')元素做一些操作。我在select:open 事件中得到了数据,但没有得到$('.select2-results__option') 元素【参考方案3】:

查找是否有选项的一种方法是 $('#select').find("option").length 提供了选项的数量。

小提琴Here

【讨论】:

@murli2308 添加了小提琴 不回答问题。

以上是关于Select2 - 打开下拉列表后形成下拉列表时需要一个事件的主要内容,如果未能解决你的问题,请参考以下文章

防止 select2 在打开下拉列表时自动聚焦其搜索输入

Select2 下拉列表如何通过 AJAX 加载结果

动态填充 select2 下拉列表

在选择另一个 select2 下拉列表时重置一个 select2 下拉列表的元素

如何将唯一 ID 添加到 select2 下拉列表

使用 jQuery Select2 清除下拉列表