2012-07-12 84 views
0

我有幾個選擇列表,它們都有相同的內容。我想要的是當一個選項被選中時,其他選項將被禁用。使用這種選擇.not(這個)不起作用

<div class="social-option"> 
    <select> 
     <option selected="selected" value="facebook">facebook</option> 
     <option value="0"></option> 
     <option value="twitter">twitter</option><!-- If I select this --> 
     <option value="linkedin">linkedin</option> 
     <option value="instagram">instagram</option> 
     <option value="flickr">flickr</option> 
    </select> 
</div> 
<div class="social-option"> 
    <select> 
     <option selected="selected" value="facebook">facebook</option> 
     <option value="0"></option> 
     <option value="twitter">twitter</option><!-- then this is disabled --> 
     <option value="linkedin">linkedin</option> 
     <option value="instagram">instagram</option> 
     <option value="flickr">flickr</option> 
    </select> 
</div> 
<div class="social-option"> 
    <select> 
     <option selected="selected" value="facebook">facebook</option> 
     <option value="0"></option> 
     <option value="twitter">twitter</option><!-- and this also is disabled --> 
     <option value="linkedin">linkedin</option> 
     <option value="instagram">instagram</option> 
     <option value="flickr">flickr</option> 
    </select> 
</div>​ 

$('.social-option select').on('change', function() { 

    var newSelected = $('option:selected', this).val(); 
    var newSelectedSiblings = $('.social-option select').find("option[value=" + newSelected + "]"); 

    newSelectedSiblings.not(this).each(function() { //here is the .not selector that doesn't work 
     $(this).attr('disabled', 'disabled'); 
    }); 
}); 

任何想法,爲什麼?


另外,爲什麼doen't這一行工作時,我與this替代選擇:

var newSelectedSiblings = $('.social-option select').find("option[value=" + newSelected + "]"); 

這樣的:

var newSelectedSiblings = $(this).find("option[value=" + newSelected + "]"); 

因爲change選擇是一樣的:$('.social-option select').on('change'...

http://jsfiddle.net/ilyaD/4BBcZ/5/


更新

我已經找到了解決方案的第一個問題: 代替

我用:

newSelectedSiblings.not('option:selected', this) 

回答

2

我會使用siblings()功能。它做什麼,你認爲它的作用:

$(this).siblings().each(function() { 
    $(this).attr('disabled', 'disabled'); 
}); 

not()功能不起作用,因爲jQuery是奇怪的,當涉及到比較:

$(this) == $(this) // Returns false 
2

你的錯誤是混淆了select標籤和標籤option

newSelectedSiblings找到一個選項標籤,但回調中的this是選擇標籤。

因此not什麼都不做。

我會嘗試修復你的代碼,因爲它看起來太複雜了,但我無法弄清楚你正在嘗試做什麼。

如果您禁用所有其他選擇,除了選定的選擇之外,那麼有人會如何選擇它們?

請說明您的意思是「所有兄弟元素,但點擊一個在這裏」 - 選擇標籤沒有「點擊」屬性 - 所以你是什麼意思?

或者您是否嘗試選擇除選定標籤之外的所有選項標籤?做什麼的?

$('.social-option select').on('change', function() { 
    $('.social-option select').not(this).find('option[name="' + $(this).val() + '"]').attr('disabled', 'disabled'); //make sure none of the options have a " in the value 
} 

注意:如果更改選擇,則沒有提及取消禁用選項。這樣做可能會很複雜,因爲你沒有記錄它是什麼。

+0

Thanx,我試圖在其他列表中禁用選中的選項,如果我在其中選擇'臉譜',我將無法在其他人中選擇它(添加一個jsfiddle) – ilyo 2012-07-12 08:50:48

+0

此外,它爲什麼是用$(this)'替換'change function'中的'$('。social-option select')'不起作用?從你說的這是假設.. – ilyo 2012-07-12 08:53:06

+1

@IlyaD我編輯我的答案與代碼。 – Ariel 2012-07-12 08:56:35