Як запустити подію, коли iframe завершив завантаження в jQuery?


95

Я повинен завантажити PDF-файл на сторінці.

В ідеалі я хотів би мати завантажувальний анімований gif, який замінюється після завантаження PDF.

Відповіді:


38

Я майже впевнений, що цього зробити неможливо.

Майже що завгодно, окрім PDF-файлів, навіть Flash. (Протестовано на Safari, Firefox 3, IE 7)

Дуже погано.


FWIW, усі вони (навіть PDF) працювали у мене з Chrome на OS X.
pkaeding

Так, це працює в Chrome, але не в IE. Якщо додаток є в Інтернеті, він також повинен працювати в IE.
Роберт Сміт

214

Ти намагався:

$("#iFrameId").on("load", function () {
    // do something once the iframe is loaded
});

19
+1, оскільки, хоча це, здається, не працює для завантаження PDF-файлу в iframe, це корисно для інших типів вмісту.
Кори Хаус

3
+1 Не зовсім те, що хотів знати оригінальний автор запиту (стосовно pdf), але ця відповідь відповідає питанню "Як запустити подію, коли iframe закінчив завантаження в jQuery?" . Дякую
Харві Дарві,

Ще не пробував цього з PDF-файлами, але він буде чудово працювати для звичайних URL-адрес.
Bob-ob

Я використовую це всередині, $(function({})щоб кадр завантажувався першим. Але я не отримую сподіваного результату. Chrome 25 Mac
Вільям Ентрікен

Це не працює для завантаження pdf в iframe. Перевірено в IE 11.
Роберт Сміт

7

Це зробило це для мене (не PDF, а інший " onloadстійкий" вміст):

<iframe id="frameid" src="page.aspx"></iframe>
<script language="javascript">
    iframe = document.getElementById("frameid");

    WaitForIFrame();

    function WaitForIFrame() {
        if (iframe.readyState != "complete") {
            setTimeout("WaitForIFrame();", 200);
        } else {
            done();
        }
    }

    function done() {
        //some code after iframe has been loaded
    }
</script>  

Сподіваюся, це допомагає.


7
Слід уникати аргументу рядка setTimeout ():setTimeout(WaitForIFrame, 200);
Стефан Маєвський

7

Я намагаюся це, і, здається, працює на мене: http://jsfiddle.net/aamir/BXe8C/

Більший PDF-файл: http://jsfiddle.net/aamir/BXe8C/1/


1
Не дуже відрізняється від відповіді @travis, але я буду оцінювати +1 завдяки елегантному використанню attr src change та css. Я бачу, що хтось принаймні підробляє симпатичний навантажувач, що робить це так.
Anthony Hatzopoulos

Подія завантаження спрацювала до повного завантаження PDF-файлу.
etlds

Перевірив ваші посилання на OSX з останньою версією Chrome та при завантаженні першої сторінки, це не спрацювало, зберігалося, Loading PDF...але коли я оновив сторінку, сказав PDF Loaded!. Але це, здається, працює з URL-адресами :), тому мені це дуже корисно. Дякую!
GabLeRoux

Це не працює, якщо файл налаштовано на завантаження, а не на відображення в iframe.
Дзвінок

Це не працює в IE 11. Зберігає "Завантаження PDF ...". Я шукаю рішення, яке також працює в IE 11.
Марк

6
$("#iFrameId").ready(function (){
    // do something once the iframe is loaded
});

ви пробували. вже замість цього?


Цей метод не працюватиме належним чином. З документів JQuery: "Метод .ready () можна викликати лише в об'єкті jQuery, що відповідає поточному документу, тому селектор можна опустити." Здається, він буде запущений після $ (документ) незалежно від використовуваного селектора.
Казума Нії Кавалканті

Я досить впевнений, що це теорія простою.
Барні,

Повторіть попередню відповідь!
SyntaxRules

Як заявляли інші, я тестував це, і це не спрацювало. Готовий був викликаний для документа готовий, а не iframe ... Використовуйте параметр On Load.
Грег

5

Я спробував нестандартний підхід до цього, я не перевіряв це для вмісту PDF, але він працював для звичайного вмісту на основі HTML, ось як:

Крок 1 : Оберніть ваш Iframe в обгортку div

Крок 2 : Додайте фонове зображення до обгортки div:

.wrapperdiv{
  background-image:url(img/loading.gif);
  background-repeat:no-repeat;
  background-position:center center; /*Can place your loader where ever you like */
}

Крок 3 : додайте в тег iframe ur ALLOWTRANSPARENCY="false"

Ідея полягає в тому, щоб показати анімацію завантаження в обгортці div, доки iframe не завантажиться після того, як iframe завантажить анімацію завантаження.

Спробувати.


4

Використання як jquery Load, так і Ready, здавалося, не відповідало справді, коли iframe був ІСТИННО готовим.

У підсумку я зробив щось подібне

$('#iframe').ready(function () {
    $("#loader").fadeOut(2500, function (sender) {
        $(sender).remove();
    });
});

Де #loader - це абсолютно позиціонований div над вершиною iframe із зображенням обертання.


2

@Alex aw, це облом. Що, якби у вас у iframeвас був HTML-документ, який виглядав так:

<html>
  <head>
    <meta http-equiv="refresh" content="0;url=/pdfs/somepdf.pdf" />
  </head>
  <body>
  </body>
</html>

Безумовно, хак, але це може працювати для Firefox. Хоча мені цікаво, чи не запуститься подія навантаження в такому випадку занадто рано.


ось що я шукаю :(
Aamir Afridi

1

Мені довелося показати завантажувач, поки завантажується pdf в iFrame, так що я придумав:

    loader({href:'loader.gif', onComplete: function(){
            $('#pd').html('<iframe onLoad="loader.close();" src="pdf" width="720px" height="600px" >Please wait... your report is loading..</iframe>');
    }
    });

Я показую навантажувач. Після того, як я впевнений, що клієнт може побачити мій завантажувач, я закликаю метод навантажувачівCompllet, який завантажує iframe. Iframe має подію "onLoad". Після завантаження PDF він запускає подію onloat, де я приховую завантажувач :)

Важлива частина:

iFrame має подію "onLoad", де ви можете робити те, що вам потрібно (приховувати завантажувачі тощо)


0

Ось що я роблю для будь-якої дії, і це працює у Firefox, IE, Opera та Safari.

<script type="text/javascript">
  $(document).ready(function(){
    doMethod();
  });
  function actionIframe(iframe)
  {
    ... do what ever ...
  }
  function doMethod()
  {   
    var iFrames = document.getElementsByTagName('iframe');

    // what ever action you want.
    function iAction()
    {
      // Iterate through all iframes in the page.
      for (var i = 0, j = iFrames.length; i < j; i++)
      {
        actionIframe(iFrames[i]);
      }
    }

    // Check if browser is Safari or Opera.
    if ($.browser.safari || $.browser.opera)
    {
      // Start timer when loaded.
      $('iframe').load(function()
      {
        setTimeout(iAction, 0);
      }
      );

      // Safari and Opera need something to force a load.
      for (var i = 0, j = iFrames.length; i < j; i++)
      {
         var iSource = iFrames[i].src;
         iFrames[i].src = '';
         iFrames[i].src = iSource;
      }
    }
    else
    {
      // For other good browsers.
      $('iframe').load(function()
      {
        actionIframe(this);
      }
      );
    }
  }
</script>

0

Якщо ви можете очікувати, що інтерфейс відкритого / збереженого браузера з’явиться для користувача після завершення завантаження, тоді ви можете запустити це, починаючи завантаження:

$( document ).blur( function () {
    // Your code here...
});

Коли діалог з’явиться у верхній частині сторінки, спрацює подія розмиття.


0

Оскільки після завантаження pdf-файлу документ iframe матиме новий елемент DOM <embed/>, тому ми можемо зробити перевірку так:

    window.onload = function () {


    //creating an iframe element
    var ifr = document.createElement('iframe');
    document.body.appendChild(ifr);

    // making the iframe fill the viewport
    ifr.width  = '100%';
    ifr.height = window.innerHeight;

    // continuously checking to see if the pdf file has been loaded
     self.interval = setInterval(function () {
        if (ifr && ifr.contentDocument && ifr.contentDocument.readyState === 'complete' && ifr.contentDocument.embeds && ifr.contentDocument.embeds.length > 0) {
            clearInterval(self.interval);

            console.log("loaded");
            //You can do print here: ifr.contentWindow.print();
        }
    }, 100); 

    ifr.src = src;
}

0

Рішення, яке я застосував до цієї ситуації, полягає у простому розміщенні зображення абсолютного завантаження в DOM, яке буде покрито шаром iframe після завантаження iframe.

Z-індекс iframe повинен бути (z-індекс завантаження + 1) або просто вищим.

Наприклад:

.loading-image { position: absolute; z-index: 0; }
.iframe-element { position: relative; z-index: 1; }

Сподіваюся, це допоможе, якщо жодне рішення javaScript не зробило. Я думаю, що CSS - найкраща практика для таких ситуацій.

З найкращими побажаннями.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.