GM_xmlhttpRequest成功回调' onload'不执行注入的代码

时间:2016-02-18 14:59:46

标签: javascript jquery firefox greasemonkey

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

1 个答案:

答案 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