2009-10-06 12 views
10

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.

+0

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

Respuesta

1

me he encontrado con el mismo problema que esto: Aquí está mi solución alternativa, por favor ver si funciona para usted:

<script> 
function download(){ 
    var url = 'http://example.com/dload.py'; 
    var htm = '<iframe src="' + url +'" onload="downloadComplete()"></iframe>'; 
    document.getElementById('frameDiv').innerHTML = htm; 
} 
</script> 

<div style="display:none" id="frameDiv"> 
</div> 
<button onclick="download()">download file</button> 

Hasta donde puedo recordar el evento de carga de iframe se dispara solo una vez. Establecer otro valor para el atributo src no provocará que el evento onload vuelva a activarse.

+0

¡Muy inteligente! Gracias. No funciona en Chrome, pero al menos funciona en Firefox y funciona varias veces, ya que cada vez que se trata de un nuevo iframe dispara el evento onload, ya que sobrescribe innerHTML. – dpq

+0

Me alegro de que funcione para usted, aunque no lo he probado en Chrome. – jerjer

+0

Esto parecía funcionar para un problema similar al que tenía, siempre y cuando Firebug se estuviera ejecutando. Cuando probé en Firefox 2 o 3 sin Firebug, de repente la carga no se disparaba.Alguien sabe donde esta la diferencia? – justkt

-1

Es posible que necesite ayuda de jQuery para esto, por ejemplo, usted puede hacer esto:

$.get('http://example.com/dload.py',{},function(result){ 
    $('alert_span').html(result);//or some content 
}); 
+3

No, esto no funcionará. Una llamada asincrónica guardará el valor devuelto en la variable de resultado y lo pasará a la función de devolución de llamada, en lugar de abrir un cuadro de diálogo de guardar. – dpq

0

Tengo el mismo problema, el controlador onLoad solo se activa cuando cambia el contenido. Si descargas un archivo Si elimina el encabezado HTTP para imprimir el contenido del archivo en iframe, la carga se iniciará correctamente.

+1

¿Cómo puedo eliminar encabezados HTTP y poder descargar el archivo dentro del navegador web? – anmarti

1

Mi solución después de muchos enfoques diferentes para hacer que esto funcionara a través de Safari y Chrome no era tener una descarga de 2 pasos.

la solicitud JS original para crear un iframe carga un src que normalmente habría cargado el pdf Sin embargo, el src ahora carga una página con otro iframe dentro de él, que ahora contiene la url del pdf. en la respuesta html desencadené la carga y también un conjunto de caracteres setTimeout funciton que llama mi respuesta en window.parent.window.handlerfunction que mi onload en el iframe superior habría sido. El resultado es una descarga de PDF y un desencadenante en el nivel superior principal de la función de controlador que funciona en todos los navegadores, ya que no depende de la detección de una carga de iframe real, sino que depende de las relaciones de ventana principal/secundaria compatibles.

esperanza esto ayuda a alguien que también fue atrapado

0

Puede comprobar la propiedad iframe readyState repetidamente después de cortos intervalos de tiempo hasta que se completó.

function iframe_onload(iframe_id, js) { 
    var iframe = document.getElementById(iframe_id); 
    var iframeDoc = iframe.contentDocument || iframe.contentWindow.document; 

    if (iframeDoc.readyState == 'complete') { 
     eval(js) 
     return; 
    } 

    window.setTimeout('iframe_onload("' + iframe_id + '",`' + js + '`);', 100); 
} 
+0

Tengo descarga base php y después de la primera descarga los datos se envían al navegador y el estado se marca como completo incluso si la descarga aún está en progreso. – jcubic

Cuestiones relacionadas