2012-07-12 80 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