问题描述
我正在开发一个可以在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,指出状态变量是只读的。 有什么办法可以覆盖吗? 提前致谢 :)。
1楼
Mikhail Chibel
0
2015-08-13 05:56:49
我有一个非常类似的问题,当实际响应返回任何错误(任何大于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);} }); }); } })();