【发布时间】:2012-10-24 10:15:15
【问题描述】:
我有一个带有options 分组的select 元素。单击option 时,我需要选择(或取消选择)optgroup 中的所有options。我还需要能够同时选择多个optgroups。
我希望它的工作方式是这样的:
- 如果未选择任何内容,我想单击一个选项并选择同一 optgroup 中的所有选项。
- 如果已经选择了一个或多个 optgroup,我想单击另一个 optgroup 中的一个选项,然后选择所有这些选项。
- 如果已经选择了一个或多个 optgroup,我希望能够按住 Ctrl 键单击未选择的 optgroup 中的一个选项,并选择该 optgroup 中的所有选项。
- 如果已经选择了一个或多个 optgroup,我希望能够按住 Ctrl 键单击所选 optgroup 中的一个选项,并取消选择该组中的所有选项。
查看 Stack Overflow 上的其他答案,我创建了以下内容:
HTML:
<select multiple="multiple" size="10">
<optgroup label="Queen">
<option value="Mercury">Freddie</option>
<option value="May">Brian</option>
<option value="Taylor">Roger</option>
<option value="Deacon">John</option>
</optgroup>
<optgroup label="Pink Floyd">
<option value="Waters">Roger</option>
<option value="Gilmour">David</option>
<option value="Mason">Nick</option>
<option value="Wright">Richard</option>
</optgroup>
</select>
jQuery:
$('select').click(selectSiblings);
function selectSiblings(ev) {
var clickedOption = $(ev.target);
var siblings = clickedOption.siblings();
if (clickedOption.is(":selected")) {
siblings.attr("selected", "selected");
} else {
siblings.removeAttr("selected");
}
}
我在这里做了一个例子:http://jsfiddle.net/mflodin/Ndkct/ (遗憾的是 jsFiddle 似乎不再支持 IE8。)
这在 Firefox (16.0) 中按预期工作,但在 IE8 中根本不起作用。从其他答案中我发现IE8无法处理optgroup或option上的click事件,这就是我将它绑定到select然后使用$(ev.target)的原因。但在 IE8 中,$(ev.target) 仍然指向整个select,而不是指向被点击的option。如何找出点击了哪个option(或包含optgroup)以及它是被选中还是被取消选中?
另一个意外的行为,但相比之下较小,是在 Chrome (20.0) 中,直到鼠标离开 select 才会发生取消选择。有人知道解决方法吗?
【问题讨论】:
标签: javascript jquery html