【问题标题】:chrome extension Cannot read property 'currentScript' of undefinedchrome 扩展无法读取未定义的属性“currentScript”
【发布时间】:2015-12-11 05:15:07
【问题描述】:

我在我的 chrome 扩展中定义了 XHR 请求,它从特定网站中提取一个 javascript 文件并在其中执行一个函数。像这样:

//This will return the remote JS file content
function _curl(url) {
      var xhr = new XMLHttpRequest();
      xhr.open('get', 'https://allow-any-origin.appspot.com/' + url, false);
      xhr.send();
      return xhr.responseText;
}

//Here I get the JS content and execute it
var rpt = _curl('https://my-page.com/remote.js').match(/\){([^]+)}/)[1]; 
eval(rpt); //This fails with the error "Cannot read property 'currentScript' of undefined"

远程文件中定义currentScript的部分JS代码为:

...
var Uh=window.document.currentScript&&-1!=window.document.currentScript.src.indexOf("?loadGamesSDK")?"/cast_game_sender.js":"/cast_sender.js",
...

这是因为我试图在 chrome 环境中执行请求吗?因为,我也尝试通过eval 内容在页面内执行请求,这很有效。只是每当我尝试在我的扩展程序中执行相同的代码时,它就会弹出此错误

【问题讨论】:

  • 这段代码通常是可疑的(同步 XHR?eval?),但重要的部分是:你试图在扩展的哪个部分运行它,为什么它必须是远程脚本?
  • 你必须知道eval()函数不能在谷歌浏览器扩展中使用。它被认为是不安全的调用,会抛出异常。
  • @Xan 它基本上是一个插件,它依赖于远程javascript文件中定义的函数进行计算。如果没有他们的 JS 文件中的函数,代码是无用的。这解释了远程脚本的用途。有没有更好的办法?我正在尝试在内容脚本中运行它。
  • @EmrysMyrooin 我知道这是完全不安全的,不推荐。相信我,我也在努力避免它。但是我应该如何在远程 JS 文件中执行一个函数呢?还有其他方法吗?注意远程JS是绝对必要的。我没有办法避免它
  • @Emrys,这是 FUD,也可以安全地在扩展中使用 eval / remote 代码。

标签: javascript ajax google-chrome google-chrome-extension


【解决方案1】:

我没有注意到脚本在后台页面中运行。它始终具有window.document 属性。但是,由于 eval 失败,我尝试将其替换为 jQuery.globalEval 并且成功了。

我认为它起作用的原因是eval 没有在jQuery.globalEval 提供的全局环境中执行。 This answer 多解释一下这种行为。

现在的工作代码如下所示:

//This will return the remote JS file content
function _curl(url) {
      var xhr = new XMLHttpRequest();
      xhr.open('get', 'https://allow-any-origin.appspot.com/' + url, false);
      xhr.send();
      return xhr.responseText;
}

//Here I get the JS content and execute it
var rpt = _curl('https://my-page.com/remote.js').match(/\){([^]+)}/)[1]; 
jQuery.globalEval(rpt); //This works now

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多