[英]Javascript click event triggers twice
在以下代碼段中,為什么divClicked()
在單擊<label>
時觸發兩次,而在單擊<input>
時僅觸發一次?
function divClicked(_index) { console.log("div click event"); } function inputClicked(_index) { console.log("input click event"); }
<div class="option" onclick="divClicked(1)"> <input id="1_1" name="group_1" type="radio" value="1" onclick="inputClicked(1)" /> <label for="1_1">label</label> </div>
注意:我想知道為什么會發生這種情況,而不是“快速修復”,例如:將 onclick() 放在 label 上。
這是因為 HTML 規范在4.10.4 中的描述:
例如,在單擊復選框標簽檢查復選框的平台上,單擊以下代碼段中的
label
可能會觸發用戶代理在input
元素上運行合成點擊激活步驟,就好像元素本身已被用戶觸發一樣:<label><input type=checkbox name=lost> Lost</label>
在其他平台上,行為可能只是為了集中控制,或者什么都不做。
這意味着當點擊<label>
,瀏覽器會在關聯的<input>
元素上創建第二個“合成”點擊事件,以切換其狀態。
divClicked
被觸發兩次的原因是因為來自<label>
的第一個事件冒泡到<div>
,第二個合成點擊事件冒泡到<div>
。
這通常是click
事件bubbling
原理的原因:
當一個事件發生在一個元素上時,它會在它、它的關聯元素、它的父元素和其他祖先元素上運行。
現在,關系是當您單擊label
,有兩個事件會在此處冒泡:
1)點擊div(你期望的)
2)點擊輸入(這也是預期的)
2.1) 當點擊
input
被觸發時,這里也會再次觸發對div
點擊
您可以使用event.bubbles
道具確認此行為。
編輯:
label
和input
之間連接的原因:(我知道這絕對不是必需的,因為它無處不在)
<label>
可以通過將控件element inside the <label>
元素內or by using the for
屬性與控件相關聯。 這樣的控件稱為標簽元素的標記控件。 一個輸入可以與多個標簽相關聯。
摘自:https ://developer.mozilla.org/en-US/docs/Web/HTML/Element/label
這意味着在標簽上放置for
引用輸入元素的id
將刺激行為,就好像元素在label
。 這會將input
上的事件bubble
到label
就像child
到parent
任何事件一樣
在某些時候,還要檢查 javascript 文件資產是否沒有加載兩次......它不應該發生,但你永遠不知道。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.