javascript - 使用 chrome.tabs.executeScript(...) 时避免多次动态注入(inject)相同的脚本

标签 javascript google-chrome-extension

我正在构建一个 Google Chrome 扩展程序。基本设置是我有一个浏览器操作按钮,当单击它时,它会将 jQuery 和另一段 JavaScript 注入(inject)到事件选项卡中。

这是我的第一个 Chrome 扩展程序,但似乎如果用户第二次单击按钮采取操作,脚本将被重新注入(inject)。这是一个问题,因为它将使用的主要页面都是 AJAX,因此页面内容会发生显着变化,但实际页面 URL 永远不会改变。

这是一个合理的担忧,还是我想多了,是否有一种简单的方法可以防止脚本多次注入(inject)同一页面?我是否应该将这些指定为内容脚本?

最佳答案

这绝对是一个合理的担忧。

最简单的方法是使用类似于 #ifndef include guards in C 的机制。

定义一个标志,在内容脚本执行后设置,并在执行任何操作之前检查它是否已定义。从同一扩展注入(inject)的所有脚本共享 JS 执行上下文,因此共享全局范围。

您的内容脚本可能如下所示:

if (window.contentScriptInjected !== true) {
    window.contentScriptInjected = true; // global scope

    /* Do your initialization and work */
}

/* global function definitions */

检查应该使用一个显式的 true 值来避免页面上的误报,这些页面恰好有一个元素的 id 属性意外地等于变量名称 - 浏览器创建一个implicit global variable指向那个 DOM 元素,所以对于 if 检查它是真实的。

关于javascript - 使用 chrome.tabs.executeScript(...) 时避免多次动态注入(inject)相同的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23208134/

相关文章:

javascript - json数据量大,浏览器评估json数据慢

javascript - 谷歌表格 API : "message": "The request is missing a valid API key."

javascript - 您可以将事件监听器定位到特定的 Chrome 警报吗?

javascript - Google Chrome 扩展的 onBrowserClose 事件?

javascript - 从 Angular 中的 API 占位符 JSON 中删除数据

javascript - 弹跳效果不起作用。导致它不起作用的背景图像?

javascript - 如何监控扩展/插件请求?

javascript - 导航到新链接时内容脚本无法运行

javascript - 对于看似任意的大数字,SetInterval 会不断触发(0 毫秒)

javascript - 在单击或触摸时暂停事件,然后在 jQuery 中完成一些工作后 "restart"状态事件?