我正在尝试在浏览器中异步加载二进制数据:
var req = new XMLHttpRequest();
req.open("GET", "test.bin");
req.responseType = "arraybuffer";
req.addEventListener("load", function(res) {
var arrayBuffer = res.response; // Note: not oReq.responseText
...
但是被触发的加载事件的res
对象是ProgressEvent
。
这是正常的吗?我正在使用chrome并在MDN上阅读文档: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest
为什么文档错了?这应该跳过进度事件,不是吗?
答案 0 :(得分:1)
文档没有错,你也不是。响应对象是load
事件的ProgressEvent。为了获得对响应的访问权限,您需要在您的案例中指回原始请求(req
)。
var req = new XMLHttpRequest();
req.open("GET", "test.bin");
req.responseType = "arraybuffer";
req.addEventListener('load', function(progress) {
var arrayBuffer = req.response;
});
ProgressEvent还可以通过currentTarget
访问来源。例如:
req.addEventListener("load", function(progress) {
var arrayBuffer = res.currentTarget.response
});
这是一个小提琴:https://jsfiddle.net/08zm9urL/1/
同时注意:
responseText
为responseType
时,您无法访问arraybuffer
。它必须是空字符串或text
。
如果responseType设置为空字符串或" text"以外的任何内容,则访问responseText将引发InvalidStateError异常。
来自https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseText
答案 1 :(得分:0)
req.onload
用于处理响应,req.addEventListener("load", ...
用于监控进度,如文档中所述。