我的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
内容在页面内执行请求。只要我尝试在扩展程序中执行相同的代码,它就会弹出这个错误
答案 0 :(得分:-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