Supposons que nous ayons le fichier HTML suivant:
<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>
5 Réponses :
Vous avez peut-être besoin d'aide de jQuery pour cela, par exemple, vous pouvez le faire:
$.get('http://example.com/dload.py',{},function(result){ $('alert_span').html(result);//or some content });
Non, cela ne fonctionnera pas. Un appel asynchrone permettra de sauvegarder la valeur renvoyée dans la variable de résultat et de la transmettre à la fonction de rappel, au lieu d'ouvrir une boîte de dialogue Enregistrer.
J'ai rencontré le même problème que ceci: Voici mon travail, s'il vous plaît voir si cela fonctionne pour vous:
<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>
Très intelligent! Merci. Cela ne fonctionne pas en chrome, mais au moins dans Firefox, cela fonctionne et fonctionne plusieurs fois, car chaque fois qu'il est en fait une nouvelle iframe qui déclenche l'événement surload, puisque vous écrasez InnerhTML.
Je suis heureux que cela fonctionnait pour vous, je ne l'ai pas testé sur Chrome.
Cela semblait travailler pour un problème similaire que j'ai eu - tant que Firebug fonctionnait. Quand j'ai essayé dans Firefox 2 ou 3 sans Firebug, tout à coup, le surcharge ne tiendrait pas. Quelqu'un sache où est la différence?
Ne fonctionne pas dans chrome: Stackoverflow .com / questions / 13952942 / ...
J'ai le même problème, le chargement du chargement n'est que du feu lorsque le contenu change. Si vous téléchargez un fichier. Si vous supprimez l'en-tête HTTP pour imprimer le contenu du fichier sur iframe, le surloge est correctement incendie. P>
Comment puis-je supprimer les en-têtes HTTP et pouvoir télécharger le fichier dans le navigateur Web?
Ma solution Après de nombreuses approches différentes pour que cela fonctionne sur FF, c'est-à-dire que Safari et Chrome n'avait pas de téléchargement en 2 étapes. p>
La demande JS d'origine de créer un IFrame charge un SRC qui aurait normalement chargé le PDF. Cependant, la SRC charge maintenant une page avec un autre iframe à l'intérieur, ce qui contient maintenant l'URL du PDF. Dans la réponse HTML, je déclenche le surcharge et aussi un funciton SetToutes de Catchall qui appelle ma réponse sur la fenêtre.parent.window.handlerfunction que mon onload sur l'iframe supérieur aurait été. Le résultat est un téléchargement PDF et une gâchette sur le parent de niveau supérieur de la fonction de gestionnaire qui fonctionne à travers les navigateurs car elle ne s'appuie plus sur la détection d'une charge iframe réelle, mais s'appuie plutôt sur les relations avec les fenêtres parent / enfant prises en charge. p>
J'espère que cela aide quelqu'un qui a également été coincé p>
Cela détecte lorsque le HTML HTML extérieur-iframe est évidemment. Il ne détecte pas réellement le téléchargement de fichier PDF. (Bien que je suppose que cela vous donne la possibilité de vérifier que le PDF demandé existe, dans le script de serveur d'iframe externe).
Vous pouvez vérifier la propriété Iframe ReadyState à plusieurs reprises après des intervalles de temps courts jusqu'à ce qu'il soit terminé.
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); }
J'ai le téléchargement de la base PHP et après la première flush, les données sont envoyées au navigateur et que l'état est marqué comme complet, même si le téléchargement est toujours en cours.
Vous pouvez essayer d'extraire le fichier à l'aide d'AJAX, puis créez la balise
A code> (lien) avec Data Uri et cliquez dessus, mais je ne l'ai pas testé avec de gros fichiers.