2016-11-11 3 views
0

Я пытаюсь загрузить двоичные данные асинхронно в браузере:Почему событие load вызвано с объектом ProgressEvent?

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.

Это нормально? Я использую хром и читаю документы на MDN: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest

Почему документы неправильные? Это должно пропускать события прогресса, нет?

ответ

1

Документы не ошибаются, и вы тоже не являетесь. Объектом ответа является событие ProgressEvent из события load. Чтобы получить доступ к ответу, вам нужно указать на исходный запрос (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 установлен ни на что иное, кроме пустой строки или «текст», доступ к responseText вызовет исключение InvalidStateError.

От https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseText

0

req.onload предназначен для обработки ответа, в то время как req.addEventListener("load", ... предназначен для мониторинга прогресса, как указано в документации.

+0

Спасибо. Из MDN: 'oReq.addEventListener (« load », transferComplete); это немного вводит в заблуждение. –

+0

Согласитесь - название этого раздела - «Мониторинг прогресса». – skav

+1

Да, я понял, что ты это сказал. Я думал, что addEventListener был более новым (и предпочтительным способом) и что событие загрузки заменяет обработчик onload в новой структуре. Но что бы это ни было сейчас. Благодарю. –

Смежные вопросы