multi select 从数组更改为 select 或

multi select on change from array with selectors

在我创建的表单上,我有多个 select 框,用户可以从中 select 多个项目。就像我处理表单上的所有其他输入一样。我制作了一个包含输入类型的所有 selectors 的数组,然后遍历每个 selector 并检查输入更改。但是我遇到了 multi select 输入的问题。

// Multiselect
var multiSelect = [];
multiSelect.push('#specialties');

$.each(multiSelect, function(index, value) {

    console.info({ value }); // Outputs: '#specialties'

    // This fires
    $('#specialities').change(function(){
      console.info('test');
    });

    // This does not fire?
    $(value).change(function(){
      console.info('test');
    });

});

在上面的代码中,我创建了一个空数组。然后我推送所有元素(为了简化示例,我只有一个。) 然后对于数组中的每个项目,我输出当前的 value 进行测试。在控制台中我可以看到它输出 '#specialties' 然后我想检测这样的变化:

$(value).change(function(){
    console.info('test');
});

但由于某种原因它没有检测到变化。每当我输入 ID 而不是 value 时,它都会触发。

$('#specialties').change(function(){
    console.info('test');
});

任何人都知道这是为什么。据我所知,value'#specialties' 是完全相同的东西。但我不是什么都懂,所以问这个问题时我可能会学到一些新东西。

问题是错字

我的代码无法运行,因为我在第三行打错了字。我写了 #specialties 我应该写 #specialities 注意额外的 i.

尽管如此,mplungjan 提供的解决方案是我接受的解决方案。虽然,它完全忽略了数组。

您的代码有效

// Multiselect
var multiSelect = [];
multiSelect.push('#specialties');

$.each(multiSelect, function(index, value) {

  console.info({value}); // Outputs: '#specialties'

 
  // This ALSO fires
  $(value).change(function() {
    console.info('test');
  });

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<select id="specialties" multiple>
  <option value="">Please select</option>
  <option value="1">One</option>
  <option value="2">Two</option>
</select>

这是一个更好的版本

$(function() {
  $("#container").on("change", "select", function(e) {
    const selectedValues = $(this).val();
    console.log(Array.isArray(selectedValues) ? selectedValues.join(",") : selectedValues)
  })
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<div id="container">
  <select id="specialties" multiple>
    <option value="">Please select</option>
    <option value="1">One</option>
    <option value="2">Two</option>
  </select>
</div>