【问题标题】:Get the index of recently selected option in multiselect dropdown jquery在多选下拉jQuery中获取最近选择的选项的索引
【发布时间】:2016-02-16 18:42:24
【问题描述】:

我的 html 页面中有一个选择下拉菜单。如何获取最近选择的选项的索引,而不是最后一个。我看到我们可以使用'last',但它会给出最后一个不是最近选择的选项。

HTML

<select class="carMenu" name="cars" multiple>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>

jQuery

$(document).ready(function () {
    $('.carMenu').change(function(){
         console.log($('option:selected',$(this)).index());
    });
});

如果我们选择“欧宝”,然后选择“沃尔沃”,我们应该得到零作为索引。但现在它给出了“欧宝”的索引。

【问题讨论】:

  • 网页本身不会保留旧表单输入值的“记忆”。您必须使用.change() 将每个选择存储在一个变量中。您甚至可以使用 .data() 将此选择历史记录附加到元素本身
  • 我在 Chrome 48 上使用 jquery-2.2.0.min.js 尝试了您的代码,我看到了正确的索引。我不确定我是否理解这个问题?
  • 对您尝试解决的更高级别问题的更好解释会有所帮助
  • 请注意,用户可以在多选中一次选择多个&lt;option&gt;,因此change 可能反映与之前change 的许多不同之处
  • 最近是什么意思?你的意思是点击选项?

标签: javascript jquery html


【解决方案1】:

每次,我都会得到carMenu 值,其中包含所有选定选项的值,然后我将其与上次比较以检测最近添加了哪个项目。代码还支持取消选择选项。事实上,它保留了一堆indexes 并在取消选择时弹出index。试试代码:

var recent_options = selected_options = added_options = removed_options = [];
var current_values, index;
$(document).ready(function () {
    $('.carMenu').change(function(){
        current_values = $(this).val();
        if (current_values && current_values.length > 0) {
            added_options = current_values.filter(function(x) { return recent_options.indexOf(x) < 0 });
            if (added_options.length > 0) {
                selected_options.push($(this).find("option[value='" + added_options[0] + "']").index());
                console.log("last selected option is : " + selected_options[selected_options.length-1]);
            }
            else {
                removed_options = recent_options.filter(function(x) { return current_values.indexOf(x) < 0 });
                if (removed_options.length > 0) {   
                    index = selected_options.indexOf($(this).find("option[value='" + removed_options[0] + "']").index());
                    if (index > -1)
                        selected_options.splice(index, 1);
                    console.log("last selected option is : " + selected_options[selected_options.length-1]);
                }
            }
        }
        recent_options = current_values ? current_values : [];
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<select class="carMenu" name="cars" multiple>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>

如果您不想支持取消选择选项,只需删除 else 的一部分 if (added_options.length &gt; 0)

还要注意indexOf browser support

JsFiddle:https://jsfiddle.net/m3hranTi/uzc9jzps/

【讨论】:

    【解决方案2】:

    不要使用.change() 事件,而是在选项上使用.click()

    $(function() {
      $('.carMenu option').click(function() {
        if ($(this).is(':selected')) {
          console.log($(this).index());
        }
      });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <select class="carMenu" name="cars" multiple>
      <option value="volvo">Volvo</option>
      <option value="saab">Saab</option>
      <option value="opel">Opel</option>
      <option value="audi">Audi</option>
    </select>

    【讨论】:

    • 很惊讶你不知道click 选项不支持跨浏览器。在 IE 中肯定是没用的,我认为 Safari 也是如此。似乎 OP 也想知道与以前的选择相比发生了什么变化
    猜你喜欢
    • 2010-09-16
    • 2022-01-05
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    相关资源
    最近更新 更多