Подтвердить что ты не робот

Iframe.readyState не работает в хроме

Я создаю iframe на лету и устанавливаю в качестве URL-страницы страницу, загружающую двоичный файл (xls, doc...). Пока файлы загружаются, я показываю анимацию. Когда этого не происходит, я скрываю это.

Проблема заключается в том, что Chrome не знает, когда файлы будут полностью загружены, то есть когда полностью загружен iframe. Я использую свойство iframe readyState для проверки состояния iframe:

var iframe = document.createElement("iframe");
iframe.style.visibility = "hidden";
// I start a progress animation
window.setTimeout(showProgressAnimation, 1000);
// I start the file download
iframe.src ='GetFile.aspx?file=' + fileName;
document.body.appendChild(iframe);


function showProgressAnimation() {
   if (iframe.readyState == "complete" || iframe.readyState == "interactive") {
      // I stop the animation and show the page
      animation.style.display = 'none';
      progressBar.hide();
      $('#page').show();
   }
   else {
      // Chrome is always getting into this line
      window.setTimeout(showProgressAnimation, 1000);
   }
}

Таким образом, результат представляет собой бесконечный цикл.

Я пробовал следующее и работает в Firefox и Chrome , но не, когда содержимое является двоичным файлом:

if ($.browser.mozilla || $.browser.webkit ) {
    iframe.onload = function showProgressAnimation() {
        animation.style.display = 'none';
        progressBar.hide();
        $('#page').show();
    }
}
// IE
else{
     window.setTimeout(showProgressAnimation, 1000);
}
4b9b3361

Ответ 1

Вы можете использовать onload для сигнализации нагрузки iframe

вот простой пример:

var iframe = document.createElement("iframe");
iframe.style.display = "none";
// this function will called when the iframe loaded
iframe.onload = function (){
  iframe.style.display = "block";    
  alert("loaded");
};
// set the src last.
iframe.src ='http://www.test.com';

// add it to the page.
document.getElementById("one").appendChild(iframe);

Протестировано здесь:
http://jsfiddle.net/48MQW/5/
С src загружено последним.
http://jsfiddle.net/48MQW/24/

Ответ 2

Загружаемое содержимое файла не запускает обработчик события readystatechange или обработчик события onload. Этот couse вы можете установить cookie на стороне сервера вместе с содержимым файла, а клиентская сторона периодически проверяет этот файл cookie. Например:

Сервер

response.cookie('fileDownloaded','true');
response.header('attachment','your-file-name.any');
//...write bytes to response...

клиент

var checker = setInterval(()=>{
    if(document.cookie.indexOf('fileDownloaded')>-1){
        alert('done');
        clearInterval(checker);
    }
},100);

Конечно, вы можете использовать свою фреймворк, чтобы правильно проверить значение cookie, это всего лишь poc, а не безопасный парсер cookie.

Ответ 3

Пожалуйста, попробуйте это - вы действительно смешиваете dom и jQuery от строки к строке

var tId;

function stopAnim() {
    // I stop the animation and show the page
    animation.hide();
    progressBar.hide();
    $('#page').show();
    clearInterval(tId);
}
var iframe = $("<iframe />");
iframe.css("visibility","hidden");

iframe.on("readystatechange",function() {
 if (this.readyState == "complete" || this.readyState == "interactive") {
   stopAnim();
 }
});
iframe.on("load",function() { // can possibly be deleted
 if (tId) {
   stopAnim();
 }
});

iframe.attr("src","GetFile.aspx?file=" + fileName);
$("body").append(iframe);
tId = setInterval(function() {
  // update progress here
}, 1000); //