我是关于greasemonkey脚本的新手,我正在尝试使用GM_xmlhttpRequest发出POST请求但是在成功时我的onload函数没有执行。
我知道GM_函数对注入的代码不起作用,所以我将它们导出到unsafeWindow。
下面是我注入页面的代码(尽管代码很长,我只粘贴相关部分)。
function localGMCode(window, unsafeWindow) {
window.GMUtils = {
injectFunctionsIntoPage: function () {
var gmInjectFuncs = {
GMxmlhttpRequest: function(object) { return GM_xmlhttpRequest(object); },
};
if ((typeof createObjectIn !== 'undefined') && (typeof exportFunction !== 'undefined')) {
var injectedGM = createObjectIn(unsafeWindow, {defineAs: "unsafeObj"});
exportFunction(gmInjectFuncs.GMxmlhttpRequest, injectedGM, {defineAs: "GMxmlhttpRequest" });
return true;
}
return false;
},
GMxmlhttpRequest: function(object) {
console.log(object);
if (typeof GM_xmlhttpRequest !== 'undefined') {
return GM_xmlhttpRequest(object);
} else if (typeof iGraphHelperGM !== 'undefined') {
return iGraphHelperGM.GMxmlhttpRequest(object);
}
return null;
},
};
window.WikiSnapshot = {
uploadDataToS3: function(snapshotUrl , iGraphUrl) {
try {
setTimeout(function() {
GMUtils.GMxmlhttpRequest({
method : 'POST',
url: <some url>,
onload: function(response){
console.log("Inside onload of GM_xmlhttpRequest");
},
});
},0);
} catch (e) { console.log(e); }
},
};
}
在上面的代码中,当GMxmlhttpRequest完成时,onload函数没有执行,(我已经尝试过onerror,onreadystagechane和其他回调函数,问题是别的)。
以下是在页面中注入上述代码的代码。
function injectMainIGraphHelper() {
var script = document.createElement('script');
script.appendChild(document.createTextNode('(' + localGMCode + ');'));
(document.body || document.head).appendChild(script);
}
我在Firefox 38.6.0,Greasemonkey 3.6上运行它 如果需要更多信息来调试,请告诉我。 提前谢谢......
答案 0 :(得分:0)
你不能将GM_api注入页面并期望它能够正常运行。因为所有GM_api都是在沙箱中实现的,这在页面的上下文中不可用。
你要么像任何常规页面脚本一样重写一个GM_api免费脚本(可能没有你想象的那么难,只有跨域XMLHttpRequest是GM独有的功能,所有其他GM_api都很容易实现,特别是我们得到了所有这些HTML5功能现在。)
或者你让脚本在GM的沙箱中运行,这将成功完成大多数工作,你唯一不能做的就是像往常一样修改页面上的一个或多个变量,你需要添加一个授予元区块:
//@grant unsafeWindow
然后让我们说在页面中有一个变量A = 1。
var usw=unsafeWindow||window;
console.log(usw.A);//1