javascript - 有效地对多个选择选项进行排序

标签 javascript jquery

我是 JQuery 的新手,一般来说是编程,但最近几天一直在试验它,因此可以按字母顺序对多个选择选项下拉列表进行排序。我想出了一个解决方案,但我确信有一种更有效的方法来编写它,但目前它超出了我的范围。如何在不直接调用它们的情况下完成每个选择?它需要在没有用户交互的情况下在页面加载时发生。

window.addEventListener("load", function () {
    $("select[name='properties[Flavour 1]']").html($("select[name='properties[Flavour 1]'] option").sort(function (a, b) {
        return a.text == b.text ? 0 : a.text < b.text ? -1 : 1
    }))
    $("select[name='properties[Flavour 1]']").get(0).selectedIndex = 0;
  //Flavour 2
    $("select[name='properties[Flavour 2]']").html($("select[name='properties[Flavour 2]'] option").sort(function (a, b) {
        return a.text == b.text ? 0 : a.text < b.text ? -1 : 1
    }))
    $("select[name='properties[Flavour 2]']").get(0).selectedIndex = 0;
  //Flavour 3
    $("select[name='properties[Flavour 3]']").html($("select[name='properties[Flavour 3]'] option").sort(function (a, b) {
        return a.text == b.text ? 0 : a.text < b.text ? -1 : 1
    }))
    $("select[name='properties[Flavour 3]']").get(0).selectedIndex = 0;
}, false);

这一直持续到 flavor 12,但您了解它是如何设置的。

最佳答案

这应该给你一个通用的解决方案,我添加了一个包装器,这样我就可以获得计数而不是对数字进行硬编码或污染全局 DOM。我添加了文档级替代方案,但如果可以,请将其删除。

注意:经过仔细考虑后,我注意到您的“Flavours”拼写并得出结论认为这可能需要一些本地化,因此,我修改了排序以改为使用它。 返回 a.text.localeCompare(b.text);

我还添加了类来显示那些被保留的以及任何选定的默认调整以保留先前的值。

对于第二个示例,我将所有内容压缩为一个较短的 jQuery 版本,展开它可以在那里看到它。

更多关于排序细节的信息:What is the most efficient way to sort an Html Select's Options by value, while preserving the currently selected item?

window.addEventListener("load", function() {
  let myflavours = $('#flavours').find('select[name^="properties[Flavour"]').length;
  //alternate
  let myflavoursNotAsGood = $(document).find('select[name^="properties[Flavour"]').length;
  console.log(myflavoursNotAsGood);
  for (let f = 1; f <= myflavours; f++) {
    let sel = $("select[name='properties[Flavour " + f + "]']");
    let v = sel.val();
    let opts = sel.find("option").sort(function(a, b) {
      return a.text.localeCompare(b.text);
    });
    sel.html(opts).val(v);
  }
}, false);
.water {
  color: blue;
}

.drink {
  color: orange;
}

.yuk {
  color: brown;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<div id="flavours">
  <select name='properties[Flavour 1]'>
    <option>Cheese</option>
    <option>Apple</option>
    <option selected="selected">Cotton Candy</option>
    <option>Blueberry</option>
    <option class="yuk">Rotten Eggs</option>
    <option class="water">Swamp Water</option>
    <option class="water">Swamp Scum</option>
  </select>
  <select name='properties[Flavour 2]'>
    <option>Cheese</option>
    <option>Apple Smoked Bacon</option>
    <option selected="selected">Blueberry</option>
    <option class="yuk">Rotten Eggs</option>
    <option class="drink">Bier</option>
    <option>Bacon</option>
    <option class="water">Swamp Water</option>
    <option class="water">Swamp Scum</option>
  </select>
</div>

第二个示例与您的稍有不同。

$(function() {
  $('#flavours').find('select[name^="properties[Flavour"]')
    .each(function(index, element) {
      let v = element.value;
      $(this).html($(this).find("option").sort(function(a, b) {
        return a.text.localeCompare(b.text);
      })).val(v);
    });
});
.water {
  color: blue;
}

.drink {
  color: orange;
}

.yuk {
  color: brown;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<div id="flavours">
  <select name='properties[Flavour 1]'>
    <option>Cheese</option>
    <option>Apple</option>
    <option selected="selected">Cotton Candy</option>
    <option>Blueberry</option>
    <option class="yuk">Rotten Eggs</option>
    <option class="water">Swamp Water</option>
    <option class="water">Swamp Scum</option>
  </select>
  <select name='properties[Flavour 2]'>
    <option>Cheese</option>
    <option>Apple Smoked Bacon</option>
    <option selected="selected">Blueberry</option>
    <option class="yuk">Rotten Eggs</option>
    <option class="drink">Bier</option>
    <option>Bacon</option>
    <option class="water">Swamp Water</option>
    <option class="water">Swamp Scum</option>
  </select>
</div>

关于javascript - 有效地对多个选择选项进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55539069/

相关文章:

javascript - 多次为页面上的单个元素设置动画

javascript - 如何动画 svg 组元素(基本上缩放)

javascript - 将代码应用于动态加载的图像

javascript - 为什么我的 jQuery .map 不能在这里组合我的数组?

javascript - 如何仅在未与元素交互时为其设置动画?

javascript - 使用 bootstrap 向下和向后滚动

javascript - PHP + Javascript 如何正确放置 iframe

javascript - 如何检查一个字符串数组是否包含 JavaScript 中的一个字符串?

javascript - 如何使用具有相同 ID 的多个按钮打开相同模式?

javascript - Kendo Grid 的列在 IE 10 和 IE 11 中不可调整大小