javascript - 使用 Chrome 扩展程序覆盖事件
问题描述
我正在构建一个 Chrome 扩展程序,但在尝试覆盖将运行扩展程序的页面上的一些 JavaScript 事件时遇到了一些麻烦。
我用 HTML 构建了一个样机页面,如下所示:
document.querySelector('#f').onclick = function() {
document.body.innerHTML += 'you clicked';
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<button id='f'>click me</button>
</body>
</html>
该扩展程序应该更改 onclick 事件。所以这里我们有内容脚本:
document.querySelector('#f').onclick = function() {
document.body.innerHTML += 'it is the extension';
}
但相反,这两个功能彼此独立执行-innerHTML
单击按钮时添加的是you clickedit is the extension
. 为什么这两个函数都执行了,我该如何解决这个问题?
提前致谢。
解决方案
您的脚本在与页面上下文中运行的脚本不同的上下文中运行。
如MDN所述:
内容脚本获得 DOM 的“干净”视图。这表示:
- 内容脚本看不到页面脚本定义的 JavaScript 变量。
- 如果页面脚本重新定义了内置 DOM 属性,则内容脚本会看到该属性的原始版本,而不是重新定义的版本
因此,实际上您的代码并没有重新定义onClick
属性,而是添加了一个事件侦听器,因此您需要通过将脚本注入<script>
元素来使其作为“页面脚本”运行。
使用我为此目的构建的实用程序的可能解决方案:
await runInPageContext(() => {
document.querySelector('#f').onclick = function() {
document.body.innerHTML += 'it is the extension';
}
});
推荐阅读
- python - Kivy Treeview 位置问题
- python - 通过链接抓取网页。
- git - Git 合并 - 将没有冲突的文件添加到下一次提交
- python - 在张量流概率中指定 DirichletMultinomial
- html - Angular 6组件未显示
- python - list_of_post() 得到了一个意外的关键字参数“slug”
- javascript - Angular 6,请求 httpClient(类型错误)
- sql-server - 仅当当前数据库为 master 时才能授予服务器范围的权限
- c# - C#使用ServiceController类获取服务登录?
- google-apps-script - Google Apps 表格 if 语句未执行