我有select
與一些optgroup
s。在optgroup中多選 - 事件的目標是optgroup
<select multiple style="height: 500px; width: 300px">
<optgroup label="Colours">
<option value="G">Green</option>
<option value="B">Blue</option>
<option value="Y">Yellow</option>
<option value="W">White</option>
<option value="P">Pink</option>
</optgroup>
<optgroup label="Numbers">
<option value="1">One</option>
<option value="2">Two</option>
<option value="3">Three</option>
<option value="4">Four</option>
<option value="5">Five</option>
</optgroup>
</select>
我希望能夠點擊optgroup
和選擇所有的孩子options
。我發現點擊個人option
時,事件仍然被解僱,所以通過測試e.target
我可以確定目標是optgroup
,然後只選擇孩子。
$(document).on("click", "optgroup", function(e) {
var target = $(e.target);
console.log(target);
if (target.is("optgroup")) {
target.find("option").prop("selected", true);
}
});
小提琴這裏:https://jsfiddle.net/0z61fzs4/
到目前爲止,一切都很好。
然而,嘗試並通過點擊並拖動多選 - 在小提琴下方,只需從「One」拖動到「Three」即可。在這種情況下,事件目標最終是optgroup
本身,而不是option
,因此通過以這種方式選擇幾個選項,您最終將選擇optgroup中的所有內容。
此行爲僅在單擊並拖動類型選擇時發生。它不會發生在Ctrl並單擊多個選擇。
此外,如果您「跨越邊界」,則不會發生這種情況。例如,在附帶的小提琴中,如果您從「白色」開始,然後單擊並將其向下拖動到「三」,則您將從兩個不同的組中進行多重選擇。在這種情況下,目標結束爲option
,並且行爲按預期工作。
我該如何允許我想要的點擊拖動類型的行爲,在一個optgroup
內選擇多個options
而沒有JS觸發並全部選中它們?
@Abhitalks這個答案對我來說真是棒極不'stopPropagation()'。爲什麼我需要使用它? – bgs264
@ bgs264:沒關係。我的主要觀點是確保歐普寫出一個完整的答案,而不是一個可能被刪除的單線程。 – Abhitalks
@Abhitalks是歡呼隊友,我不經常在StackOverflow上做出迴應。 – aozd4v