我正在写一个Chrome扩展程序,并试图在popup.html文件中单击按钮时将<div>
覆盖在当前网页上。
当我从popup.html中访问document.body.insertBefore
方法时,它会覆盖弹出窗口上的<div>
,而不是当前网页。
为了访问网页的DOM,我必须在background.html和popup.html之间使用消息传递吗?我想做的一切popup.html,并使用jQuery太,如果可能的话。
我正在写一个Chrome扩展程序,并试图在popup.html文件中单击按钮时将<div>
覆盖在当前网页上。
当我从popup.html中访问document.body.insertBefore
方法时,它会覆盖弹出窗口上的<div>
,而不是当前网页。
为了访问网页的DOM,我必须在background.html和popup.html之间使用消息传递吗?我想做的一切popup.html,并使用jQuery太,如果可能的话。
2条答案
按热度按时间gstyhher1#
**问题:**扩展页面(弹出、选项、MV 2中的背景页等)与网页是分开的,它们有自己的DOM、
document
、window
和chrome-extension://
URL。**解决方案:使用content script**访问网页或与其内容进行交互。
方法一。声明性
manifest.json:
它将在页面加载时运行一次。在此之后,使用messaging。
警告!它不能发送DOM元素、Map、Set、ArrayBuffer、类、函数等。它只能发送JSON兼容的简单对象和类型,因此您需要手动提取所需的数据并将其作为简单的数组或对象传递。
方法二。程序化
*ManifestV3:
在扩展脚本中使用chrome.scripting.executeScript(比如popup),根据需要将内容脚本/函数注入到标签中。
此方法的结果是内容脚本中的最后一个表达式,因此可用于提取数据。数据必须与JSON兼容,请参阅上面的警告。
manifest.json中所需的
permissions
:"scripting"
-强制性;"activeTab"
-理想的场景,适合响应用户操作(通常是单击工具栏中的扩展图标)。安装扩展时不显示任何权限警告。如果理想的场景是不可能的,则将允许的站点添加到manifest.json中的
host_permissions
:"*://*.example.com/"
加上你想要的任何其他网站。"<all_urls>"
或"*://*/"
这些扩展程序将在Chrome网上应用商店中进入超级缓慢的审查队列,因为有广泛的主机权限。*V2与上述的区别:
permissions
中指定站点。oo7oh9g92#
一些使用编程注入来添加div的扩展弹出脚本的例子。
ManifestV3
不要忘记在manifest.json中添加权限,请参阅其他答案以获取更多信息。
*简单调用:
**注意:**在Chrome 91或更早版本中,
func:
应为function:
。*带参数调用并接收结果
需要Chrome 92,因为它实现了
args
。实施例1:
实施例2:
ManifestV2
*简单调用:
*带参数调用并得到结果:
这个例子使用了
inContent
函数代码到字符串的自动转换,这里的好处是IDE可以应用语法高亮和linting。明显的缺点是浏览器浪费时间来解析代码,但通常不到1毫秒,因此可以忽略不计。