2011-11-30 87 views
5

我做了這個測試代碼的問題:http://jsfiddle.net/5phqm/1/爲什麼jQuery的triggerHandler()不能防止內聯事件?

據我瞭解,如果jQuery的triggerHandler()防止默認瀏覽器的行爲,那麼本地JavaScript事件將不會被觸發,處理方式(它在addEventListener()是真實的我代碼),但通過標籤的屬性onclick=""添加的內聯事件無論如何都會觸發!爲什麼會發生?我誤解了瀏覽器中觸發的事件嗎?

+0

對於它的價值,我始終認爲這是遵循CSS規則的行爲模式:內嵌代碼重寫在「head」中找到的代碼,該代碼依次覆蓋在外部腳本中找到的代碼。你可以簡單地'removeAttr('onclick')'。 –

+2

這不是一個直接的答案,但在jQuery網站上,他們聲明他們不會花費精力處理內聯事件處理程序的問題:http://docs.jquery.com/Won't_Fix#Inline_Event_Handlers。我有興趣知道爲什麼你的代碼的行爲如此,但我不認爲會有修復它(如果你發現它是一個錯誤)。 – pimvdb

回答

2

可以確認的是內嵌處理程序運行,因爲它是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哪裏是truetriggerHandlefalse.trigger,因此triggerHandler不例如執行elem.click()(而.trigger確實)。因此,阻止了原生動作。

所以內聯處理程序和本機操作是分開的事情,也是分開處理的。 .triggerHandler只阻止本機操作。

0

我認爲(但它是一個猜測,我給在jQuery的源代碼,簡單的介紹一下,這可能是完全錯誤的),那jQuery的調用類似

$(elem).data("events"); 
檢索附着在jQuery.trigger.event元素的事件

然後決定是否啓動/停止它們。內聯事件不能以這種方式收集,因此不能停止。

相關問題