javascript - sexualmente - Establecer XMLHttpRequest.responseType prohibido de repente?
señales de infidelidad en el matrimonio (2)
Este es el comportamiento correcto, tal como se define en la Especificación de XMLHttpRequest :
Cuando se establece: lanza una excepción
"InvalidAccessError"
si se establece el indicador síncrono y hay un documento XMLHttpRequest asociado.
La propiedad responseType
no puede establecerse cuando XMLHttpRequest
no es asincrónico, es decir, sincrónico. Establecer el tercer parámetro de open
en false
hace que la solicitud sea sincrónica .
He estado utilizando XMLHttpRequest sincrónico con responseType establecido en "arraybuffer" durante bastante tiempo para cargar un archivo binario y esperar hasta que se cargue. Hoy recibí este error: "Die Verwendung des responseType-Attributes von XMLHttpRequest wird im synchronen Modus im window-Kontekt nicht mehr unterstützt." que más o menos se traduce en "Uso de responseType for XMLHttpRequest en modo síncrono en window-context (?) ya no es compatible".
¿Alguien sabe cómo arreglar esto? Realmente no quiero usar una solicitud asincrónica para algo como esto.
var xhr = new XMLHttpRequest();
xhr.open(''GET'', url, false);
xhr.responseType = ''arraybuffer'';
Funciona bien en cromo.
Solución
Para el lector casual, si aún necesita el comportamiento sincrónico, puede descargar su contenido como una cadena y luego convertirlo a datos de bytes
NO UN:
Esta solución supone la request.response
original. La request.response
es un texto ASCII
.
Si esta suposición no se ajusta a su caso de uso específico, consulte jBinary .
Lo convierto en un 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;
}
Más lectura
- jBinary : API de alto nivel para trabajar con datos binarios en Javascript.
- Envío y recepción de datos binarios : manejo de datos binarios con Javascript vano. ( Fuente: Red de desarrolladores de Mozilla)
Referencias
- Conversión entre cadenas y ArrayBuffers
- La función original de Renato Mangini str2ab
- Conversión de cadenas de ArrayBuffer <-> más fácil con la API de codificación (Jeff Posnik)