2016-12-06 56 views
1

我目前正在開發一個chrome擴展,它包含background.js和content_scripts.js。在content_scripts中,我在所有元素中添加了一些「event.preventDefault」 ,並在頁面上添加了一些元素。但是當用戶第二次點擊我的擴展時,我想「關閉」我的擴展並取消我的擴展完成的所有更改。如何在打開它後停止我的Chrome擴展?

有沒有一種簡單的方法來做到這一點,還是我必須對待我所做的所有更改?

+0

對於你給出的例子,我只是聲明一個全局標誌(例如'_active = true'),並且只有在它爲真時才執行代碼。第二次執行擴展時,只需將其切換爲false即可。 – Archer

+0

它會阻止我的擴展運行兩次,但它不會取消擴展所做的所有事情。 –

回答

1

不,沒有重新加載頁面,沒有簡單的方法一般地撤消所有的更改。是的,如果你想讓所有的改變都撤消,那麼你必須自己撤消它們。如果您的擴展功能被禁用,或者您打電話給特定的API,那麼您的更改將不會進行任何魔術記錄。

有這樣做的一些明顯的策略:

  • 記住,你所做的更改,並通過一個撤消他們一個(撤消更改,刪除事件監聽器等)。需要什麼取決於您的擴展名以及希望保留的狀態。您可以通過chrome.tabs.sendMessage()輕鬆地向您的內容腳本發送一條消息,表明它應該禁用自己和/或退出任何更改。
  • 重新加載頁面
  • 存儲頁面的至少部分的初始狀態並將其恢復。這可能很難做到,並且在通用頁面上可能是不可能的。您必須知道所有事件偵聽器以及可能由頁面中的JavaScript設置的其他狀態信息。
+0

這就是我的想法。問題是我添加了一些防止默認值,所以我想實現它的最好方法是重新加載頁面。謝謝你的幫助;我會接受它作爲最佳答案。 –

+0

@LucasMello,防止默認聽起來就像添加事件偵聽器[] addEventListener](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener)。您可以使用['removeEventListener'](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener)刪除監聽器。我在多個擴展中執行此操作以禁用擴展的效果。 – Makyen

+0

@LucasMello,當您需要禁用擴展/內容腳本時,記錄您添加和刪除的所有事件偵聽器是相對容易的。我在動態應用偵聽器的多種情況下(即代碼寫入時元素,事件類型等未知)都這樣做。 – Makyen

-1

試試這個。

if(localStorage.getItem('firstClick')==='true'){ 
    localStorage.setItem('firstClick', 'false'); 
    chrome.tabs.executeScript(null, {file: "contentscript.js"}); 
} 

else { 
    localStorage.removeItem('firstClick'); 
    localStorage.set('firstClick', 'true') 
} 
+1

這並不回答這個問題。 –