我已经阅读了这个问题,但它并没有完全回答我的问题.不幸的是,自从我上次查看AJAX以来,看起来XHR对象中的内容发生了变化,因此responseText
在完成填充之前不再可以直接访问.
我必须编写一个使用AJAX(最好是jQuery,但我愿意接受建议)的页面来从我无法控制的服务器通过HTTP检索CSV数据.响应数据可能非常大; 一兆字节的文本并不少见.
服务器是流友好的.是否有任何方法可以直接从JavaScript返回数据流?
我可以选择编写一些生活在中间的PHP代码并使用某种"Comet"技术(长轮询,EventSource等),但我希望尽可能避免这种情况.
如果它是相关的,假设这个问题用户有最新版本的Firefox/Chrome/Opera和旧的浏览器兼容性不是问题.
我正在尝试构建一个脚本,它将充当本机XMLHttpRequest
对象的代理/包装器,使我能够拦截它,修改responseText并返回原始的onreadystatechange事件.
上下文是,如果应用程序尝试接收的数据已在本地存储中可用,则中止XMLHttpRequest
并将本地存储的数据传递回应用程序成功/失败回调方法.假设我无法控制应用程序现有的AJAX回调方法.
我原本试过以下想法..
var send = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(data){
//Do some stuff in here to modify the responseText
send.call(this, data);
};
Run Code Online (Sandbox Code Playgroud)
但正如我现在所建立的那样,responseText是只读的.
然后我尝试退后一步,编写自己的完整本机代理XMLHttpRequest
,最终编写自己的本机方法版本.与此处讨论的相似......
http://www.ilinsky.com/articles/XMLHttpRequest/#implementation-wrapping
但它很快就变得混乱,并且仍然难以将修改后的数据返回到原始onReadyStateChange
方法中.
有什么建议?这甚至可能吗?
如何修补猴子XMLHTTPRequest
的onreadystatechange
功能.我正在尝试添加一个函数,当从页面发出的每个ajax请求返回时,将调用该函数.
我知道这听起来像一个可怕的想法,但用例非常奇特.我想在控制台(jqconsole)中使用某个SDK,但在控制台内显示ajax调用的状态和结果,而不修改外部SDK.
我看过这篇文章有很多信息,但猴子修补回调似乎超出了我的JavaScript技能.
PS不能使用jQuery,因为它只支持从jQuery调用的jjj调用,而不是XMLHTTPRequests
直接来自这里的情况.
对于任何未知数量的对象,我想要拦截并更改某些属性(如果需要)。我尝试过 getter 和 setter,但我只能实现接近我想要的目标,并且只能针对已知的对象。
以下是我想要实现的目标的示例:
在我的范围/闭包之外创建的对象
正如您所看到的,这些对象无法从外部访问,我想要做的是检查每个year_of_birth
属性,并在为任何未知对象创建或更改它时对其进行修改。我得到的最接近的是通过 getter/setter,但我必须传递对象,并且每次更改其值时它都会循环自身。
year_of_birth
尝试通过检查当前年份的年龄来纠正的示例
Object.defineProperty(unknown_object, 'year_of_birth', {
set: function(year) {
if (this.age && 2017 - this.age > year) {
this.year_of_birth = 2017 - this.age;
}
}
});
Run Code Online (Sandbox Code Playgroud)
或者
Object.defineProperty(unknown_object, 'year_of_birth', {
get: function(year) {
if (this.age && 2017 - this.age > year) {
return 2017 - this.age;
}
}
});
Run Code Online (Sandbox Code Playgroud)
但仍然不能很好地工作,并且只适用于我可以直接访问的单一对象。
有什么办法可以做到这一点吗?请不要使用像 jQuery 这样的库/框架的解决方案。
编辑:片段示例,因为上面不够清楚:
Object.defineProperty(unknown_object, 'year_of_birth', {
set: function(year) {
if (this.age && 2017 - this.age > year) {
this.year_of_birth = …
Run Code Online (Sandbox Code Playgroud)