gpt4 book ai didi

javascript - GM_xmlhttpRequest 成功回调 'onload' 未执行注入(inject)代码

转载 作者:行者123 更新时间:2023-11-28 06:21:33 26 4
gpt4 key购买 nike

我是greasemonkey脚本的新手,我正在尝试使用GM_xmlhttpRequest发出POST请求,但成功后我的onload函数没有执行。

我知道 GM_ 函数不适用于注入(inject)的代码,因此我将它们导出到 unsafeWindow。

下面是我注入(inject)到页面中的代码(虽然代码很长,我只粘贴相关部分)。

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 和其他回调函数,问题是其他的)。

下面是在页面中注入(inject)上述代码的代码。

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 上运行如果需要更多信息来调试此问题,请告诉我。提前致谢...

最佳答案

您无法将 GM_api 注入(inject)页面并期望它会正常运行。因为所有 GM_api 都是在沙箱中实现的,在页面上下文中不可用。

你要么像任何常规页面脚本一样重写一个GM_api-free脚本(可能没有你想象的那么难,只有跨域XMLHttpRequest是GM独有的功能,所有其他GM_api将很容易实现,特别是我们得到了所有这些现在有 HTML5 功能。)

或者你让脚本在GM的沙箱中运行,这实际上可以完成大部分工作,你唯一不能做的就是像通常的方式修改页面上的对象或变量,你需要添加一个授予元 block :
//@grant unsafeWindow
那么假设页面中有一个变量A=1。
var usw=unsafeWindow||窗口;
console.log(usw.A);//1

关于javascript - GM_xmlhttpRequest 成功回调 'onload' 未执行注入(inject)代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35484925/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com