我试图使用多个选择选项在jquery中使用数组检查复选框 如果,让我们说单击选项1和选项3,将检查在数组中设置id的复选框,如果取消选中,则复选框。
<select id="lab_abbr" multiple >
<option value="o1">Option 1</option>
<option value="o2">Option 2</option>
<option value="o3">Option 3</option>
</select>
和复选框
<input type="checkbox" name="lab[one]" id="lab_one" />
<input type="checkbox" name="lab[two]" id="lab_two" />
<input type="checkbox" name="lab[three]" id="lab_three" />
<input type="checkbox" name="lab[four]" id="lab_four" />
<input type="checkbox" name="lab[five]" id="lab_five" />
<input type="checkbox" name="lab[six]" id="lab_six" />
和最后一个jquery
$(document).ready(function() {
$("#lab_abbr").live("change", function(e) {
var o1 = ['lab_one', 'lab_three'];
var o2 = ['lab_two', 'lab_six'];
var o3 = ['lab_four, 'lab_five'];
});
});
此致 Besmir
答案 0 :(得分:6)
var mapping = { 'o1' : ['lab_one', 'lab_three'], 'o2' : ['lab_two', 'lab_six'],
'o3' : ['lab_four', 'lab_five'] };
$("#lab_abbr").on("change", function () {
$.each( this.options, function () {
$( "#" + mapping[ this.value ].join(", #") ).prop("checked", this.selected);
});
});
演示:http://jsbin.com/onapem/edit#javascript,html
让我们现在分解它,看看每个部分的作用。
我们首先创建一个将作为一种关联数组的对象。从本质上讲,我们将一个值与另一个值相关联。在这种情况下,我们希望将所选选项的值(“o1”或“o2”)与一系列复选框相关联:
var mapping = { 'o1' : ['lab_one', 'lab_three'] };
接下来,我们使用change
方法将逻辑绑定到select
菜单的$.on
事件:
$("#lab_abbr").on("change", function(){
/* React to the change */
});
无论何时此菜单进行更改,我们都希望绕过其选项。我们还不担心选项是否被选中 - 我们只想访问它们中的每一个。我们使用$.each
迭代器方法:
$.each( this.options, function(){
/* Do something with each individual <option /> */
});
在此块中,我们希望收集与此选项值关联的复选框ID。例如,如果我们想要所有与“o1”相关联的值(这将代表我们$.each
的第一个选项),我们可以这样做:
alert( mapping['o1'] ); // ['lab_one', 'lab_three']
我们不会动态地这样做。在我们的$.each
中,关键字this
始终引用正在处理的当前<option />
。我们可以使用它的值来查找与之相关的任何字段:
mapping[ this.value ]; // returns an array
我们希望将其转换为CSS选择器以传递jQuery,因此我们在返回的数组上使用.join()
方法来创建字符串:
mapping[ this.value ].join(", #");
.join()
方法接受在每个值之间添加的字符串。在上面的例子中,我们的第一次迭代将返回以下字符串:
"lab_one, #lab_three"
注意, #
分离数组中的两个值。我们在此字符串的前面需要另一个#
,以便也可以选择#lab_one
。这是通过将字符连接到结果字符串来解决的:
$( "#" + mapping[ this.value ].join(", #") )
最后,我们调用$.prop()
方法,该方法允许我们在元素上设置属性值。我们将设置checked
属性。
使用$.prop()
方法,您传入要设置的属性以及要将其设置为的值。
$( /*...*/ ).prop("checked", this.selected );
请注意,this
表示我们在<option />
的此次迭代中当前正在访问的$.each()
。 <option />
有一个名为selected
的原生属性,它返回true
或false
- 表示是否选中了它。我们使用它来告诉jQuery "checked"
的值应该是什么。
因此,如果正在处理的选项是selected
,那么与其关联的每个复选框也是如此。同样,如果未选择正在处理的选项,则与其关联的复选框也不会。
如果你想缩短这一点,可以将jQuery选择器直接存储在对象中:
var mapping = { 'o1' : '#lab_one, #lab_three', 'o2' : '#lab_two, #lab_six',
'o3' : '#lab_four, #lab_five' };
$("#lab_abbr").on("change", function () {
$.each( this.options, function () {
$( mapping[ this.value ] ).prop( "checked", this.selected );
});
});
答案 1 :(得分:0)
您需要将var
定义为对象,然后简单地迭代选择并选中复选框。见下文,
$(document).ready(function() {
var selections = {
o1: ['lab_one', 'lab_three'],
o2: ['lab_two', 'lab_six'],
o3: ['lab_four', 'lab_five']
};
var $checkbox = $(':checkbox');
$("#lab_abbr").on("change", function(e) {
$.each ($checkbox, function (i, ck) { //uncheck all checkbox
this.checked = false;
});
$.each($(this).val(), function (idx, val) { //iterate over selected options
$.each (selections[val], function (i, v) { //iterate over the selections
$('#' + v).prop('checked', true); //set the checkbox
});
});
});
});