グループ化された sを持つselect
要素がありoption
ます。がクリックoption
されたoptgroup
ときに、すべての を選択 (または選択解除) する必要があります。option
また、一度に複数の を選択できるようにする必要もありますoptgroup
。
私がそれを機能させたい方法は次のとおりです。
- 何も選択されていない場合は、1 つのオプションをクリックして、同じ optgroup 内のすべてのオプションを選択したいと考えています。
- 1 つ以上の optgroup が既に選択されている場合、別の optgroup の 1 つのオプションをクリックして、代わりにそれらすべてのオプションを選択したいと考えています。
- 1 つ以上の optgroup が既に選択されている場合、選択されていない optgroup のオプションを Ctrl キーを押しながらクリックして、その optgroup のすべてのオプションも選択できるようにしたいと考えています。
- 1 つ以上の optgroup が既に選択されている場合、選択した optgroup 内のオプションを Ctrl キーを押しながらクリックして、そのグループ内のすべてのオプションを選択解除できるようにしたいと考えています。
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 はまたはのclick
イベントを処理できないことがわかりました。これが、イベントを にバインドしてから を使用する理由です。しかし、IE8 では、まだクリックされた ではなく、全体を指しています。どの(または を含む) がクリックされ、選択または選択解除されたかを確認するにはどうすればよいですか?optgroup
option
select
$(ev.target)
$(ev.target)
select
option
option
optgroup
もう 1 つの予想外の動作ですが、比較するとマイナーですが、Chrome (20.0) では、マウスがselect
. 誰かがこれに対する回避策を知っていますか? </p>