【问题标题】:Hiding Options of a Select with JQuery使用 JQuery 隐藏 Select 的选项
【发布时间】:2011-06-09 14:56:39
【问题描述】:

好的,让我们从一个例子开始。
请记住,这只是一个示例。

<select id = "selection1">
<option value = "1" id = "1">Number 1</option>
<option value = "2" id = "2">Number 2</option>
<option value = "3" id = "3">Number 3</option>
</select>

现在,我们有一个包含 3 个选项的下拉菜单。
我现在要做的是隐藏一个选项。

添加 style = "display:none"没有帮助。
该选项不会出现在下拉列表中,但使用箭头键,您仍然可以选择它。
从本质上讲,它完全按照代码所说的那样做。它不显示,并停在那里。

$("#1").hide() 的 JQuery 函数将不起作用。
另外,我不仅想隐藏该选项,还想完全删除它。

有可能这样做吗?
我必须使用父/兄弟/子元素吗?如果是这样,我仍然不确定如何。

对此的任何帮助将不胜感激。谢谢。

另一个问题 - 它是相关的

好的,所以我发现在 JQuery 中有一个 .remove() 可用。效果很好。
但是如果我想把它带回来呢?

如果(条件)
{
$(this).remove();
}

我可以循环播放。不应该很复杂。
但我想做的是:

班级的最大容量:(此处输入字段)
选择房间:(此处下拉)

我希望它使用.change().keyup 等函数更新下拉列表。
我只能在输入内容后创建下拉列表。在更改或键入时,相应地执行下拉菜单。
但我正在做的是:

$roomarray = mysql_query("SELECT *
来自
(
选择 *,
案例
当类型 = '课堂' 那么 1
当类型 = '计算机实验室' THEN 2
WHEN type = 'Lecture Hall' THEN 3
当 type = 'Auditorium' THEN 4
END AS ClassTypeValue
来自房间
) t
ORDER BY ClassTypeValue, maxppl, roomID");

echo "<select id = \"room\">";

while ($rooms = mysql_fetch_array($roomarray))
    { ?>
    <option value=<?php echo $rooms['roomID']; ?> id=<?php echo $rooms['roomID']; ?>><?php echo $rooms['type']; echo "&nbsp;"; echo $rooms['roomID']; echo "&nbsp;("; echo $rooms['maxppl']; echo ")"; ?></option>
    <?php
    }

echo "</select>";

是的,我知道这很乱。
我打算稍后更改它。

但现在的问题是:我可以根据输入的内容切换选项的删除吗?
是否可以通过循环制作的下拉菜单来做到这一点?因为我肯定不能继续执行 SQL 查询。或者这甚至是一种选择?因为如果可能的话,我仍然认为这很糟糕。

【问题讨论】:

  • 顺便说一句:.. 以数字开头的 id 或类名无效 - 请参阅 stackoverflow.com/questions/448981/…
  • 我已将答案更改为支持禁用(删除)和启用(附加)选项的插件。我希望它能回答你的问题。

标签: jquery select hide parent-child option


【解决方案1】:

这在 Jquery 中非常简单

//For Hide
$('#selection1 option[value=1]').hide();

//For Show
$('#selection1 option[value=1]').show();

【讨论】:

    【解决方案2】:

    我提供了一个可以很好地解决这个问题的 jQuery 插件。有了它,你可以这样做:

    $('#selection1').hideOption('1');
    $('#selection1').showOption('1');
    

    您可以根据需要隐藏和显示它们,它们将保持原来的顺序。它适用于所有浏览器。您可以在此示例中看到:jsFiddle - Toggle Dropdown Options

    您可以获取Toggle Dropdown Options plug-in。如果您不喜欢插件,只需将其中的 JavaScript 代码复制到您自己项目的 JavaScript 文件中即可。有关更多信息,请参阅插件上的Read the Docs 链接!

    【讨论】:

      【解决方案3】:

      hide() 不适用于 Chrome... 我一直在尝试一种变通方法并将其包装在一个名为“ExtraBox”的插件中。这个想法是临时存储选项,以便我们可以通过操作 DOM 来启用/禁用它们。我创建了插件以使其更易于使用。

      我已经在 jsFiddle 上发布了代码,所以你可以自己尝试一下:http://jsfiddle.net/KeesCBakker/HaFRC/。 [注意:jsFiddle 的第一个项目,我很喜欢!]

      HTML 示例:

      Select:
      <br/>
      <select id="TestKees">
          <option value="1" class="s1">First value</option>
          <option value="2" class="s2">Second value</option>
          <option value="3" class="s3">Third value</option>
      </select>
      <br/>
      Enable / Disable
      <br/>
      <input id="txt" type="text" value="s2" />
      <button id="btnEnable">Enable</button>
      

      我已将以下 jQuery 添加到我的 document.ready 函数中:

      $('#TestKees').extraBox({ attribute: 'class' });
      
      $('#btnEnable').click(function(){
          $('#TestKees').data('extraBox').enable(
              $('#txt').val()
          );
      });
      
      $('#btnDisable').click(function(){
          $('#TestKees').data('extraBox').disable(
              $('#txt').val()
          );  
      });
      

      插件如下所示:

      (function($) {
      
          // Create ExtraBox object
          function ExtraBox(el, options) {
      
              // Default options for the plugin (configurable)
              this.defaults = {
                  attribute: 'class'
              };
              // Combine default and options objects
              this.opts = $.extend({}, this.defaults, options);
      
              // Non-configurable variables
              this.$el = $(el);
              this.items = new Array();
          };
      
          // Separate functionality from object creation
          ExtraBox.prototype = {
      
              init: function() {
                  var _this = this;
                  $('option', this.$el).each(function(i, obj) {
                      var $el = $(obj);
                      $el.data('status', 'enabled');
                      _this.items.push({
                          attribute: $el.attr(_this.opts.attribute),
                          $el: $el
                      });
                  });
              },
              disable: function(key){
                  $.each(this.items, function(i, item){
                      if(item.attribute == key){
                           item.$el.remove();
                           item.$el.data('status', 'disabled'); 
                      } 
                  });
              },
              enable: function(key){
                  var _this = this;
                  $.each(this.items, function(i, item){
                      if(item.attribute == key){
      
                          var t = i + 1; 
                          while(true)
                          {
                              if(t < _this.items.length) {   
                                  if(_this.items[t].$el.data('status') == 'enabled')  {
                                      _this.items[t].$el.before(item.$el);
                                      item.$el.data('status', 'enabled');
                                      break;
                                  }
                                  else {
                                     t++;
                                  }   
                              }
                              else {                                                                               _this.$el.append(item.$el);
                                  item.$el.data('status', 'enabled');
                                  break;
                              }                   
                          }
                      } 
                  });     
              }
          };
      
          // The actual plugin - make sure to test
          // that the element actually exists.
          $.fn.extraBox = function(options) {
      
              if (this.length) {
                  this.each(function() {
                      var rev = new ExtraBox(this, options);
                      rev.init();
                      $(this).data('extraBox', rev);
                  });
              }
          };
      })(jQuery);
      

      【讨论】:

      • 这个想法是将其从活动 DOM 中删除并临时存储在 javascript 中以便以后添加。
      • 哈哈哈是真的 :-)... 我只显示路径 :P 哈哈哈... 问题是... 它会通向哪里 :P
      • 新答案支持禁用/启用并保持列表的顺序。
      • 哇...这只是...哇。这是一个很棒的代码。效果很好。我仍在阅读它,但到目前为止,它很棒。我想我可以修改它以满足我的需要。
      【解决方案4】:

      我想,你的选择器是错误的。尝试这样的事情(更新):

      <html>
          <head>
              <title>MooExample</title>
              <script type="text/javascript" src="jquery.js"></script>
              <script type="text/javascript">
                  $(document).ready(function() {
                      $("#click").click(function() {
                          $("#selection1 #1").remove();
                          //$("#selection1 > #1").toggle(); // Hide OR show
                      });
                  });
              </script>
          </head>
      
          <body>
              <select id="selection1">
                  <option value="1" id="1">Number 1</option>
                  <option value="2" id="2">Number 2</option>
                  <option value="3" id="3">Number 3</option>
              </select>
              <input type="button" id="click" onclick="moo()" value="click" />
          </body>
      </html>
      

      parent-child selector(父>子)。

      【讨论】:

      • 啊,亲子现在好像很简单。谢谢。但我还是藏不住。
      • 没有。与 jAndy 的答案相同,hide() 不适用于我的&lt;option&gt;。对你有用吗?
      • 我创建了一个空白的 .html 文件并将我的代码粘贴到那里 - 完美运行。也许你正在使用一些奇怪的 jq 版本?还是你其他的js代码错了?
      • 我使用 IE、Firefox 和 Opera 对此进行了测试。它似乎只适用于FF。但即使隐藏,它的作用也与style = "display:none" 一样。你看不到它,但你可以随时选择它。
      • 我已经更新了代码。 remove() 适用于 chrome,ie 和 ff。
      【解决方案5】:

      据我所知,这是不可能的 本地人。你可以disable一个 &lt;option&gt; 节点寿。要完全 隐藏/删除它你需要写 一些自定义代码。

      $('option').attr('disable', true);
      

      顺便说一句,你不应该使用单个 number 作为元素的 ID。采用 某种前缀,即option_1

      实际上可以隐藏&lt;option&gt; 节点,但不兼容跨浏览器。

      【讨论】:

      • 所以,对于$("option")。这是更改为 ID 标签还是...?
      • @SyedAbdulRahman:$('option') 将抓取所有 option 元素。这只是作为示例。您仍然需要查询特定元素。
      • 所以我可以有一个function() 和一个if() 语句来选择特定元素,然后是一个$(this)。从那里我可以使用 `attr('disable', true);?
      • @SyedAbdulRahman:我更新了答案,您可以按预期使用.hide()
      • @jAndy 是的,有一个错字。它行不通。问题是它是一个 HTML 硬代码。即使隐藏,该选项也会出现。
      【解决方案6】:

      如果你只想删除元素,为什么还要搞乱显示设置?

      $('#1').remove();
      

      它不见了。

      【讨论】:

      • 是的,从底部的帖子中得到。现在我有一个新问题。看看更新的帖子。 ;)
      猜你喜欢
      • 2020-03-09
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多