javascript - 如何在站点的 javascript 完成构建页面后运行 Chrome 扩展内容脚本?
问题描述
我知道我可以在页面加载后使用 run_at: document end 来运行脚本,但现在大多数网站都通过某种 js 框架注入大部分内容。据我所知, content.js 脚本在完成之前正在运行。
我对如何做到这一点有一些想法,但如果他们真的有意义,或者如果他们这样做了,我什至不知道如何去做。
每次 DOM 更新时运行我的脚本,这样如果添加了超链接,我就可以再次删除 href。
我在 uBlock origin 中发现了这个domwatcher 的东西,我认为他正在做这样的事情是为了删除出现的任何广告,但这真的很复杂,我不确定我需要或不需要什么东西。
每隔一两秒运行一次扩展。这看起来真的很笨拙,但也许这是一个标准的东西?我不确定。我也不知道如何让内容脚本重复,这么简单的东西不会导致性能问题,对吧?
Javascript脚本在html中列出时按顺序执行,对吗?所以也许我将脚本添加到所有这些的末尾?但是它们无论如何都是异步运行的,所以这可能行不通。无论哪种方式,在所有其他操作完成后以某种方式运行我的脚本。我可以把它们放在承诺中吗?
这也是我的GitHub 页面,其中包含所有代码。
相关清单:
"content_scripts": [
{
"matches": [
"http://*/*",
"https://*/*"
],
"js": ["content.js"],
"run_at": "document_end"
}
]
和 content.js:
chrome.storage.sync.get('isEnabled', function (data) {
if(!data.isEnabled) {
return;
}
for (let link of document.links) {
link.removeAttribute('href');
console.log(link);
}
});
解决方案
由于 DOM 是由它使用的任何框架/库动态生成的,因此我会观察 DOM 中的任何更改并改为处理新创建的内容。我认为这比尝试检测 DOM 内容何时完成构建并运行更好contentScripts
,考虑到页面内容可以在用户在页面上时随时动态生成和更改。
我的解决方案是,您可以观察任何新创建的链接元素,href
如果它与您想要的模式匹配,则删除属性。这可以通过使用以下任一方法来完成:
- MutationObserver : 用于观察 DOM 变化的 Javascript 接口
- Arrive.js:一个用于观察 DOM 变化的库。
您提供的uBlock示例也用于MutationObserver
监视 DOM 树的变化,所以我认为作者也在使用我在这里提到的方法。
推荐阅读
- reactjs - 将回调从一个类导入到打字稿中的另一个
- python - 'tensorflow.negative' 是否总是与运算符“-”相同?
- c# - 使用代码优先方法使用 EF 创建数据库时出错
- vb.net - 它在文本框中提供价值,但只有在完成它之后。如何在运行计时器时显示数据?
- r - 如何在 keras R 中使用特定的 GPU 设备进行学习?
- rxjs - RxJs:等待来自 Observable 的值,如果它在指定的时间段后没有出现,做一些事情并再次等待,在 n 次尝试 throwError 之后
- c# - 将一个模拟方法的结果返回给另一个模拟方法
- odoo-12 - 如何在odoo 12的父树视图中设置popus表单视图中的默认值?
- python - 如果条件匹配,python如何添加值
- ios - 如何根据方向配置 swipeGesture 方向