我想创建一个扩展名,以便在安装后立即将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");
});
如果已安装扩展程序,则可以使用。但是,如果在加载网页后安装了扩展程序,则除非重新加载,否则内容脚本无法接收从网页发送的事件。
有没有办法在内容脚本中接收事件而无需重新加载?
答案 0 :(得分:1)
有一段很长的canonical answer here。
简而言之,如果您在初始化时需要内容脚本,则应在后台脚本初始化时执行chrome.tabs.query({}, ...);
,这将在chrome.tabs.executeScript({file: "content_script.js"});
的所有选项卡中注入脚本。