Supongamos que tenemos el siguiente archivo HTML:Cómo desencadenar un evento de carga al descargar un archivo en un iframe?
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test iframe download</title>
<script type="text/javascript">
var init = 0;
function download() {
document.getElementById("dload_frame").src = "http://example.com/dload.py";
}
function alert() {
if (init == 0) {
init = 1;
}
else {
document.getElementById("alert_span").innerHTML = "Got it!";
}
}
</script>
</head>
<body>
<span id="alert_span">Main content.</span><br/>
<input type="button" value="Download" id="btn" onclick="download()" />
<iframe id="dload_frame" src="http://404.com/404" onload="alert()"> </iframe>
</body>
</html>
Ahora bien, si la URL a la que de src iframe se escriben de nuevo (en este caso - "http://example.com/dload.py") devuelve HTML, no hay problema: se activa el evento onload, los contenidos del tramo son reemplazados, todos están felices.
Sin embargo, si el tipo de contenido del archivo devuelto por la URL se establece en algo que obliga al navegador a abrir el diálogo de guardar archivo, el evento de carga del iframe nunca se dispara.
¿Hay alguna solución? No es necesario utilizar iframes, el comportamiento deseado es iniciar una devolución de llamada una vez que el navegador comienza a descargar el archivo suministrado.
Puede intentar buscar el archivo utilizando ajax y luego crear la etiqueta 'a' (enlace) con el URI de datos y hacer clic en él, pero no lo probé con archivos grandes. – jcubic