2012-06-01 23 views
29

FormData no existe en IE 8/9 pero necesito esa funcionalidad en esos navegadores. ¿Hay una buena alternativa para esto?Fallback para FormData en IE 8/9

Intentaré enviar datos JSON, pero necesito pasar un archivo al servidor. Añado este archivo al formData en los navegadores modernos y solo presento una solicitud XHR. Como FormData no existe en IE 8/9, esto obviamente falla.

// 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!'); 
    }); 

¿Quizás una alternativa sea crear un objeto de formulario falso en js y luego anexar los datos a eso?

+5

amaría a una polyfill para la ventana Método .FormData. –

+0

Luego te presento un nuevo FormData [polyfill] (https://github.com/jimmywarting/FormData/) Todavía dependo de la construcción de blobs desafortunadamente ... Tal vez también puedas usar esto: [Blob.js] (https: //github.com/eligrey/Blob.js). Para leer un archivo necesitarás flash – Endless

Respuesta

8

Conozco solo una posible solución, pero en realidad no es un repliegue de 1-1 para IEs. No hay una API de comunicación posible para enviar archivos, porque no puede enlazar campos de entrada en navegadores antiguos, como en los modernos que usan FormData. Pero puede enviar formularios completos utilizando un iframe. Para este caso, puede usar el complemento jquery.form que admite XHR DataForm e iframe (los envíos de datos con iframe cuando el navegador no admite la API de FormData).

4

Puede enviar el archivo manualmente usando XMLHttpRequests, hay mucha información en este here.

Se podría comprobar si el navegador puede utilizar el objeto FormData primero con:

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

MDN tiene un this function que se podría modificar para el retorno:

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 Really? Según https://en.wikipedia.org/wiki/XMLHttpRequest#History_and_support Microsoft agregó el identificador de objeto XMLHttpRequest a sus lenguajes de scripting en Internet Explorer 7.0 lanzado en octubre de 2006. –

+1

El concepto se puede aplicar a IE 5 y 6 con ActiveXObjects si realmente quería también –