4

我正在尝试编写 chrome 扩展程序,并且我有一个带有以下代码的 background.html:

var x = "test";

function tabChanged(id, info, tab){
    if(info.status == 'complete'){
        chrome.tabs.executeScript(id, {code:"try{alert(x);}catch(e){alert(e);}"}, null);
    }
}

chrome.tabs.onUpdated.addListener(tabChanged);
chrome.tabs.getAllInWindow(null,function(tabs){
    for(var index=0; index < tabs.length; index++){
        chrome.tabs.executeScript(tabs[index].id, {code:"try{alert(x);}catch(e){alert(e);}"}, null);
    }
});

但是变量“x”在 executeScript 中始终是未定义的。

如何从 executeScript 获取/设置 x?不使用消息传递。

4

3 回答 3

3

内容脚本在网页上下文中执行。有关更多信息,请参阅Chrome 文档中的内容脚本部分。

如果要将字符串变量从后台页面传递给chrome.tabs.executeScript您必须执行以下操作:

var x = "test";
chrome.tabs.executeScript(id, {code:"var x = '"+x+"'; try{alert(x);}catch(e){alert(e);}"},null);

如果要修改变量,则只有一种方法-消息传递:

var x = 1;
console.log('x=' + x);

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    console.log(request);
    if(request.command == 'setVar') {
        window[request.name] = request.data;
    }
});

chrome.browserAction.onClicked.addListener(function() {
    var code = "chrome.extension.sendRequest({command: 'setVar', name: 'x', data: 2});";
    chrome.tabs.executeScript(null, {code:code});
    window.setTimeout(function(){console.log('x=' + x);}, 1000);
});
于 2012-05-22T18:51:05.060 回答
0

对于 chrome Chrome 92+,您可以使用args

chrome.tabs.query({active: true, currentWindow: true}).then(([tab])=>{
  const para = "Hello world!!!"
  chrome.scripting.executeScript({
    target: {tabId: tab.id},
    function: (args) => {
      alert(args)
    },
    args: [para]
  })
})

或者您可以使用chrome.storage

{
  "manifest_version": 3,
  "permissions": [
    "storage",
    "activeTab",
    "scripting"
  ]
}
chrome.storage.sync.set({msg: "hello world"})
chrome.tabs.query({active: true, currentWindow: true}).then(([tab])=>{
  chrome.scripting.executeScript({
    target: {tabId: tab.id},
    function: () => {
      chrome.storage.sync.get(['msg'], ({msg})=> {
        console.log(`${msg}`)
        alert(`Command: ${msg}`)
      })
    }
  })
})

args 中传递函数的更新可以吗?

你不能

也不StorageArgs,它们都不能接受函数参数。

例子:

const myObj = {
  msg: "Hi",
  myNum: 1,
  myFunc: ()=>{return "hi"},
  myFunc2: function() {return ""}
}

chrome.storage.sync.set({
  msg: "my storage msg",
  myObj,
})

chrome.tabs.query({active: true, currentWindow: true}).then(([tab])=>{
  chrome.scripting.executeScript({
    target: {tabId: tab.id},
    function: (para1, para2MyObj) => {
      console.log(para1) // Hello
      console.log(JSON.stringify(para2MyObj)) // {"msg":"Hi","myNum":1} // myFunc, myFunc2 are missing. You can't get the variable if its type is function.
      chrome.storage.sync.get(['msg', "myObj"], ({msg, myObj})=> {
        console.log(`${msg}`) // "my storage msg"
        console.log(JSON.stringify(myObj)) // {"msg":"Hi","myNum":1}
        alert(`Command: ${msg}`)
      })
    },
    args: ["Hello", myObj]
  })
})
于 2021-08-02T13:42:56.447 回答
-1

您的变量未定义的原因是因为您在字符串中引用了您的变量,所以您可以简单地执行以下操作:

var yourVar = "your variable"
   //define your variable
chrome.tabs.executeScript({code: 'Your code here' + yourVar + ';}'})
   //then format it like this ({code: "Your code as a string" + your variable + "code"})

如果您想稍后更改变量而不是只做同样的事情但使用新变量,这很简单

于 2014-08-21T20:57:27.543 回答