我正在使用Chrome扩展程序的内容脚本来创建添加到网页上的复杂显示。
我首先将它直接集成在一个网站上测试,但现在我需要把它放在一个扩展名中。
问题是Chrome的内容脚本API只允许注入javascript。这意味着,为了注入复杂的HTML布局,我需要用JS对象完全编写它,这些文件很难编写,难以维护并且绝对不是设计人员友好的。
我想知道是否有人知道或者能想出一个聪明的方法来获得更好的工作流程。
答案 0 :(得分:30)
通过让您的内容脚本将其注入iframe来添加整个网页相对容易。请遵循以下准则:
将*.htm
或*.html
个文件放在扩展程序的源文件夹中。
将HTML使用的所有*.css
和*.js
个文件也放在扩展程序文件夹中。
将HTML文件声明为资源。 EG:
"web_accessible_resources": ["Embedded_Hello_world.htm"]
请勿在HTML文件中使用任何 内嵌 或外部服务器javascript。这避免了the Content Security Policy (CSP)。
此问题不包括与页面/ iframe的通信,但如果您想这样做,则会涉及更多内容。在这里搜索SO;它被覆盖了很多次。
您可以通过以下方式查看此操作:
<强>的manifest.json:强>
{
"manifest_version": 2,
"content_scripts": [ {
"js": [ "iframeInjector.js" ],
"matches": [ "https://stackoverflow.com/questions/*"
]
} ],
"description": "Inject a complete, premade web page",
"name": "Inject whole web page",
"version": "1",
"web_accessible_resources": ["Embedded_Hello_world.htm"]
}
的 iframeInjector.js:强>
var iFrame = document.createElement ("iframe");
iFrame.src = chrome.extension.getURL ("Embedded_Hello_world.htm");
document.body.insertBefore (iFrame, document.body.firstChild);
的 Embedded_Hello_world.htm:强>
<!DOCTYPE html>
<html><head>
<title>Embedded Hello World</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="HelloWorld.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="HelloWorld.js"></script>
</head><body>
<p>Hello World!</p>
</body></html>
的 HelloWorld.css:强>
body {
color: red;
background-color: lightgreen;
}
的 HelloWorld.js:强>
$(document).ready (jQueryMain);
function jQueryMain () {
$("body").append ('<p>Added by jQuery</p>');
}
答案 1 :(得分:1)
我遇到了同样的问题,我的扩展很大程度上依赖于script templates
这就是我的所作所为:
templates.html
以在templates.html
添加到web_accessible_resources
,如上面的答案^^ templates.html
访问content.js
并使用jQuery "web_accessible_resources": ["templates.html"]
<script id="template1" type="text/template">
<div class="template1">template1</div>
</script>
<script id="template2" type="text/template">
<div class="template2">template2</div>
</script>
function getTemplates(){
return new Promise(function(resolve){
$.ajax({
url: chrome.extension.getURL('/templates.html'),
success: function(data) {
var $templates = $('<div></div>').append($.parseHTML(data)).find('script'),
templates = {};
$templates.each(function(){
templates[this.id] = this.innerHTML;
});
return resolve(templates);
}
});
});
}
getTemplates().then(function(templates){
console.log(templates.template1); //<div class="template1">template1</div>
});
答案 2 :(得分:1)
这可能更好,没有外部库,也没有iframe。与iautomation解决方案几乎相同。
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var div = document.createElement('div');
div.innerHTML = this.responseText;
document.body.insertBefore(div, document.body.firstChild);
} else {
console.log('files not found');
}
};
xhttp.open("GET", chrome.extension.getURL("/content.htm"), true);
xhttp.send();