【问题标题】:filter select boxes based on value or id of each option根据每个选项的值或 id 过滤选择框
【发布时间】:2015-08-24 13:36:26
【问题描述】:

我想用 jquery 过滤表单中的所有选择框

例如:在第一个选择框中,如果我选择“仅显示 1”,我想过滤所有选择元素中的所有选择选项,以隐藏值不包含“_1”的任何选项。应该只显示带有“_1”的产品值。

如果选择“---Filter---”选项,则所有选择框的默认值应为空白

这里是 HTML

<select id="selectlist" name="selectlist" >
    <option value="">---Filter---</option>
    <option value="1">show only 1</option>
    <option value="2">show only 2</option>
    <option value="3">show only 3</option>
</select>
<br><br>
homeware<select id="select1" name="select1">
    <option value=""></option>
    <option value="product_1">product 1</option>
    <option value="product_2">product 2</option>
    <option value="product_3">product 3</option>
</select>
<br>
electronics<select id="select2" name="select2">
    <option value=""></option>
    <option value="product_1">product 1</option>
    <option value="product_2">product 2</option>
    <option value="product_3">product 3</option>
</select>
    <br>
kitchen<select id="select3" name="select3">
    <option value=""></option>
    <option value="product_1">product 1</option>
    <option value="product_2">product 2</option>
    <option value="product_3">product 3</option>
</select>

很想知道如何使用 Jquery 来实现上述目标

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    您可以使用contains 选择器"option[value*='" + sel + "']" 过滤掉值并隐藏。要恢复,请检查所选值是否存在(在您的情况下为空白)并同时显示重置所有选择的值。

    示例

    $("#selectlist").on("change", function() {
        var sel = $(this).val(), 
            $ddl = $("#select1, #select2, #select3");
        if (!sel) { // if there is no value means first option is selected
          $ddl.find("option").show(); $ddl.val(''); // show all options and reset the value
        } 
        else {
          $ddl.find("option").hide(); // hide all options
          // show only those options which contain the selected value, 
          // set the selected property to true for the only remaining ones
          $ddl.find("option[value*='" + sel + "']").show().prop('selected', true);
        }
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <select id="selectlist" name="selectlist" >
        <option value="">---Filter---</option>
        <option value="1">show only 1</option>
        <option value="2">show only 2</option>
        <option value="3">show only 3</option>
    </select>
    <br><br>
    homeware<select id="select1" name="select1">
        <option value=""></option>
        <option value="product_1">product 1</option>
        <option value="product_2">product 2</option>
        <option value="product_3">product 3</option>
    </select>
    <br>
    electronics<select id="select2" name="select2">
        <option value=""></option>
        <option value="product_1">product 1</option>
        <option value="product_2">product 2</option>
        <option value="product_3">product 3</option>
    </select>
        <br>
    kitchen<select id="select3" name="select3">
        <option value=""></option>
        <option value="product_1">product 1</option>
        <option value="product_2">product 2</option>
        <option value="product_3">product 3</option>
    </select>

    如果您想将默认值始终保留为空白(而不是选择过滤选项),则只需删除最后一个 .prop('selected', true)

    示例 2

    $("#selectlist").on("change", function() {
        var sel = $(this).val(), 
            $ddl = $("#select1, #select2, #select3");
        if (!sel) { // if there is no value means first option is selected
          $ddl.find("option").show(); $ddl.val(''); // show all options and reset the value
        } 
        else {
          $ddl.find("option").hide(); // hide all options
          // show only those options which contain the selected value, 
          // set the selected property to true for the only remaining ones
          $ddl.find("option[value*='" + sel + "']").show();
        }
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <select id="selectlist" name="selectlist" >
        <option value="">---Filter---</option>
        <option value="1">show only 1</option>
        <option value="2">show only 2</option>
        <option value="3">show only 3</option>
    </select>
    <br><br>
    homeware<select id="select1" name="select1">
        <option value=""></option>
        <option value="product_1">product 1</option>
        <option value="product_2">product 2</option>
        <option value="product_3">product 3</option>
    </select>
    <br>
    electronics<select id="select2" name="select2">
        <option value=""></option>
        <option value="product_1">product 1</option>
        <option value="product_2">product 2</option>
        <option value="product_3">product 3</option>
    </select>
        <br>
    kitchen<select id="select3" name="select3">
        <option value=""></option>
        <option value="product_1">product 1</option>
        <option value="product_2">product 2</option>
        <option value="product_3">product 3</option>
    </select>

    注意

    IE 不允许在 options 上使用 hide。解决方法是使用.prop('disabled', true) 作为优雅降级。

    小提琴:http://jsfiddle.net/abhitalks/c9a3fLy5/

    示例 3

    $("#selectlist").on("change", function() {
        var sel = $(this).val(), 
            $ddl = $("#select1, #select2, #select3");
        if (!sel) { // if there is no value means first option is selected
          $ddl.find("option").show().prop('disabled', false); $ddl.val(''); // show all options and reset the value
        } 
        else {
          $ddl.find("option").hide().prop('disabled', true); // hide all options
          // show only those options which contain the selected value, 
          // set the selected property to true for the only remaining ones
          $ddl.find("option[value*='" + sel + "']").show().prop('selected', true).prop('disabled', false);
        }
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <select id="selectlist" name="selectlist" >
        <option value="">---Filter---</option>
        <option value="1">show only 1</option>
        <option value="2">show only 2</option>
        <option value="3">show only 3</option>
    </select>
    <br><br>
    homeware<select id="select1" name="select1">
        <option value=""></option>
        <option value="product_1">product 1</option>
        <option value="product_2">product 2</option>
        <option value="product_3">product 3</option>
    </select>
    <br>
    electronics<select id="select2" name="select2">
        <option value=""></option>
        <option value="product_1">product 1</option>
        <option value="product_2">product 2</option>
        <option value="product_3">product 3</option>
    </select>
        <br>
    kitchen<select id="select3" name="select3">
        <option value=""></option>
        <option value="product_1">product 1</option>
        <option value="product_2">product 2</option>
        <option value="product_3">product 3</option>
    </select>

    【讨论】:

    • 谢谢!这很好用。虽然,我更喜欢选择框中的默认值始终为空白。您的解决方案会自动填充.. 将其留空以允许用户选择是否可以快速解决?
    • @user3436467:当然。只需删除末尾的.prop('selected', true) 部分即可。
    • 知道为什么代码不能在 IE 浏览器中运行吗?适用于 chrome 和 firefox..
    • @user3436467:很好!添加到答案中。 IE 不允许在options 上使用hide。解决方法是使用.prop('disabled', true)
    • 它有所帮助,但在 IE 中隐藏的选项显示为灰色。我们对此无能为力吗?
    【解决方案2】:

    步骤如下:

    1) 获取基于主选需要切换的子选元素选项元素。

    2) 在主选择上写入更改事件

    3) 隐藏所有选项并显示其值包含主选择选项选定值的选项。

    4) 附加事件后触发更改,以确保默认情况下所有其他选择元素都被隐藏

    var otherselectoption = $('#select1,#select2,#select3').find('option');
    $('#selectlist').change(function(){
     var selected = $(this).val();
     otherselectoption.hide().filter(function(){
        return ($(this).attr('value').indexOf(selected) > -1 || $(this).attr('value') == "")
    }).show();
    }).change();
    

    Working Demo

    【讨论】:

    • 感谢您的解决方案。过滤正在工作,但当我选择“---Filter---”时,它不会将所有选择框的默认选项设置为空白。这可以考虑到您的解决方案吗?
    • 当然...让我修一下小提琴
    • 对不起,如果我不清楚。我的意思是将所有选择框的默认设置为空白,但它仍然应该具有所有选项。您的最新解决方案删除了​​所有选项。再次,如果我不清楚,我很抱歉。
    • 我注意到您的代码在 IE 中不起作用 - 浏览器抱怨调试器 - 您可以检查它并进行必要的调整吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2021-09-04
    • 1970-01-01
    • 2020-10-09
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多