我做了這個測試代碼的問題:http://jsfiddle.net/5phqm/1/爲什麼jQuery的triggerHandler()不能防止內聯事件?
據我瞭解,如果jQuery的triggerHandler()
防止默認瀏覽器的行爲,那麼本地JavaScript事件將不會被觸發,處理方式(它在addEventListener()
是真實的我代碼),但通過標籤的屬性onclick=""
添加的內聯事件無論如何都會觸發!爲什麼會發生?我誤解了瀏覽器中觸發的事件嗎?
我做了這個測試代碼的問題:http://jsfiddle.net/5phqm/1/爲什麼jQuery的triggerHandler()不能防止內聯事件?
據我瞭解,如果jQuery的triggerHandler()
防止默認瀏覽器的行爲,那麼本地JavaScript事件將不會被觸發,處理方式(它在addEventListener()
是真實的我代碼),但通過標籤的屬性onclick=""
添加的內聯事件無論如何都會觸發!爲什麼會發生?我誤解了瀏覽器中觸發的事件嗎?
可以確認的是內嵌處理程序運行,因爲它是explicitly coded:
handle = ontype && cur[ ontype ];
if (handle && jQuery.acceptData(cur) && handle.apply(cur, data) === false) {
event.preventDefault();
}
其中ontype
在這種情況下"onclick"
。所以它正在獲取元素的onclick
屬性,然後執行它。總是調用這段代碼,不管.trigger
/.triggerHandler
。然而
本機動作,例如elem.click()
,僅執行inside an if
block:
if (!onlyHandlers && !event.isDefaultPrevented()) {
// ...
elem[ type ]();
onlyHandlers
哪裏是true
爲triggerHandle
和false
爲.trigger
,因此triggerHandler
不例如執行elem.click()
(而.trigger
確實)。因此,阻止了原生動作。
所以內聯處理程序和本機操作是分開的事情,也是分開處理的。 .triggerHandler
只阻止本機操作。
我認爲(但它是一個猜測,我給在jQuery的源代碼,簡單的介紹一下,這可能是完全錯誤的),那jQuery的調用類似
$(elem).data("events");
檢索附着在jQuery.trigger.event元素的事件
然後決定是否啓動/停止它們。內聯事件不能以這種方式收集,因此不能停止。
對於它的價值,我始終認爲這是遵循CSS規則的行爲模式:內嵌代碼重寫在「head」中找到的代碼,該代碼依次覆蓋在外部腳本中找到的代碼。你可以簡單地'removeAttr('onclick')'。 –
這不是一個直接的答案,但在jQuery網站上,他們聲明他們不會花費精力處理內聯事件處理程序的問題:http://docs.jquery.com/Won't_Fix#Inline_Event_Handlers。我有興趣知道爲什麼你的代碼的行爲如此,但我不認爲會有修復它(如果你發現它是一個錯誤)。 – pimvdb