【问题标题】:Options with display:none not hidden in IE显示选项:none 不隐藏在 IE 中
【发布时间】:2013-12-04 11:00:54
【问题描述】:

我在一个选择中有多个选项。我已经对选项进行了排序,并使用 jquery 禁用并隐藏了重复的选项。该代码在 chrome 和 firefox 中运行良好,但在 IE 和 safari 中,带有 display:none 的选项仍然显示。

这是代码的jsfiddle:

<select>
  <option value="5797">34</option>
  <option value="5809">37</option>
  ... 
  <option value="5653">71</option>
  <option disabled="" selected="selected" value="53">Eye</option>
  <option disabled="disabled" style="display: none;" value="5441">52</option>
  <option disabled="disabled" style="display: none;" value="5443">52</option>
  ...
  <option disabled="disabled" style="display: none;" value="5431">51</option>
</select>

http://jsfiddle.net/7vUdb/

【问题讨论】:

  • 您在使用哪个版本的 IE 时遇到问题。我知道 IE8 及更早版本在设置选择框样式方面的能力极其有限。
  • 我在 IE 10 上测试它。
  • IE 11 仍然具有相同的行为。
  • 确认这在 Edge 中仍然是一个问题

标签: html internet-explorer select


【解决方案1】:

IE 不支持 style="display:none;" 上的 &lt;option&gt; 标签。

您唯一的选择是删除它们 - 作为 HTML 创建的一部分,或通过客户端脚本。

【讨论】:

    【解决方案2】:

    如果有人仍然面临这个问题,这是我的解决方案,它可能会有所帮助:

    $('select.some-list option[id=someId]').attr('disabled', 'disabled').hide();
    

    这会在所有浏览器中隐藏该选项,如果无法隐藏则禁用 :)。 要恢复该选项,请不要忘记启用它:

    $('select.some-list option[id=someId]').removeAttr('disabled').show();
    

    【讨论】:

    • @Gev,显示非 jquery 解决方案。
    • 这也适用于ie 9。非常感谢您的解决方案!
    • 似乎在 Edge 中不起作用。 Has been reported 在 MS Dev 论坛上,说要修复,但我仍然有问题。
    • 此解决方案无法隐藏该选项。我真的很想把它完全隐藏起来。
    • 你应该在这里使用.prop()而不是添加/删除属性
    【解决方案3】:

    您可以使用detach()remove() 来执行此操作。

    【讨论】:

      【解决方案4】:

      扩展张江黄的回答:您几乎可以缓存所有选项,将它们从下拉列表中分离出来,然后重新附加您想要的选项。

      JQuery:

      (function(){
         // Cache List
         var options = $("select option");
      
         // Clear list
         options.detach();
         // Rebuild list
         options.not(".disabled").appendTo("select");
         // Set Default
         $("select").val("");
      })();
      

      HTML:

      <select>
         <option value="">---Select One---</option>
         <option value="5797">34</option>
         <option value="5809">37</option>
          ... 
         <option value="5653">71</option>
         <option class="disabled" value="53">Eye</option>
         <option class="disabled"value="5441">52</option>
         <option class="disabled" value="5443">52</option>
         ...
         <option class="disabled" value="5431">51</option>
      </select>
      

      jsfiddle

      【讨论】:

        【解决方案5】:

        使用下面的Js隐藏选项标签

        <select id="selectlist">
              <option value="5797">34</option>
              <option value="5809">37</option>
               <option value="5653">71</option>
              <option  value="53">Eye</option>
              <option  value="5441">52</option>
              <option  value="5443">52</option>
              <option value="5431">51</option>
            </select>
        
        
        $('#selectlist option[value=53]').hide();
        $('#selectlist option[value=52]').hide();
        $('#selectlist option[value=5443]').hide();
        

        参考:jsfiddle.net/p8Gmm/7

        或者

        参考:

        http://jsfiddle.net/chiragvidani/vhKdw/

        【讨论】:

        • 我不需要删除任何选项。您的 JSfiddle 删除了该选项!
        • 你的第二个 JSfiddle 对显示做了什么!!!只有一个选项被禁用!
        • 你必须使用like $('#selectlist option[value=53]').hide();
        • @MJQ,您似乎正在等待一个解决方案,这意味着&lt;option style="display:none"&gt; 将在 IE 中工作。 别等了,没用的
        • jsfiddle.net/p8Gmm/7 看看我的这个小提琴与检查选择的元素
        【解决方案6】:

        我在一个“老问题”上的价值 2 美分,但仍然是一个相关问题。

        服务器端:

        protected void Page_Load(object sender, EventArgs e)
        {
           if (!IsPostBack)
           { //load subDropDownList all possible values [with an attribute for filtering] }
        }
        

        客户端:

        var optionList = null;
        $(function(){
          if (!optionList)
          {
             optionList = new Array();
             $("[id$='subDropDownList'] option").each(function () {
                 optionList.push({value: $(this).val(), text: $(this).text(), filterID: $(this).data("filterid") }); 
              });
          } 
        
          $("[id$='mainDropDownList']").on("change", function (e) {
             var filterID = $(this).val();
             $("[id$='subDropDownList']").html("");
        
             $.each(optionList, function () {
                if (this.filterID == filterID)
                  $("[id$='subDropDownList']").append($("<option></option>").val(this.value).html(this.text).data("filterid", this.filterID));
                });
        
        
          });
        
        })
        

        这里的想法是在客户端我将所有值加载到一个数组中,然后在主选择的更改事件中我只添加所需的选项。希望有人觉得这很有帮助。

        【讨论】:

          【解决方案7】:

          solution by @Gev 很好,但选项仍然出现(即使已禁用),因此跨浏览器的行为不一致。

          你可以amend the option tag to something else 阻止它出现,但是你会丢失任何属性或 HTML5 数据标签。

          我想出的解决方案是将您想要禁用的任何选项包装在不同的标签中(在这种情况下是一个组成的标签,它可以完成工作并清楚地说明正在发生的事情)。

          从带有可选数据标签的选项示例开始:

          <select id="myselections">
            <option data-something="a" value="5797">34</option>
            <option data-something="f" value="5809">37</option>
            <option data-something="j" value="5653">71</option>
          </select>
          

          隐藏你不想要的选项:

          $("#myselections > option").each(function () {
              if(some check) {
                  $(this).wrap("<optionhidden></optionhidden>");
              }
          });
          

          在隐藏不同选项之前在整个列表中撤消上述操作:

          $("#myselections > optionhidden").each(function () {
              $(this).replaceWith($(this).html());
          });
          

          【讨论】:

            【解决方案8】:

            在 IE 10、11、Edge 中也存在同样的问题。 选项不会像 Firefox、Chrome、..那样消失。

            (jQuery-代码)

            无效:

            • $('option').hide();
            • $('option').attr('style', 'display: none !important');
            • $('option').attr('disabled', 'disabled');

            但这行得通!

            $('option').unwrap('div').wrap('<div style="display: none;" />');
            

            【讨论】:

              【解决方案9】:

              试试下面的代码

              <!DOCTYPE html>
              <html>
              <head>
              <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
              <script>
              var detachedSecondElem,detachedFirstElem="";
              var firstDetachedAt, secondDetachedAt;
              function changedFirst(){
               var val1=$('#slct').val();
               if(detachedSecondElem!="")
                $( detachedSecondElem ).insertAfter( $("#slct1 option").eq((secondDetachedAt-1)) );
              
               if(val1!=""){
                 secondDetachedAt = $('#slct1 option[value="'+val1+'"]').prevAll().length;
                 detachedSecondElem = $('#slct1 option[value="'+val1+'"]').detach();
               }
              }
              function changedSecond(){
               var val2=$('#slct1').val();
               if(detachedFirstElem!="")
                $( detachedFirstElem).insertAfter( $("#slct option").eq((firstDetachedAt-1)) );
              
               if(val2!=""){
                 firstDetachedAt= $('#slct option[value="'+val2+'"]').prevAll().length;
                 detachedFirstElem= $('#slct option[value="'+val2+'"]').detach();
               }
              }
              </script>
              </head>
              <body>
              <select id="slct" onchange="changedFirst();"> 
               <option value="">Select</option>
               <option value="0">0</option>
               <option value="1">1</option>
               <option value="2">2</option>
               <option value="3">3</option>
              </select>
              <select id="slct1" onchange="changedSecond();"> 
               <option value="">Select</option>
               <option value="0">0</option>
               <option value="1">1</option>
               <option value="2">2</option>
               <option value="3">3</option>
              </select>
              <input type="button" value="click me" onclick="disableOption();"/>
              <input type="button" value="click me" onclick="attachElem();"/>
              </body>
              </html>
              

              【讨论】:

                【解决方案10】:
                sort by disabled options. 
                
                $("#addselect option").each(function (i, val) {
                                if ($(this)[i].disabled) {
                                    moveDown("selectId");
                                }
                                else {
                                    moveUp("selectId");
                                }
                 }
                
                   function moveUp(selectId) {
                            var selectList = document.getElementById(selectId);
                            var selectOptions = selectList.getElementsByTagName('option');
                            for (var i = 1; i < selectOptions.length; i++) {
                                var opt = selectOptions[i];
                                if (!opt.disabled) {
                                    selectList.removeChild(opt);
                                    selectList.insertBefore(opt, selectOptions[i - 1]);
                                }
                            }
                        }
                
                        function moveDown(selectId) {
                            var selectList = document.getElementById(selectId);
                            var selectOptions = selectList.getElementsByTagName('option');
                            for (var i = selectOptions.length - 2; i >= 0; i--) {
                                var opt = selectOptions[i];
                                if (opt.disabled) {
                                    var nextOpt = selectOptions[i + 1];
                                    opt = selectList.removeChild(opt);
                                    nextOpt = selectList.replaceChild(opt, nextOpt);
                                    selectList.insertBefore(nextOpt, opt);
                                }
                            }
                        }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2014-05-28
                  • 2013-07-18
                  • 2017-04-10
                  • 1970-01-01
                  • 2012-12-17
                  • 2014-11-23
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多