2013-04-10 67 views
1

我有一个代码元素:选择下选择

<tr> 
    <td> 
    <select class="select_big" name="additional_field" id="<?=$field['id'];?>" required> 
     <option value="0">Выберите значение</option> 
     ... 
    </td> 
</tr> 
<tr> 
    <td> 
    <select class="select_big" name="additional_field" id="<?=$field['id'];?>" required> 
     <option value="0">Выберите значение</option> 
     ... 
    </td> 
</tr> 
<tr> 
    <td> 
    <select class="select_big" name="additional_field" id="<?=$field['id'];?>" required> 
     <option value="0">Выберите значение</option> 
     ... 
    </td> 
</tr> 
<tr> 
    <td> 
    <select class="select_big" name="additional_field" id="<?=$field['id'];?>" required> 
     <option value="0">Выберите значение</option> 
     ... 
    </td> 
</tr> 

当我选择第二个“中选择”元素,我需要禁用所有的下一个。 如果我选择1需要禁用3和4,如果我选择2我需要仅禁用4. 元素的计数可能不同。

如何获得下一个选择的所有元素?

下一个我尝试:

<script type="text/javascript"> 
    $("[name=additional_field]").change(function(e) { 
    field_data = '#' this.id.replace(/[* .]/g, "\\$&"); 
     $(field_data).parent().parent().nextAll().each(function(i) { 
     console.log($(this)('[name=additional_field]')); 
     }); 
    }); 
</script> 

但是我收到一个错误: 遗漏的类型错误:对象不是一个函数

请帮助我。

+0

犯的错误,如果我改变我1需要阻止3和4 – user2264941 2013-04-10 09:16:30

+0

你更新的要求可以通过@好办dfsq的解决方案(只需稍作调整即可将索引添加到索引中)。 – nnnnnn 2013-04-10 09:40:25

回答

0

This should do it

$("[name=additional_field]").change(function(e) { 

    var f = $(this).closest('tr')    //find the closest parent tr 
       .nextAll('tr')    //find all tr that follows 
       .find('select.select_big') //from them, get all select 

    //f should be all the selects the follow what changed 

}); 
+0

现在它与类名相关,而不是名称? 而且你已经完成了几何级数。 – user2264941 2013-04-10 09:06:25

+0

@ user2264941选择器是可选的,您可以*修改它们。几何进展?我只是挑选了接下来的所有内容。 – Joseph 2013-04-10 09:10:56

+0

几何级数? – nnnnnn 2013-04-10 09:11:10

1

我认为你可以做到这一点简单而不混淆父节点的遍历:

var $sel = $('.select_big').change(function() { 
    $sel.filter(':gt(' + $sel.index(this) + ')').prop('disabled', +$(this).val()); 
}); 

演示:http://jsfiddle.net/VFcF9/

还将重新启用selectboxes如果选择默认选项返回。

+1

+1。尼斯。我喜欢你提供的代码重新启用选择元素,如果值改变了,虽然你可能想尝试这个序列:(1)在第二个下拉列表中选择非零项; (2)在第一个下拉列表中选择非零项; (3)在第一个下拉列表中选择零项。 (当它不应该时,这将重新启用第三个下拉列表。) – nnnnnn 2013-04-10 09:14:28

+0

@nnnnnn好的,明白了。有趣的bug,谢谢!将尝试修复它。 – dfsq 2013-04-10 09:17:39

+0

@nnnnnn报告的问题修复http://jsfiddle.net/VFcF9/2/ – dfsq 2013-04-10 09:30:39

1

你得到的错误是因为该行的:

$(this)('[name=additional_field]') 

第一部分,$(this),返回一个jQuery对象,而该对象不是一个函数,所以你不能用更多的括号遵循它。

至于你要求禁用以下所有选择的元素,也许是:

$("[name=additional_field]").change(function(e) { 
    $(this).closest("tr").nextAll("tr").find("[name=additional_field]").prop("disabled", true); 
}); 
+0

这个块只有下一个元素 – user2264941 2013-04-10 09:22:06

+1

真的吗?它[适用于我](http://jsfiddle.net/K8ZNF/),尽管我会建议你在发布@dfsq时使用一些变化,而不是这样。 (我会删除我的答案作为约瑟夫的复制品,除了我是唯一一个解释你得到的错误的人。) – nnnnnn 2013-04-10 09:26:42

+0

是的,我同意用'+ 1'来解释错误背后的原因。 – andyb 2013-04-10 09:37:34