Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting XMLHttpRequest.responseType forbidden all of a sudden?

Tags:

I've been using synchronous XMLHttpRequest with responseType set to "arraybuffer" for quite a while to load a binary file and wait until it is loaded. Today, I got this error: "Die Verwendung des responseType-Attributes von XMLHttpRequest wird im synchronen Modus im window-Kontekt nicht mehr unterstützt." which roughly translates to "Usage of responseType for XMLHttpRequest in synchronous mode in window-context(?) no longer supported."

Does anyone know how to fix this? I realy don't want to use an asynchronous request for something like this.

var xhr = new XMLHttpRequest(); xhr.open('GET', url, false); xhr.responseType = 'arraybuffer'; 

Works fine in chrome.

like image 545
Markus Avatar asked Mar 24 '12 20:03

Markus


2 Answers

This is correct behaviour, as defined in the Specification of XMLHttpRequest:

When set: throws an "InvalidAccessError" exception if the synchronous flag is set and there is an associated XMLHttpRequest document.

The responseType property cannot be set when the XMLHttpRequest is not async, that is, synchronous. Setting the third parameter of open to false causes the request to be synchronous.

like image 88
Rob W Avatar answered Sep 30 '22 17:09

Rob W


Workaround

For the casual reader, if you still need the synchronous behavior, you can download your content as string and then convert it to byte data

NOTA:
This workaround assumes the original request.response is an ASCII text.
If this assumption doesn't fit your specific use case please see jBinary.

I convert it to an ArrayBuffer.

var request = new XMLHttpRequest(); request.open('GET', url, false); request.send(null);  var data; if (request.status === 200) {     data = stringToArrayBuffer(request.response); } else {     alert('Something bad happen!\n(' + request.status + ') ' + request.statusText); }  // ...  function stringToArrayBuffer(str) {     var buf = new ArrayBuffer(str.length);     var bufView = new Uint8Array(buf);      for (var i=0, strLen=str.length; i<strLen; i++) {         bufView[i] = str.charCodeAt(i);     }      return buf; } 

More reading

  • jBinary: High-level API for working with binary data in Javascript.
  • Sending and Receiving Binary Data: Binary data handling with vanilla Javascript. (Source: Mozilla Developer Network)

References

  • Converting between strings and ArrayBuffers
  • Renato Mangini's original function str2ab
  • Easier ArrayBuffer <-> String conversion with the Encoding API (Jeff Posnik)
like image 40
Stephan Avatar answered Sep 30 '22 17:09

Stephan