从chrome扩展中的内容脚本访问全局对象

时间:2012-04-07 06:14:32

标签: javascript html google-chrome-extension

我在.js文件中定义了一个全局对象。例如,file1.js包含全局对象SomeObject。此文件在background.html中加载。

由于file1.js包含在background.html中,因此我可以访问此页面中的全局对象。所以这里没有问题。

当执行点击扩展按钮等事件时,我正在使用chrome.tabs.executeScript(null, {file: "contentscript.js"}); api运行内容脚本。

在这种情况下如何访问contentcript中的SomeObject?

1 个答案:

答案 0 :(得分:19)

Content script注入的脚本 无法直接访问背景页面的全局对象

要从注入的脚本中使用背景页面的方法,请按照下列步骤操作:

  1. 内容脚本:将事件监听器绑定到页面 example 1
    每当您想要从后台页面通知方法时:
  2. 注入脚本:创建并触发此特定事件 example 1
    →来自 1)的事件监听器被触发。
  3. 在此事件监听器中,使用chrome.runtime.sendMessage从后台 example 2 请求功能。
  4. 在后台页面中,使用chrome.runtime.onMessage处理此请求。
  5. (可选)使用chrome.tabs.executeScript(tab.id, func)在原始标签中注入代码。
  6. 要从内容脚本使用背景页面的方法,只需要步骤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'
            });
        }
    });
    

    另见