2012-06-01 13 views
29

FormData non esiste in IE 8/9 ma ho bisogno di quella funzionalità in quei browser. C'è un bel ripiego per questo?Fallback per FormData in IE 8/9

Vorrei provare a inviare dati json, ma ho bisogno di passare un file al server. Aggiungo questo file allo formData nei browser moderni e inviamo semplicemente una richiesta XHR. Perché FormData non esiste in IE 8/9 questo ovviamente fallisce.

// I cant seem to get this to work with a file. 
$.ajax({ 
    url: '/genericHandlers/UploadDocsFile.ashx', 
    type: "POST", 
    data: model.toJSON(), 
    contentType: 'application/json' 
    }).done(function (data) { 
     log('stuff happened!'); 
    }); 

Forse un'alternativa è creare un oggetto modulo falso in js quindi aggiungere i dati a tale?

+5

amerebbe un polyfill per la finestra Metodo .FormData. –

+0

Quindi vi presento un nuovo FormData [polyfill] (https://github.com/jimmywarting/FormData/) Dipende ancora dalla costruzione di BLOB sfortunatamente ... Forse potete usare anche questo: [Blob.js] (https: //github.com/eligrey/Blob.js). Per leggere un file è necessario il flash – Endless

risposta

8

Conosco solo una possibile soluzione, ma non è realmente una soluzione di sicurezza 1-1 per IE. Non ci sono API di comunicazione possibili per l'invio di file, perché non è possibile associare campi di input nei vecchi browser, come in quelli moderni con FormData. Ma puoi inviare l'intero modulo usando un iframe. In questo caso è possibile utilizzare il plug-in jquery.form che supporta XHR DataForm e iframe (i dati vengono inviati con iframe quando il browser non supporta l'API FormData).

4

È possibile inviare il file manualmente utilizzando XMLHttpRequests, ci sono molte informazioni su questo here.

Si potrebbe verificare se il browser può utilizzare l'oggetto FormData prima con:

if(typeof FormData !== 'undefined') 
    ... 

MDN ha un this function che è possibile modificare per il fallback:

var XHR = new XMLHttpRequest(); 
var urlEncodedData = ""; 
var urlEncodedDataPairs = []; 
var name; 

// We turn the data object into an array of URL encoded key value pairs. 
for(name in data) { 
    urlEncodedDataPairs.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name])); 
} 

// We combine the pairs into a single string and replace all encoded spaces to 
// the plus character to match the behaviour of the web browser form submit. 
urlEncodedData = urlEncodedDataPairs.join('&').replace(/%20/g, '+'); 
+3

@Karson Realmente? Come per https://en.wikipedia.org/wiki/XMLHttpRequest#History_and_support Microsoft ha aggiunto l'identificatore di oggetto XMLHttpRequest ai suoi linguaggi di scripting in Internet Explorer 7.0 rilasciato nell'ottobre 2006. –

+1

Il concetto può essere applicato a IE 5 e 6 con ActiveXObjects se davvero voluto pure –