2015-10-15 174 views
1

我正在編寫一個Chrome擴展,它有一個content.js來操作當前選項卡數據以及執行時生成的彈出窗口。不過,我的問題是,當我對擴展進行更改時,我不得不重新加載擴展並刷新頁面,否則會給我一個「建立連接時出錯,端口不存在」的錯誤。這裏是我的manifest.json文件Chrome擴展頁面重新加載

{ 
    "manifest_version": 2, 
    "name": "extension", 
    "version": "0.0", 
    "offline_enabled": true, 

    "content_scripts": [ 
     { 
      "matches": [ 
       "*://mail.google.com/*" 
      ], 
      "css": ["css/jquery-ui.css"], 
      "js":  ["js/jquery.js" , "js/jquery-ui.js" , "js/bootstrap.js" , "js/commons.js" , "js/content.js"], 
      "run_at": "document_end" 
     } 
    ], 

    "browser_action": { 
     "default_title": "chrome", 
     "default_popup": "html/popup.html" 
    }, 
    "permissions": [ 
    "tabs", 
    "https://*.*.*/" 
    ] 
} 
+0

您是否有任何試圖在線連接的content.js代碼? – Meeh

+0

我有一些API調用的網站是。那是什麼導致了這個問題? –

+0

從我對擴展的有限知識中,我認爲這是你的問題。應將API調用移至background.js。 這是有人有類似的問題:http://stackoverflow.com/questions/13637715/not-receiving-any-data-from-webpage-to-content-js-of-chrome-extension 內容腳本應該用於與選項卡中的「當前」頁面進行交互。像密碼保護程序或開發/調試擴展程序,linter等。 https://developer.chrome.com/extensions/content_scripts – Meeh

回答

2

這是正常行爲。當您在擴展中進行更改時,您必須重新加載它。但是當你重新加載擴展時,所有現有的內容腳本注入失去了與後臺頁面的連接。更重要的是,如果您嘗試在port.onDisconnected.addListener上重新連接,出於安全原因,您將得到一個異常,因爲新的後臺進程將無法識別其之前的內容腳本注入。

當我遇到這個問題,我想出了這個解決方案:

reconnect(); 

function reconnect() { 

    var port = chrome.runtime.connect({ 
     name: 'injection' 
    }); 

    port.onMessage.addListener(handleMessage); 
    port.onDisconnect.addListener(function() { 
     console.log('bg script disconnected'); 
     setTimeout(function() { 
      try { 
       reconnect(); 
      } catch (e) { 
       location.href = location.href; 
      } 
     }, 1000); 
    }); 
} 

function handleMessage() { 
} 

我知道,這是沒有什麼只是自動刷新頁面,但有沒有其他的方式,從以前的內容腳本注入重新連接 - 更新擴展必須再次注入代碼才能連接到後臺腳本。

+0

謝謝你解釋得這麼好:) –

+0

我試圖用它來自動重新加載頁面,但它什麼也沒做? –

+0

如果您在控制檯日誌中看到「bg腳本斷開連接」,這可能意味着需要超過1秒才能啓動擴展。您可以嘗試在連接時添加console.log以查看實際正在進行的操作。 – Anatoliy

相關問題