在刷新页面之前,Chrome扩展程序内容脚本无法侦听事件

时间:2014-05-29 05:44:45

标签: google-chrome-extension content-script

我想创建一个扩展名,以便在安装后立即将html注入每个页面,而无需重新加载。

webpage.html:

<html>
<head>
<meta charset="utf-8" />
<title>Extension</title>
<script>
  var go = function() {
    var event = document.createEvent('Event');
    event.initEvent('hello');
    document.dispatchEvent(event);
  };
</script>
</head>
<body>
<a href="javascript:go();">Click me</a> 
</body>
</html>

的manifest.json:

{
  "name": "Chrome Extension Test",
  "version": "0.1",
  "description": "Test",
  "manifest_version": 2,

  "background" : { 
    "persistent": true,
    "scripts": ["background.js"]
  },  

  "permissions": ["http://*/*", "https://*/*"],
  "content_scripts": [{
    "matches": ["http://*/*", "https://*/*"],
    "js": ["content_script.js"]
  }]  
}

content_script.js:

(function() {
  document.addEventListener("hello", function(data) {
  chrome.runtime.sendMessage("test");
 });
})();

background.js:

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
  alert("message received");
  console.log("background message received");
});                 

如果已安装扩展程序,则可以使用。但是,如果在加载网页后安装了扩展程序,则除非重新加载,否则内容脚本无法接收从网页发送的事件。

有没有办法在内容脚本中接收事件而无需重新加载?

1 个答案:

答案 0 :(得分:1)

有一段很长的canonical answer here

简而言之,如果您在初始化时需要内容脚本,则应在后台脚本初始化时执行chrome.tabs.query({}, ...);,这将在chrome.tabs.executeScript({file: "content_script.js"});的所有选项卡中注入脚本。