在Chrome扩展开发中,如何将变量从background.js传递到嵌入为脚本节点的内容脚本?

AGa*_*yer 6 google-chrome-extension

更新:对不起,我不清楚我的情况.内容脚本不是字面上的内容脚本,而是通过该createElement方法嵌入到页面中的js文件.

它是这样的:

// this is "content.js"
var scriptElement = document.createElement('script');
scriptElement.src = 'chrome-extension://' + chrome.runtime.id + '/js/page-inject.js';
(document.head || document.documentElement).appendChild(scriptElement);
Run Code Online (Sandbox Code Playgroud)

我想在"page-inject.js"中使用它,而不是"content.js"

我认为这很简单,但经过数小时的重试和搜索后失败了.

background.js喜欢这样的:

chrome.tabs.query({active: true, currentWindow: true}, 
function(tabs) {
  chrome.tabs.executeScript(tabs[0].id, {
    code: 'window.my_var = 123'
  }, function() {
    chrome.tabs.executeScript(tabs[0].id, {file: 'js/content.js'});
  });
});
Run Code Online (Sandbox Code Playgroud)

在此之后,当我在该页面的控制台中键入"window.my_var"时.它不起作用.想要的"123"没有出现.

如果我替换code: 'window.my_var = 123'alert(123),它的工作原理.但我需要的是将一个变量从我的后台脚本(background.js)传递到我的扩展注入的网页.

我的尝试有什么问题吗?

ele*_*ser 6

由于@wOxxOm已经指出如何通过chrome.tabs.executeScript在控制台中更改来使用网页控制台中的变量注入Top.

还有另一种方法可以使用消息传递轻松地将值从后台传递到内容脚本.

下面是一个简单的例子:

的manifest.json

{
  "name": "test",
  "version": "0.0.1",
  "manifest_version": 2,
  "description": "Test ",
  "background": {
    "scripts": [
      "background.js"
    ]
  },
  "browser_action": {
    "default_title": "Test "
  },
  "permissions": [
    "*://*/*",
    "tabs"
  ], "content_scripts" : [{
            "matches" :  ["*://*/*"],
            "js" : ["content.js"]
        }]
}
Run Code Online (Sandbox Code Playgroud)

background.js

  chrome.browserAction.onClicked.addListener(function(){
       chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
            chrome.tabs.sendMessage(tabs[0].id, {data: "some value"});
        });
    });
Run Code Online (Sandbox Code Playgroud)

content.js

chrome.extension.onMessage.addListener(handleMessage);
function handleMessage(request) {
    console.log(request.data);
}
Run Code Online (Sandbox Code Playgroud)