2012-02-02 76 views
1

我有4个选择框,每个都包含完全相同的数据:jQuery的删除选项除了当前

  • 钓鱼
  • 吸烟

如果我在选择框[0]中选择“骑马”,我想从除了当前选择框以外的每个剩余选项中删除选项。

我试过select:not(:first-child),但是这会删除,只有当第一个孩子是选择,而不是任何其他。

基本上,我需要从所有下拉列表中删除选定的选项,除了我所做的选择。

+0

工作演示你需要将它们添加回如果选项更改? – 2012-02-02 12:16:00

+0

可能重复的[防止多重选择相同的值](http://stackoverflow.com/questions/4001805/prevent-multiple-selections-of-same-value) – 2012-02-02 12:16:31

+0

Andy E,很可能是的。但是我确信我可以将步骤重新添加到项目中,将存储在某个位置的值(如隐藏字段或其他东西)删除,然后将其添加回来并替换新删除项目的值。 – JadedEric 2012-02-02 12:30:46

回答

5

试试这个:

$('#select1').on('change', function() { 
    var val = this.value; 
    $('select').not(this).children().filter(function() { 
     return this.value === val; 
    }).remove(); 
}); 

即每一个<select>not this,获得其children,但filter的,其.value是不是像我一样的人,和他们remove

在​​

工作演示如果您需要的时候第一项改为别的东西来重新添加元素,你可能会考虑只克隆整个第一select同时过滤掉不需要的项目。

在这种情况下,过滤器将需要!==,因为我们希望所有的元素,除了相匹配的一个,即

$('#select1').on('change', function() { 
    var val = this.value; 
    $('select').not(this).empty().append($(this).children().filter(function() { 
     return this.value !== val; 
    }).clone()); 
}); 

http://jsfiddle.net/alnitak/ARUmX/

+0

我想你会让这个过于复杂。指定'.children('option')'可以简单地为'.children('[value ='+ val +']')'。不需要在'.children()'中指定'option'作为标签,并且使用属性equals选择器可以避免使用'filter'。 – maxedison 2012-02-02 12:23:29

+0

@maxedison作为原则问题我不在选择器中使用字符串连接,这是不安全的。 – Alnitak 2012-02-02 12:27:38

+1

@Alnitak你会介意为什么字符串连接在这个庄园不安全的例子吗? – Craig 2012-02-02 12:43:16

0

还有.not()方法和选择器。

http://api.jquery.com/not/

从文档:

。不(函数(指数))

函数(指数)用作用于组中的每个元件的测试的功能。 这是当前的DOM元素。