2015-10-15 175 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

相关问题