Javascript Chrome扩展编程UI注入 到目前为止,我所拥有的:
manifest.jsonJavascript Chrome扩展编程UI注入 到目前为止,我所拥有的:,javascript,jquery,google-chrome,google-chrome-extension,Javascript,Jquery,Google Chrome,Google Chrome Extension,manifest.json { "name": "Append Test Text", "description": "Add test123 to body", "version": "1.0", "permissions": [ "activeTab" ], "background": { "scripts": ["background.js"], "persistent": false }, "browser_action": {
{
"name": "Append Test Text",
"description": "Add test123 to body",
"version": "1.0",
"permissions": [
"activeTab"
],
"background": {
"scripts": ["background.js"],
"persistent": false
},
"browser_action": {
"default_title": "Append Test Text"
},
"manifest_version": 2,
"permissions": [
"https://*/*",
"http://*/*",
"tabs"
]
}
background.js
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.executeScript({
code: 'var div=document.createElement("div"); document.body.appendChild(div); div.innerText="test123";'
});
});
它的作用:
单击chrome扩展图标后,它会将test123
添加到任何给定页面的
我希望达到的目标是: 与bit.ly Chrome扩展类似,我想在DOM中添加大量内容。单击扩展图标后,我希望在
中添加一个覆盖元素以及一个侧栏,在侧栏中可以添加jQuery选项卡开关
正如你们所看到的,我刚刚在为StackOverflow创建这个问题时拍下了这张照片
问题:
如果要在布局中添加简单的用户控件,那么动态DOM元素可能是一种方法。然而,如果你想注入一个完整的布局,这可能是一个痛苦。jQuery的功能可能很方便 您可以将侧边栏的布局放在一个静态HTML文件中,并使用jQuery将其加载到给定的容器中。假设有一个
id=“myContainer”
,这样的东西就可以了:
jQuery
$('#myContainer').load('layout.html')
要回答第一个问题,要为动态创建的元素指定特定的ID,只需将其视为DOM元素并为其设置ID即可
JavaScript
var myElement = document.createElement('div');
myElement.id = 'myContainer';
myElement.className = 'kitten-background jumbo button';
// ...
// other properties you may need
// ...
document.body.appendChild(myElement);
对于第二个问题,要检查元素是否存在,还可以再次使用jQuery。如果选择器匹配某项内容,则其length
属性将大于零,因此在插入之前,这是一个干净的验证,用于检查$(“#myContainer”)。length==0
祝你好运,你正在努力实现和乐趣 为什么不看看bit.ly扩展有多大作用 查看代码,bit.ly将一个固定位置、100%宽度/高度的iframe附加到包含包中的“app”页面的页面上。再次单击将删除iframe。有一些特殊的代码用于处理框架集页面(我在这里不作评论),但除此之外,这是一般的想法 页面的一部分是半透明的,这给人一种侧边栏的错觉,但它确实覆盖了整个页面。这是最简单的方法,因为否则你会有破坏页面布局的风险,而且没有一个通用的“神奇”解决方案可以让你的内容随处可见
// Injection
var iframe = document.createElement("iframe");
iframe.id = "my-awesome-extension-iframe";
iframe.style.width = "100%";
/* ..more styling like that.. */
iframe.src = chrome.runtime.getURL('my_ui.html');
document.body.appendChild(iframe);
// Removal
var iframe = document.getElementById("my-awesome-extension-iframe");
if (iframe) {
iframe.parentNode.removeChild(iframe);
}
要完全控制UI的外观,最好是注入一个框架,因为页面本身的CSS和脚本不会“出血”到您的上下文中。无论您想要什么库,都可以像在普通页面中一样包含在其中
如果你强烈反对使用框架的想法,你可以尝试将你的用户界面直接注入到页面中——但要小心干扰/不兼容的代码、限制性的CSP和CSS。这个问题是相关的:
您可以将上述代码段作为单独的文件,并使用带有file属性的executeScript
来插入它们。它们不需要像jQuery这样的库
请注意,该框架中的代码将具有与内容脚本代码相同的权限级别-如果您需要内容脚本中不可用的API,则需要向后台发送消息来执行此操作。您还需要列出页面本身及其所有资源。Hiya Frederik.L,到目前为止,您的答案中包含的内容我完全理解,并且我已经在我正在开发的网站上使用过,但是我不知道如何在我的
background.js
文件中实现这一点。您是否可以用一个非常小的基于jQuery的示例来修改您的答案,而不必遵循我希望实现的任何细节?谢谢你和+Ranswer在chrome扩展的上下文中是不正确的,因为它不知道上下文(弹出窗口、内容、背景)。参见Xan的回答。我假设上下文确实是可访问的。为此,我通常会在文档中附加一个脚本标记。如果我们需要一个上下文脚本,而不需要实际访问上下文,那么每次添加一行可能都会遇到麻烦。我发现的一种干净的方法是插入一个脚本标记,该标记引用扩展范围中的脚本。顺便说一下,到目前为止,您提供的代码不需要tabs
权限。它只需要读取当前选项卡的URL。即使是考虑到<代码>“ActueTabb”<代码>权限。我已经仔细检查了BITY。但是它有一个文件,里面有42000行,我根本不知道我到底在找什么。所以在my_ui.html
中,我基本上可以创建一个我习惯于创建的网站?另外,我的理解是,在服务器不在本地的站点上使用iframe意味着它无法与页面交互,如果我错了,请更正jme,因为扩展工作对我来说是新的。谢谢你提出的非常有用的建议+R这42000行代码大部分是UI本身的代码,而注入/删除UI的代码并没有那么大。分析扩展应该从清单开始,然后从后台脚本开始,寻找特定的chrome.*
调用。“另外,我的理解是,在站点上使用iframe对服务器来说不是本地的,这意味着它无法与页面交互,如果我错了,请纠正jme,因为扩展工作对我来说是新的。”这是正确的。然而,你可以有一个conte