2010-01-09 66 views
49

目前我正在使用jQuery來隱藏/顯示使用以下代碼的選擇選項。使用jQuery在IE中隱藏選擇選項

$("#custcol7 option[value=" + sizeValue + "]").hide(); 

這在Firefox中正常工作,但在其他瀏覽器中不起作用。如何在Chrome,Opera和IE中隱藏選項?

+0

這個好演練解決了這個問題: http://fiddle.jshell.net/2tAqe/ – 2012-07-24 01:21:48

+1

@Flo:這 「工程」 通過創建一個無效的DOM結構並希望瀏覽器正確處理它。壞。理念。 – 2015-09-20 15:07:22

+0

上面的OP代碼現在在Chrome 62和Edge 41中工作正常。在IE 11中,它設置「style = display:none;」在選項上,但實際上並沒有隱藏它。 – 2017-11-22 15:42:40

回答

10

你不這樣做,它不支持在IE瀏覽器(並且可能不會在Chrome或Opera中)。如果你希望它們真的看不見,你將不得不完全刪除選項並在以後添加它們。但是在大多數情況下,簡單的disabled="disabled"就足夠了,比處理刪除和添加選項簡單得多。

+0

IIRC,您不能禁用IE6或IE7中的選項(已在IE8中修復)http://webbugtrack.blogspot.com/2007/11/bug-293-cant-disable-options-in-ie.html – scunliffe 2010-01-09 00:41:07

+28

Duuummbbb !我非常喜歡IE。他們不能得到任何正確的東西!沒有明顯的原因,文字和密碼框的缺失甚至沒有相同的寬度!?圓角不起作用?沒有什麼排隊正確...我不明白! – mpen 2010-04-22 07:42:46

+1

@Mark:對於嚴肅......他們爲什麼還要打擾? – Andy 2011-10-10 19:31:29

3

只需將其刪除並將其存儲在JavaScript中的var中即可。您可以在稍後需要時創建新對象。

否則請嘗試上面提到的disabled屬性。

+0

禁用IE 7不支持 – 2015-07-15 09:39:18

+0

IE 7已經10歲了......我們應該支持它嗎? – 2015-07-29 20:00:10

+2

技術上沒有。但業務需求是! – 2015-08-03 09:32:27

9

嘗試detach()。

s_parent.change(function(){ 
    s_child.load('./fetch_options.php",{'v',s_parent.val()}); 
} 

的「fetch_options.php」腳本會簡單地打印出基於期權標籤: 您可以使用,如果追加()或insertAfter()

+0

有趣...不知道這個功能:-) – 2010-11-03 20:35:10

+0

這個問題是,如果你想隱藏在菜單中間的特定選項,它是太多的工作,試圖將它們插回到它們的原始地方。 – BadHorsie 2012-09-13 16:32:29

1

另外還有的.load方法需要稍後再連接無論你使用的數據源和父值傳入

+0

我發現這種AJAX技術確實工作得很好,並解決了所有瀏覽器不一致問題(以另一次調用服務器爲代價)。 – RET 2011-07-08 03:41:11

43

我剛剛遇到這個,而不是克隆整個選擇反覆我只是取代了需要隱藏的選項,需要隱藏span元素和隱藏跨度(儘管瀏覽器不會直觀地顯示它們,我認爲) - 喲你可能需要改變你的代碼(如果複雜的話)來遍歷複雜邏輯的跨度。

跨度存儲對option的引用,並在需要顯示它們時用它替換它們自己。

此代碼顯然可以重構和美化。

http://fiddle.jshell.net/FAkEK/12/show/

編輯#2(USE這個代替):它發生,我認爲不是做這一切克隆/參考/替換廢話,只是包裝選項,跨度,隱藏的跨度,和展出的只是再次選擇更換跨度..

http://fiddle.jshell.net/FAkEK/25/show/

+2

我可以證實這是解決方案!雖然不符合[HTML5](http://dev.w3.org/html5/spec/single-page.html#the-select-element),但它確實有效。 – nrodic 2012-11-29 02:38:03

+0

你真棒!對我來說就像是魅​​力!所以這意味着show()實際工作只有hide()在IE中不起作用。非常感謝! – 2014-01-07 10:35:58

25

我覺得MEDER提供了有效的答案,這是稍有改變,以反映什麼對我的作品:

$.fn.optVisible = function(show) { 
    if(show) { 
     this.filter("span > option").unwrap(); 
    } else { 
     this.filter(":not(span > option)").wrap("<span>").parent().hide(); 
    } 
    return this; 
} 

測試了(萬歲BrowserStack):

  • 的Windows XP:IE 6.0,火狐3.0,Safari瀏覽器4.0,歌劇10.0,鉻14.0
  • Windows 8中:IE 10.0地鐵
  • iOS 3.2(iPad),iOS 6.0(iPhone 5)
  • Android 1。6(索尼的Xperia X10)

jsfiddle

+4

使用此方法在選擇器上使用.val()時要小心,因爲它將返回隱藏值而不是選定的值。 [jsfiddle](http://jsfiddle.net/rjPeU/) – mhoofman 2013-03-03 21:10:41

+1

Simplified:http://fiddle.jshell.net/FAkEK/312/ – 2015-08-11 11:50:46

2
/** 
* Change visibility of select list option elements 
* @param {boolean} stateVal  show hidden options if true; hide it otherwise. If not setted then toggle visibility, based on it's current state 
*/ 
$.fn.toggleOptionVisibility = function (stateVal) { 
    var isBool = typeof stateVal === "boolean"; 
    return this.each(function() { 
     var $this = $(this); 
     if (isBool) { 
      if (stateVal) $this.filter("span > option").unwrap(); 
      else $this.filter(":not(span > option)").wrap("<span>").parent().hide(); 
     } 
     else { 
      $this.filter("span > option").toggleOptionVisibility(true); 
      $this.filter(":not(span > option)").toggleOptionVisibility(false); 
     } 
    }); 
}; 
+0

這只是基於@nrodic版本的更精確的插件。測試在這裏:http://fiddle.jshell.net/HRMrB/ – AuthorProxy 2012-12-11 08:08:05

+0

偉大的作品。謝謝! – Netricity 2014-07-15 15:17:52

+0

這是迄今爲止最好的解決方案,對我來說就像是一種魅力。 – 2014-11-13 20:46:52

2

你也應該在Chrome中工作,但nvm.Here是另一種方式

select = $('#custcol7'); 
select.find('option[value=["'+sizeValue +'"]').remove(); 

和方式,如果你想顯示它再次:

select.append('<option value="'+sizeValue+'"></option>'); 

它適用於每個瀏覽器和我完美很簡單的代碼。問題是,如果你想隱藏的幾個選項更打字..但可以通過將它們放入變量來解決,如果他們不喜歡動態的改變是:如果你必須刪除

var options = '<option value="'+sizeValue1+'"></option><option value="'+sizeValue2+'"></option><option value="'+sizeValue3+'"></option>'; 

select.append(options); 

這樣/附加在幾個地方你只能輸入選項一次。希望我給了另一個有趣的選擇。最好的祝福。

0

您可以使用此:

$("#custcol7 option[value=" + sizeValue + "]").css({display:'none'}); 

它適用於除了Safari和Opera的所有瀏覽器的罰款。我正在尋找另一個最佳解決方案:)

+0

這在IE中也不起作用。 – nnnnnn 2016-08-26 06:08:19

0

您需要將其刪除,然後再次將其添加到Internet Explorer中。

要刪除:

$("#custcol7 option[value=" + sizeValue + "]").remove(); 

補充:

$("#custcol7").append("<option value='sizeValue'>sizeValue</option>"); 

請注意,你需要有sizeValue也是在選項的文本,實際上看到的東西。

0

使用AuthorProxy提供的解決方案,它適用於IE,但是當我嘗試在Firefox中的下拉列表上做一個.val()時,我得到了一些沒有任何意義的時髦值。我已經修改了他們的選項,包括瀏覽器特定功能,隱藏/顯示Firefox的作​​品。

$.fn.toggleOptionVisibility = function (stateVal) { 
    var isBool = typeof stateVal === "boolean"; 
    return this.each(function() { 
     var $this = $(this); 
     if (navigator.userAgent.indexOf('MSIE') > -1 || navigator.userAgent.indexOf('Trident') > -1) { 
      if (isBool) { 
       if (stateVal) $this.filter("span > option").unwrap(); 
       else $this.filter(":not(span > option)").wrap("<span>").parent().hide(); 
      } 
      else { 
       $this.filter("span > option").toggleOptionVisibility(true); 
       $this.filter(":not(span > option)").toggleOptionVisibility(false); 
      } 
     } 
     else {    
      if (isBool) { 
       $this.show(); 
      } 
      else { 
       $this.hide(); 
      } 
     } 
    }); 
}; 
0

您也可以替換select中的html。

HTML:

<input id="Button1" type="button" value="hide option" /> 

<select id="foo"> 
<option >stuff</option> 
<option >stuff2</option> 
</select> 

的Jquery:

$("#Button1").change(function() { 
     $('#foo').html('<option >stuff</option>'); 
    }); 

不正是你想要的,但也許它幫助。對於更小的下拉菜單,它肯定更容易。

+0

這裏有一個工作jsfiddle爲此: - http://jsfiddle.net/bj5fqj11/ – Nitesh 2015-04-17 04:55:22

5

要刪除的選項使用:

var opt=$("option").detach(); 

要顯示選項使用:

opt.appendTo("select"); 
+0

這似乎是有效的HTML和一個簡單優雅的解決方案。 'opt'將是一個'option'元素的數組,可以使用appendTo將其添加回'select'元素。我希望這個答案可能會被提起或選擇爲最佳答案,因爲上面的其他解決方案只會讓我失望一段時間,而且要麼是有效的,要麼是直截了當的。謝謝薩欽。 – 2017-01-20 20:36:55

1

我採取的是其他的答案有點不同。

目標不是隱藏選項,而是讓它們禁用(以保持UI一致)。

我的場景:

我有一個形式的多個選擇,並且當用戶的在選擇的一個選擇的選項的選擇的其他應禁用該選項,反之亦然。用戶被限制選擇已經選擇的相同選項。我們通常禁用該選項,但對於不支持它的IE 7。用戶還可以選擇添加新的選擇。

解決方案:

負載:

如果瀏覽器IE7,然後在填充的選擇和禁用其他選擇已經選擇的選項我添加自定義屬性的選項(「data-ie7-disabled」 )並且還將禁用選項的顏色更改爲'#cccccc'(這是禁用選項的標準顏色)。這使得UI在各種瀏覽器中看起來相同。

在變化:

我保存在一個局部變量(這是保存在焦點)的一個選項。

當用戶試圖改變的選項

  1. 用戶選擇未在任何其他下拉選擇一個完整的新選項。然後我遍歷其他選擇並更改顏色,並將自定義屬性添加到其他選擇上的此選定選項。

  2. 當用戶選擇一個已經選擇的選項(灰色的選項)。我首先檢查該選項是否具有此自定義屬性。如果它有,那麼>我簡單地將選項恢復爲前一個,並顯示錯誤消息「此選項已被選中或BLAH BLAH」。

  3. 當用戶將其現有選項更改爲未在其他任何下拉列表中選中的全新選項時。我再次遍歷所有其他選擇選項,並刪除它的顏色和自定義屬性。

希望這會有所幫助。

1

您可以通過var $opt=$('select>option').clone()$('select option[value="'+val+'"').remove()的組合使用。還有另外一個例子:試試這個。 https://jsfiddle.net/sherali/jkw8fxzf/12/

var $secondOption= $('#second-choice>option').clone(); 

$("#first-choice").change(function() { 
    var userSelected = $(this).val(); 

    $('#second-choice').html($secondOption); 
    $('#second-choice option[value="'+userSelected+'"').remove() 
}); 
0

在IE 11(Edge)中,以下代碼正在工作。

$("#id option[value='1']").remove(); 

和廣告回來,

$('<option>').val('1').text('myText').appendTo('#id');