从 chrome 扩展程序中的内容脚本访问全局对象
Accessing global object from content script in chrome extension
我在.js文件中定义了一个全局对象。例如,file1.js 包含全局对象 SomeObject。此文件在后台加载.html。
由于 file1.js 包含在 background.html 中,因此我能够访问此页面中的全局对象。所以这里没有问题。
当执行诸如单击扩展按钮之类的事件时,我正在使用chrome.tabs.executeScript(null, {file: "contentscript.js"});
api运行内容脚本。
在这种情况下,我如何访问内容脚本中的某个对象?
无法从内容脚本或注入的脚本直接访问后台页面的全局对象。
要使用注入脚本中的后台页面方法,请执行以下步骤:
-
内容脚本:将事件侦听器绑定到页面示例 1。
每当要从后台页面通知该方法时: -
注入的脚本:创建并触发此特定事件示例 1。
→ 触发来自 1) 的事件侦听器。 - 在此事件侦听器中,使用
chrome.runtime.sendMessage
从后台示例 2 请求功能。 - 在后台页面中,使用
chrome.runtime.onMessage
处理此请求。 - (可选)使用
chrome.tabs.executeScript(tab.id, func)
在原始选项卡中注入代码。
若要从内容脚本使用后台页的方法,只需执行步骤 3 和 4。
下面是一个示例,其中内容脚本与后台页面通信:
// Example background page
function some_method(arg_name) {
return localStorage.getItem(arg_name);
}
chrome.runtime.onMessage.addListener(function(request, sender, callback) {
if (request.type == 'localStorage - step 4') {
callback( some_method(request.name) );
} else if (request.type == 'localStorage - step 5') {
localStorage.setItem(request.name, request.value);
}
});
// Example contentscript.js
chrome.runtime.sendMessage({
type: 'localStorage - step 4',
name: 'preference'
}, function(value) {
if (value === null) {
// Example: If no preference is set, set one:
chrome.runtime.sendMessage({
type: 'localStorage - step 5',
name: 'preference',
value: 'default'
});
}
});
参见
- SO:您应该了解的有关后台脚本、内容脚本与注入脚本的信息。
- SO:示例代码:在注入的脚本和内容脚本之间进行通信。
相关文章:
- Java脚本访问Location标头's OAuth 2的URL片段
- 如何通过脚本访问用户控制值
- 脚本 5:访问被拒绝 ie8.在 IE11 中使用 IE8 模拟器
- 脚本访问内联javascript变量
- 使用Java脚本访问多个Google日历-Google日历API
- 浏览器化:从脚本访问 dom 元素
- 通过 Chrome 扩展程序中的内容脚本访问本地存储
- 如何从内容脚本访问活动选项卡的事件处理程序
- 有没有办法从node中的脚本访问调试信息.js和/或一般的javascript
- 无法使用 HTML 中的 Java 脚本访问.csv文件
- 如何从导入的 html 中的脚本访问导入的 html 的元素
- 咖啡脚本访问输入值
- 从 chrome 扩展程序中的内容脚本访问全局对象
- Firefox加载项从后台/内容脚本访问弹出脚本
- 如何从Azure Javascript应用程序服务中的脚本访问表
- 如何在没有服务器端脚本访问的情况下进行实时更新网页
- CKEditor:从外部脚本访问insertHtml()方法
- 使用java脚本访问DVD驱动器等硬件的最佳方式是什么
- Angular 2+SignalR-从外部脚本访问Angular内部
- 使用脚本加载程序注入的脚本访问全局变量