Załóżmy, że mamy następujący plik HTML:Jak wyzwalać zdarzenie onload podczas pobierania pliku w elemencie 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>
Teraz, jeśli adres URL, do którego iframe src jest przepisany do (w tym przypadku - „http://example.com/dload.py”) zwraca HTML, nie ma problemu: Zdarzenie onload, zawartość przęsła zostaje zastąpiona, wszyscy są szczęśliwi.
Jednakże, jeśli typ zawartości pliku zwróconym przez URL jest ustawiony na coś, co zmusza przeglądarkę, aby otworzyć okno dialogowe Zapisz plik, onload wydarzenie iframe nigdy nie odpala.
Czy istnieje sposób obejścia tego problemu? Korzystanie z elementów iframe nie jest konieczne, więc pożądanym zachowaniem jest uruchomienie wywołania zwrotnego po tym, jak przeglądarka rozpocznie pobieranie dostarczonego pliku.
Możesz spróbować pobrać plik za pomocą ajax, a następnie utworzyć tag (link) 'a' z identyfikatorem URI danych i kliknąć na nim, ale nie przetestowałem go z dużymi plikami. – jcubic