jQuery $ .ajax或$ .load是否允许responseType arrayBuffer?

我开始使用Web Audio API,只是想知道是否可以使用jQuery的$ .ajax或$ .load函数来生成接收音频数据的XMLHttpRequest。 $ .ajax或$ .load是否支持responseType = arrayBuffer?

编辑:

好的,所以这就是我到目前为止所拥有的:

function loadAudio() { $.ajax({ url: sourceUrl }).done(function(response){ return response; }) } 

但我需要返回一个ArrayBuffer。 那么如何将响应转换为ArrayBuffer?

关于你的问题,似乎jQuery还不支持它。 在我按照下面的建议使用它之前,请考虑检查function是否可用。

使用XHTMLRequest,您可以欺骗服务器并接收表示您希望从服务器获得的字节的二进制字符串。 它完美地运作。

 var xhr = new XMLHttpRequest(); xhr.open('GET', '/your/audio/file.wav', true); // Here is the hack xhr.overrideMimeType('text/plain; charset=x-user-defined'); xhr.onreadystatechange = function(event) { if ( this.readyState == 4 && this.status == 200 ) { var binaryString = this.responseText; for (var i = 0, len = binaryString.length; i < len; ++i) { var c = binaryString.charCodeAt(i); var byte = c & 0xff; //it gives you the byte at i //Do your cool stuff... } } }; xhr.send(); 

它很有用,很常见......但是......它仍然是一个黑客。

使用XHTML请求级别2,您可以将responseType指定为'arraybuffer'并实际接收ArrayBuffer。 它更好。 问题是检查您的浏览器是否支持此function。

 var xhr = new XMLHttpRequest(); xhr.open('GET', '/your/audio/file.wav', true); xhr.responseType = 'arraybuffer'; xhr.onload = function(e) { if (this.status == 200) { //Do your stuff here } }; xhr.send(); 

希望我帮忙。

我使用ajax get json从服务器获取数据作为字符串(base64编码为字符串)然后在客户端我将其解码为base64然后再解码到数组缓冲区。

示例代码

 function solution1(base64Data) { var arrBuffer = base64ToArrayBuffer(base64Data); // It is necessary to create a new blob object with mime-type explicitly set // otherwise only Chrome works like it should var newBlob = new Blob([arrBuffer], { type: "application/pdf" }); // IE doesn't allow using a blob object directly as link href // instead it is necessary to use msSaveOrOpenBlob if (window.navigator && window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(newBlob); return; } // For other browsers: // Create a link pointing to the ObjectURL containing the blob. var data = window.URL.createObjectURL(newBlob); var link = document.createElement('a'); document.body.appendChild(link); //required in FF, optional for Chrome link.href = data; link.download = "file.pdf"; link.click(); window.URL.revokeObjectURL(data); link.remove(); 

}

 function base64ToArrayBuffer(data) { var binaryString = window.atob(data); var binaryLen = binaryString.length; var bytes = new Uint8Array(binaryLen); for (var i = 0; i < binaryLen; i++) { var ascii = binaryString.charCodeAt(i); bytes[i] = ascii; } return bytes; 

};