Avete fatto venire la curiosità anche a me… Provate un po' con questo codice:
codice:
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Upload via ajax</title>
<script type="text/javascript">
function switchXHRState () {
switch (this.readyState) {
case 0: console.log("open() has not been called yet."); break;
case 1: console.log("send() has not been called yet."); break;
case 2: console.log("send() has been called, headers and status are available."); break;
case 3: console.log("Downloading, responseText holds the partial data."); break;
case 4: console.log("Complete!"); alert(this.responseText);
}
}
function ajaxPost (oForm) {
if (!window.FormData) { return true; }
var oReq = new XMLHttpRequest();
// Upload via ajax supportato; tolgo ?noajax=1 dall'attributo action
oReq.open("POST", oForm.getAttribute("action").replace(/\?.*$/, ""), true);
oReq.onreadystatechange = switchXHRState;
oReq.send(new FormData(oForm));
return false;
}
</script>
</head>
<body>
<form name="mioForm" action="invio.php?noajax=1" target="_blank" method="post" enctype="multipart/form-data" onsubmit="return ajaxPost(this);">
<input type="file" name="mioFile" />
<input type="text" name="mioText" value="testo di prova">
<input type="submit" value="Invia"></p>
</form>
</body>
</html>
Il nodo centrale della questione è il costruttore FormData, che dovrebbe funzionare su IE a partire dalla versione 10. Il resto è comunissimo javascript...
In ogni caso lo script è costruito in maniera tale che se FormData non è supportato viene aggiunta la stringa "?noajax=1" all'action del form e questo viene inviato comunque in una nuova finestra/scheda (di modo da consentire comunque di non abbandonare la pagina).