2011-12-04 34 views
16

我試圖在下拉框中使用.hide()隱藏一些選項。這在Firefox和Chrome中運行得非常好,但在IE和Safari中不起作用。我原來的代碼更復雜,但我已經縮小到這個範圍。JQuery隱藏選項不適用於IE和Safari

我試過幾種組合,沒有任何工作。

.hide()起作用,但出於某種原因,不適用於選項標籤中的內容。

有人可以幫我嗎?這讓我瘋狂。非常感謝您花時間幫忙!

這裏是我的JScript:

<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script> 
    <script type="text/javascript"> 
     $(document).ready(function(){ 
      $(".wrapper1").hide(); 
     }); 
    </script> 

這裏的HTML:

   <label for="prodName">Product Name:</label> 
       <input type="text" name="prodName" /><br /> 

       <label for="candy">Candy:</label> 
       <select name="candy" id="candy"> 
         <option value="0" class="blank" selected="selected"></option><!-- PHP and JS validators should not allow "0" here. User should be prompted to select something. --> 
         <option value="1" class="wrapper1">Hide this 1</option> 
         <option value="2" class="wrapper1">Hide this 2</option> 
         <option value="3" class="wrapper2">Show this 1</option>  
       </select><br /> 

回答

8

你說得對。有些瀏覽器不會讓你隱藏option元素。您可能需要刪除它們。

儘管也許更好的(或至少是替代的)可能性是禁用它們。

$(".wrapper1").prop('disbled', true); 
+1

禁用也在ie6中工作不好,而且不確定ie7 - 強大的方法是刪除選項,例如創建一個隱藏的選擇並在這裏放置隱藏選項 – vittore

+0

@vittore:啊,沒有意識到IE6問題。那麼是的,拆除將是一條路。 – RightSaidFred

+0

感謝Fred,Vittore和Jim。你們很棒!我一直試圖弄清楚整個週末。 –

5

您必須刪除option元素。與display:none隱藏他們是不是在多種瀏覽器支持。

隱藏

var elems = $(".wrapper1").remove(); 

SHOW

$('#candy').append(elems); 
+0

要將選項放回原來的位置,您需要在(elems);'之後執行'$('#canty>選項:nth-​​child(1)')。 – RightSaidFred

10

這將工作..改變.show到.showOption和.hideOption。 然而,這仍然是一種在IE中糟糕的,因爲在Firefox中,你可以隱藏一個被選中的選項。所以如果「選擇一個」被顯示並被隱藏。 Firefox仍然會說「選擇一個」。

$.fn.showOption = function() { 
this.each(function() { 
    if(this.tagName == "OPTION") { 
     var opt = this; 
     if($(this).parent().get(0).tagName == "SPAN") { 
      var span = $(this).parent().get(0); 
      $(span).replaceWith(opt); 
      $(span).remove(); 
     } 
     opt.disabled = false; 
     $(opt).show(); 
    } 
}); 
return this; 
} 
$.fn.hideOption = function() { 
this.each(function() { 
    if(this.tagName == "OPTION") { 
     var opt = this; 
     if($(this).parent().get(0).tagName == "SPAN") { 
      var span = $(this).parent().get(0); 
      $(span).hide(); 
     } else { 
      $(opt).wrap("span").hide(); 
     } 
     opt.disabled = true; 
    } 
}); 
return this; 
} 
+0

據我所知,這是一個很好的答案 - 它可以工作,並且可以輕鬆更新需要修復的代碼!謝謝。 –

+0

http://jsfiddle.net/4bvw91pm/ –

4

我想,大約使用選項<span>的解決方案,但發現它並沒有在所有瀏覽器爲我工作。

我做了一個jQuery插件,很好地解決了這個問題。有了它,你可以這樣做:

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

您可以隱藏和顯示你希望他們儘可能多的,他們將保持其原有的秩序,你已經分配給option任何.data('x')值。它適用於所有瀏覽器。你可以看到在這個例子中:jsFiddle - Toggle Dropdown Options

你可以得到Toggle Dropdown Options plug-in。如果您不喜歡插件,只需將其中的JavaScript代碼複製到您自己的項目的JavaScript文件中即可。請參閱插件上的Read the Docs鏈接以獲取更多信息!

+0

我該如何將選擇返回到原始狀態?基本上尋找這樣的東西: '$('#select')。resetOptions();' – Casey

+0

您可以在其他$ .fn函數之後添加代碼:'$ .fn.showOptions = function(){ 返回this.filter('option')。each(function(){var 0 1 = 0(this); opt.showOption(); }); };' –

+0

它看起來像showOption()需要一個值才能正常工作,或者我錯過了什麼? – Casey

0

我嘗試了很多不同的方式,但這個解決方案看起來很合理,我已經在我的代碼中使用了。無需插件簡單的寄存器功能與jQuery對象在一目瞭然

解決方案:

(function ($) { 


$('#showOne').click(function() { 
    $('#ddlNumbers').showHideDropdownOptions('3', true); 
}); 

$('#hideOne').click(function() { 
    $('#ddlNumbers').showHideDropdownOptions('3', false); 
}); 

$.fn.showHideDropdownOptions = function(value, canShowOption) { 

     $(this).find('option[value="' + value + '"]').map(function() { 
      return $(this).parent('span').length === 0 ? this : null; 
     }).wrap('<span>').hide(); 

     if (canShowOption) 
      $(this).find('option[value="' + value + '"]').unwrap().show(); 
     else 
      $(this).find('option[value="' + value + '"]').hide(); 

} 



})(jQuery); 

下面是完整的實現http://jsfiddle.net/8uxD7/3/

1

我找到一個辦法解決這個,只是使用jQuery包裹包裹())來選項要隱藏,它會自動隱藏並用unwrap()展開展開以再次顯示它。

相關問題