1

有一個Firefox擴展,它通過如何調用被擴展首先覆蓋的原始JavaScript函數?

Object.defineProperty(Event.prototype, 'preventDefault', ... 

修改本地preventDefault函數執行我的JavaScript腳本之前。所以,當我調用preventDefault函數時,修改的函數將被調用,而不是原來的函數。該功能的行爲由擴展名更改。

對於我來說,有繞過擴展雙向:

  1. 得到執行擴展之前,本地的preventDefault功能,但我的腳本後延,甚至我把我的腳本在頭標記始終執行。

  2. 自己實現preventDefault函數,但我不知道該怎麼做。

或者這是一些替代方法?

+4

任何你需要繞過這個的原因?如果用戶安裝破解JS引擎的奇怪擴展,如果網站停止工作,這是他們的問題,而不是你的。否則,我認爲唯一的辦法就是自己重新實施它。 –

+0

在庫的源代碼中添加一行以將原始引用存儲在您可用來調用它的全局變量中 – AhmadWabbi

+0

@AhmadWabbi您的意思是在擴展源中添加一行?如果在我的源代碼中添加一行,但擴展源始終在我的代碼之前執行... – Xhua

回答

0
  1. 得到執行擴展之前,本地的preventDefault功能,但我的腳本後延,甚至我把我的腳本在頭標記始終執行。

這是不可能的。擴展程序選擇在加載HTML之前運行(即擴展程序在document_start上運行)。如果他們願意,擴展可以首先運行代碼。這是瀏覽器的設計/目的。如果擴展名更改原型,則不能直接訪問已被覆蓋的函數。

  1. 自己實現preventDefault函數,但我不知道該怎麼做。

基本上,你不能。 .preventDefault()方法是可以影響表示事件的瀏覽器內部數據結構的方式,這種方式會導致瀏覽器不調用默認操作。即使從DOM中刪除元素也不會阻止默認操作。如果要採取默認操作,則無法影響您,除了調用.preventDefault()之外。

您只能檢測到.preventDefault()方法已被覆蓋,並提醒用戶您的網站在安裝/啓用該擴展模塊時無法正常工作。在這種情況下,您可能可能會檢測到.preventDefault()方法已被更改,方法是比較Event.prototype.preventDefault.toString()返回的內容與您希望在方法未被覆蓋時返回的內容。

+0

我真的同意你來檢測方法是否被覆蓋。實際上,我們可以通過一種簡單的方式直接檢測擴展,因爲它還修改了其他一些JavaScript默認行爲。 – Xhua