【问题标题】:Hide option from dropdown 2 when selected in dropdown 1在下拉列表 1 中选择时隐藏下拉列表 2 中的选项
【发布时间】:2015-10-29 20:35:33
【问题描述】:

我有两个下拉菜单,它们都有相同的项目。如果在下拉列表 1 中选择了一个选项,那么我想在下拉列表 2 中隐藏该选项。当它在下拉列表 1 中未选中时,我希望它再次出现在下拉列表 2 中,然后选择哪个选项然后隐藏在下拉列表 2 中. 我试图排除第一个索引中的空白选项。

这是我开始的一个代码笔,但我不知道从哪里开始:

http://codepen.io/cavanflynn/pen/EjreJK

    var $dropdown1 = $("select[name='dropdown1']");
    var $dropdown2 = $("select[name='dropdown2']");

    $dropdown1.change(function () {
        var selectedItem = $($dropdown1).find("option:selected").val;
});

感谢您的帮助!

【问题讨论】:

  • 你不能隐藏<option>标签,它不能跨浏览器工作。选项是禁用或删除
  • 有什么办法可以只隐藏文本(整行,所以它不会在下拉菜单中显示为空行)
  • 禁用/启用是最好的选择,因为 hide 不适用于所有浏览器!
  • 不难存储所有选项并过滤它们以便删除/添加它们。隐藏文本不会阻止选择该选项

标签: javascript jquery html drop-down-menu


【解决方案1】:

你应该使用这个插件http://gregfranko.com/jquery.selectBoxIt.js

它有一些非常好的回调和自定义选项。

当一个更改时,您可以将其放在回调中以更新另一个。

【讨论】:

    【解决方案2】:

    这是一种方法。您确实需要包含 jQuery,然后只要该值不为空,就可以隐藏具有相似值的选项。

    var $dropdown1 = $("select[name='dropdown1']");
    var $dropdown2 = $("select[name='dropdown2']");
    
    $dropdown1.change(function() {
      $dropdown2.children().show();
      var selectedItem = $($dropdown1).val();
      if (selectedItem != "")
        $('select[name="dropdown2"] option[value="' + selectedItem + '"]').hide();
    });
     $dropdown2.change(function() {
      $dropdown1.children().show();
      var selectedItem = $($dropdown2).val();
      if (selectedItem != "")
        $('select[name="dropdown1"] option[value="' + selectedItem + '"]').hide();
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <select name="dropdown1">
      <option></option>
      <option value="1">Test 1</option>
      <option value="2">Test 2</option>
      <option value="3">Test 3</option>
    </select>
    
    <select name="dropdown2">
      <option></option>
      <option value="1">Test 1</option>
      <option value="2">Test 2</option>
      <option value="3">Test 3</option>
    </select>

    【讨论】:

    • 隐藏不能跨浏览器工作...例如在 IE 中尝试此代码。会失败
    • 别用IE,windows已经转了,FF和Chrome都可以用
    • 相信我...这在某些浏览器中不起作用...尝试 safari。 SO上有100个类似的帖子
    • 您可以使用 remove() 而不是 hide() 但为此您需要动态创建选择框。
    • 我知道它不适用于所有浏览器,但它不可能取悦所有人,即使是纯 html,所以一个适用于两个主要浏览器的解决方案应该是令人满意的,看看w3schools.com/browsers/browsers_stats.asp看到大约 80% 的人使用 FF 或 Chrome
    【解决方案3】:

    正如 cmets 中所说,其中一个选项是根据第一次选择中的选择禁用/启用选项,如下所示。这适用于所有浏览器,而不是隐藏/显示。

    var $dropdown1 = $("select[name='dropdown1']");
    var $dropdown2 = $("select[name='dropdown2']");
    
    $dropdown1.change(function() {
        $dropdown2.find('option').prop("disabled", false);
        var selectedItem = $(this).val();
        if (selectedItem) {
            $dropdown2.find('option[value="' + selectedItem + '"]').prop("disabled", true);
        }
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <select name="dropdown1">
      <option></option>
      <option value="1">Test 1</option>
      <option value="2">Test 2</option>
      <option value="3">Test 3</option>
    </select>
    
    <select name="dropdown2">
      <option></option>
      <option value="1">Test 1</option>
      <option value="2">Test 2</option>
      <option value="3">Test 3</option>
    </select>

    另一个选项是根据.clone() 在第一个下拉列表中的选择删除/添加第二个下拉列表中的选项,如下所示。

    var $dropdown1 = $("select[name='dropdown1']");
    var $dropdown2 = $("select[name='dropdown2']");
    
    $dropdown1.change(function() {
        $dropdown2.empty().append($dropdown1.find('option').clone());
        var selectedItem = $(this).val();
        if (selectedItem) {
            $dropdown2.find('option[value="' + selectedItem + '"]').remove();
        }
    });
    

    A Demo

    【讨论】:

    • 正是我所需要的。仅当第一个选项不为空时。在这种情况下,它不起作用。因为它与“更改”触发器一起使用。添加这行额外的代码可以解决它。` var a = $("#dropdown1 option:selected").val(); $('#dropdown2').find('option[value=' + a + ']').hide();`
    【解决方案4】:

    这是一种方法,它在页面加载时存储一组选项,然后在进行更改时过滤备用选择。它适用于对任一选择进行的更改

    var $drops = $('.drop'),
    // store a set of options
    $options = $drops.eq(1).children().clone();
    
    $drops.change(function(){
        var $other = $drops.not(this),
            otherVal = $other.val(),
            newVal = $(this).val(),
            $opts = $options.clone().filter(function(){
               return this.value !== newVal; 
            })
         $other.html($opts).val(otherVal);    
    });
    

    值也将保持不变,这是 2 个方向的,因此其中任何一个的更改都会过滤另一个

    DEMO

    【讨论】:

      【解决方案5】:

      var $dropdown1 = $("select[name='dropdown1']");
      var $dropdown2 = $("select[name='dropdown2']");
      $dropdown1.change(function() {
          var selectedItem = $(this).val();
          var $options = $("select[name='dropdown1'] > option").clone();  
          $("select[name='dropdown2']").html($options);
          $("select[name='dropdown2'] > option[value="+selectedItem+"]").remove();  
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
      <select name="dropdown1">
        <option></option>
        <option value="1">Test 1</option>
        <option value="2">Test 2</option>
        <option value="3">Test 3</option>
      </select>
      
      <select name="dropdown2">
        <option></option>
        <option value="1">Test 1</option>
        <option value="2">Test 2</option>
        <option value="3">Test 3</option>
      </select>

      Demo

      【讨论】:

        【解决方案6】:

        好吧,这段代码将在必要的选择中按值查找选项并将其删除。

        http://codepen.io/anon/pen/LVqgbO

        var $dropdown1 = $("select[name='dropdown1']");
        var $dropdown2 = $("select[name='dropdown2']");
        
        var populateDropdown = function(element) {
          element.find("option").remove();
          element.append("<option></option>");
          // There should be real data
          for (var i = 1; i <= 3; i++) {
            element.append("<option value='" + i + "'>Test " + i + "</option>");
          }
        }
        
        var getOptionProps = function(element) {
          var selectedValue = element.val();
          var selectedText = element.find("option[value=" + selectedValue + "]").text();
          return { text: selectedText, value: selectedValue };
        }
        
        var removeOptionWithValue = function(element, value) {
          element.find("option[value='" + value + "']").remove();
        }
        
        $dropdown1.on("change", function () {
          var selectedProps = getOptionProps($(this));
          populateDropdown($dropdown2);
          removeOptionWithValue($dropdown2, selectedProps.value);
        });
        
        $dropdown2.on("change", function () {
          var selectedProps = getOptionProps($(this));
          populateDropdown($dropdown1);
          removeOptionWithValue($dropdown1, selectedProps.value);
        });

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-05
          • 2020-03-04
          • 2018-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多