5

我非常接近讓我的Chrome擴展程序完美運行,但現在正在運行最後一個問題。Chrome擴展程序 - 內容腳本從AJAX鏈接堆疊多次鏈接/導航

這個問題似乎涉及到正在對像Facebook,在整個頁面是不是在點擊一個鏈接重新加載等部位反覆注射的內容腳本...

我認爲這個問題是關係到網站非常依賴AJAX。

如果我刷新整個頁面,或者第一次加載它,那麼沒有問題。我的擴展運行並且內容腳本被正確注入。然而,如果我在初始時間加載頁面,然後點擊網站上的鏈接,Facebook的「內容部分」將加載您點擊的任何鏈接,而頂部的浮動藍色導航欄不會加載任何鏈接, t刷新或改變。

I.E.整個頁面不會重新加載。由於網站的「內容部分」和導航欄都在同一個框架中,因此內容腳本不斷爲您點擊的每個鏈接注入另一個時間。

因此,最終我在控制檯日誌中看到它正在運行2X,3X,4X,5X等。當我點擊更多鏈接時,數字每次增加1。

所以我的問題是這樣的:

有沒有一種簡單的方法來檢查內容腳本已經存在/主動再次注射之前?或者還有什麼可以用來解決這種情況?

回答

1

在爲我的擴展程序編寫內容腳本時,我預測到了類似的問題,所以我爲每個頁面的<body>元素添加了一個唯一屬性,並帶有擴展名和版本。

內容腳本所做的第一件事就是檢查此屬性是否已經腳本並且如果它已經停止。否則,它將添加此屬性(值爲true)並繼續其目的。

如果你想看到我的solution;

這種技術稍微複雜一點是使用message passing獲取版本並將清單(在AJAX請求中檢索)解析到JSON對象中。

要正確地看到我在initonRequestHelper函數here的功能如何實現此功能;

當然,你可以硬編碼版本或完全省略它。只要屬性名稱是唯一的。

+0

感謝您的鏈接和代碼示例加載內容的腳本! – delta9

+0

我相信他的解決方案的更新鏈接現在是https://github.com/neocotic/template/blob/master/chrome/bin/lib/content.js –

+0

謝謝@SarahVessels,我已經更新了所有相關鏈接。 – Alasdair

1

在父框架中,您可以添加window.doneInjecting = true;或類似的東西嗎? (或者在頁面中添加一個隱藏的元素 - 我不確定子框架是否可以訪問父母的JavaScript變量)

但基本上設置一個簡單的標誌,以便每次注入內容腳本時,檢查標誌是否存在,只有在不存在時纔會繼續?

1

onUpdated每次標籤的狀態發生變化時都會觸發。只是在changeInfo.status == "complete"

background.js

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
chrome.tabs.getSelected(null, function(tab) { 
    // Do some stuff 
    if (changeInfo.status == "complete") 
    { 
     // load your scripts here 
     chrome.tabs.executeScript(tabId, {file: "jquery.js"}); 
     chrome.tabs.executeScript(tabId, {file: "jquery.highlight.js"}); 
    } 
}); 
});