当前位置: 代码迷 >> JavaScript >> 覆盖XMLHttpRequest状态变量?
  详细解决方案

覆盖XMLHttpRequest状态变量?

热度:92   发布时间:2023-06-05 09:38:44.0

我正在开发一个可以在nw.js或浏览器下工作的游戏引擎。 在浏览器中,成功请求的XMLHttpRequest返回status = 200。 但是,在nw.js中它返回0(因为加载本地文件duh时没有超时)。

我的游戏引擎使用了外部库,除了经过缩减外,由于明显的原因,自己(或我的游戏引擎的任何其他用户)无法对其进行编辑。 我的想法是覆盖“ onreadystatechange”,如果我收到状态= 0,则在nw.js下运行时将其更改为status = 200。

我已经尝试过了,但是状态一直为零:

(function(xhr) {
    var send = xhr.send;
    xhr.send = function(data) {
        var rsc = this.onreadystatechange;
        if (rsc) {
            this.onreadystatechange = function() {
                if(this.readyState == 4)
                    if(this.status == 0)
                        this.status = 200;
                return rsc.apply(this, arguments);
            };
        }
        return send.apply(this, arguments);
    };
})(XMLHttpRequest.prototype);

这取自Rob W在找到的出色答案。 我还读过MDN,指出状态变量是只读的。 有什么办法可以覆盖吗? 提前致谢 :)。

我有一个非常类似的问题,当实际响应返回任何错误(任何大于300的代码)时,我必须将状态代码更改为200。 幸运的是, 好答案让我知道了如何更改状态码。

 (function() { var oldXMLHttpRequest = XMLHttpRequest; // define constructor for my proxy object XMLHttpRequest = function() { var actual = new oldXMLHttpRequest(); var self = this; this.onreadystatechange = null; // this is the actual handler on the real XMLHttpRequest object actual.onreadystatechange = function() { self.status = this.status; if (this.readyState == 4 ) { if (this.status >= 300) { self.status = 200; } } if (self.onreadystatechange) { return self.onreadystatechange(); } }; // add all proxy getters, except 'status' [ "statusText", "responseType", "response","responseText", "readyState", "responseXML", "upload"].forEach(function(item) { Object.defineProperty(self, item, { get: function() {return actual[item];} }); }); // add all proxy getters/setters ["ontimeout, timeout", "withCredentials", "onload", "onerror", "onprogress"].forEach(function(item) { Object.defineProperty(self, item, { get: function() {return actual[item];}, set: function(val) {actual[item] = val;} }); }); // add all pure proxy pass-through methods ["addEventListener", "send", "open", "abort", "getAllResponseHeaders", "getResponseHeader", "overrideMimeType", "setRequestHeader"].forEach(function(item) { Object.defineProperty(self, item, { value: function() {return actual[item].apply(actual, arguments);} }); }); } })();