-
-
Save SaneMethod/7548768 to your computer and use it in GitHub Desktop.
| (function($){ | |
| /** | |
| * Register ajax transports for blob send/recieve and array buffer send/receive via XMLHttpRequest Level 2 | |
| * within the comfortable framework of the jquery ajax request, with full support for promises. | |
| * | |
| * Notice the +* in the dataType string? The + indicates we want this transport to be prepended to the list | |
| * of potential transports (so it gets first dibs if the request passes the conditions within to provide the | |
| * ajax transport, preventing the standard transport from hogging the request), and the * indicates that | |
| * potentially any request with any dataType might want to use the transports provided herein. | |
| * | |
| * Remember to specify 'processData:false' in the ajax options when attempting to send a blob or arraybuffer - | |
| * otherwise jquery will try (and fail) to convert the blob or buffer into a query string. | |
| * | |
| * This revision now includes sending headers, resolves the stack overflow in abort(), and sets the status text | |
| * into the response if the request is unsuccessful. | |
| */ | |
| $.ajaxTransport("+*", function(options, originalOptions, jqXHR){ | |
| // Test for the conditions that mean we can/want to send/receive blobs or arraybuffers - we need XMLHttpRequest | |
| // level 2 (so feature-detect against window.FormData), feature detect against window.Blob or window.ArrayBuffer, | |
| // and then check to see if the dataType is blob/arraybuffer or the data itself is a Blob/ArrayBuffer | |
| if (window.FormData && ((options.dataType && (options.dataType == 'blob' || options.dataType == 'arraybuffer')) | |
| || (options.data && ((window.Blob && options.data instanceof Blob) | |
| || (window.ArrayBuffer && options.data instanceof ArrayBuffer))) | |
| )) | |
| { | |
| var xhr; | |
| return { | |
| /** | |
| * Return a transport capable of sending and/or receiving blobs - in this case, we instantiate | |
| * a new XMLHttpRequest and use it to actually perform the request, and funnel the result back | |
| * into the jquery complete callback (such as the success function, done blocks, etc.) | |
| * | |
| * @param headers | |
| * @param completeCallback | |
| */ | |
| send: function(headers, completeCallback){ | |
| var url = options.url || window.location.href, | |
| type = options.type || 'GET', | |
| dataType = options.dataType || 'text', | |
| data = options.data || null, | |
| async = options.async || true; | |
| xhr = new XMLHttpRequest(); | |
| xhr.addEventListener('load', function(){ | |
| var res = {}, | |
| success = xhr.status >= 200 && xhr.status < 300 || xhr.status === 304; | |
| if (success){ | |
| res[dataType] = xhr.response; | |
| } else { | |
| res.text = xhr.statusText; | |
| } | |
| completeCallback(xhr.status, xhr.statusText, res, xhr.getAllResponseHeaders()); | |
| }); | |
| xhr.open(type, url, async); | |
| xhr.responseType = dataType; | |
| for (var key in headers){ | |
| if (headers.hasOwnProperty(key)){ | |
| xhr.setRequestHeader(key, headers[key]); | |
| } | |
| } | |
| xhr.send(data); | |
| }, | |
| abort: function(){ | |
| if (xhr){ | |
| xhr.abort(); | |
| } | |
| } | |
| }; | |
| } | |
| }); | |
| })(jQuery); |
Hey @miguelcobain,
Does this send headers too? I don't see you using them anywhere.
No, it doesn’t. I’ve created a fork that does: https://gist.github.com/aaronk6/bff7cc600d863d31a7bf
Cheers!
Thanks a lot for the code!
Does this send headers too?
It does now.
👍
cool!
i try to use jQuery.ajaxSetup() to solve this issue, but fail.
thank you for your code~
Line 42:async = options.async || true;
async is true always without false, even though I set options.async = false.
This is wonderful. One suggestion: Add a link back to this page to the headnotes in the JS. That'll make it possible for folks to keep track of where they got it from if it ever had a bug or whatever.
Thanks so much for this! This solved a problem I was having where I wanted to download a PDF using the $.ajax method (POST request) and then add the resulting ArrayBuffer to a zip file using the JSZip library.
Hi.
Thanks a lot for the code!
Does this send headers too? I don't see you using them anywhere.
Thanks.