Як відобразити повідомлення про завантаження, коли завантажується iFrame?


107

У мене є iframe, який завантажує сторонній веб-сайт, який завантажується надзвичайно повільно.

Чи є спосіб я відобразити повідомлення про завантаження, якщо iframe завантажує користувача, не бачить великого порожнього простору?

PS. Зауважте, що кадр iframe призначений для веб-сайту третьої сторони, тому я не можу нічого змінювати / вводити на свою сторінку.


Так, я не знаю жодних зворотних викликів прогресу для iframes ... Хм.
Jeffrey Sweeney

Відповіді:


231

Я здійснив такий підхід css:

<div class="holds-the-iframe"><iframe here></iframe></div>

.holds-the-iframe {
  background:url(../images/loader.gif) center center no-repeat;
}

1
Це спрацювало ідеально для моїх справ. Один обраний відповідь не працював для мене, оскільки я завантажував iFrame лише тоді, коли натискали вкладку. Але ця відображається елегантно під час завантаження джерела iFrame. Але дуже погано, що це було обрано не як відповідь, тому що Джейкоб попросив рішення jQuery ...
dance2die

21
Це не працює добре, якщо рамка, яку ви завантажуєте, має прозорий фон. Ви все ще можете побачити gif завантаження після завантаження iframe!
Westy92

3
@Christna Цей трюк не працює для IE-11. Чи є хак?
mmuzahid

3
За допомогою функції завантаження iframe ви можете видалити фонове зображення CSS.
Гюго Кокс

1
Чудова відповідь. Це працює. Ви також краще додати трохи висоти, щоб навантажувач був легко видно.
Раз

33

Я думаю, що цей код допоможе:

JS:

$('#foo').ready(function () {
    $('#loadingMessage').css('display', 'none');
});
$('#foo').load(function () {
    $('#loadingMessage').css('display', 'none');
});

HTML:

<iframe src="http://google.com/" id="foo"></iframe>
<div id="loadingMessage">Loading...</div>

CSS:

#loadingMessage {
    width: 100%;
    height: 100%;
    z-index: 1000;
    background: #ccc;
    top: 0px;
    left: 0px;
    position: absolute;
}

Я розумію, чому ви ховаєтеся #loadingMessageпри loadпожежах, але чому це також ховаєте ready? Чи не так рано?
teedyay

1
Це залежить від потреб користувача. Якщо йому не потрібні всі зображення для завантаження, перш ніж він приховає повідомлення про завантаження, він не потребуватиме зворотного дзвінка при завантаженні.
Мінько Гечев

9
jquery не є "JS".
OZ_

5
@OZ_ не важко перетворити код вище в ванільний JavaScript з використанням addEventListenerі використання querySelector+ styles властивості :-). На додаток до цього, автор питання, позначеного тегом, є як jquery. Не можете зрозуміти, чому було ваше повідомлення? :-)
Мінько Гечев

17

Якщо ви тільки намагаєтесь домогтися місця, якого ви намагаєтеся досягти: шалений підхід - вводити текст у вигляді svg-фону. Це забезпечує деяку гнучкість, і з того, що я читав, підтримка браузера повинна бути досить пристойною (проте не перевіряли її):

  • Chrome> = 27
  • FireFox> = 30
  • Internet Explorer> = 9
  • Сафарі> = 5.1

html:

<iframe class="iframe-placeholder" src=""></iframe>

css:

.iframe-placeholder
{
   background: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 100% 100%"><text fill="%23FF0000" x="50%" y="50%" font-family="\'Lucida Grande\', sans-serif" font-size="24" text-anchor="middle">PLACEHOLDER</text></svg>') 0px 0px no-repeat;
}

Що ви можете змінити?

Всередині фонового значення:

  • розмір шрифту: шукайте font-size = "" і змініть значення на все, що завгодно

  • колір шрифту: шукайте fill = "" . Не забудьте замінити # на% 23, якщо ви використовуєте шістнадцяткову позначку кольорів. % 23 розшифровує # в кодуванні URL, який необхідний для того, щоб SVG-рядок міг розбиратися у FireFox.

  • сімейство шрифтів: шукайте font-family = "" не забудьте уникнути одинарних лапок, якщо у вас є шрифт, який складається з декількох слів (наприклад, з "Lucida Grande \")

  • text: шукайте значення елемента текстового елемента, де ви бачите рядок PLACEHOLDER . Ви можете замінити рядок PLACEHOLDER будь-яким, що відповідає URL-адресам (спеціальні символи потрібно перетворити на відсоткові позначення)

Приклад на скрипці

Плюси:

  • Без зайвих HTML-елементів
  • Немає js
  • Текст легко (...) можна коригувати без необхідності зовнішньої програми
  • Це SVG, тому ви можете легко помістити туди будь-який SVG, який хочете.

Мінуси:

  • Підтримка браузера
  • Це складно
  • Це хакі
  • Якщо iframe-src не має фонового набору, заповнювач заповнення просвічуватиме (що не властиво цьому методу, а просто стандартній поведінці, коли ви використовуєте bg на iframe)

Я б рекомендував це лише в тому випадку, якщо абсолютно необхідно показати текст як заповнювача в iframe, який вимагає трохи гнучкості (кілька мов, ...). Просто знайдіть хвилинку і поміркуйте над цим: чи все це дійсно потрібно? Якби у мене був вибір, я б пішов за методом @ Крістіни


5
$('iframe').load(function(){
      $(".loading").remove();
    alert("iframe is done loading")
}).show();


<iframe src="http://www.google.com" style="display:none;" width="600" height="300"/>
<div class="loading" style="width:600px;height:300px;">iframe loading</div>

Це не обов'язково є хорошим рішенням для iframe, який завантажується на сторонній веб-сайт, оскільки вони можуть не мати jQuery на своїй сторінці.
Лука

4

Ось швидке рішення для більшості випадків:

CSS:

.iframe-loading { 
    background:url(/img/loading.gif) center center no-repeat; 
}

Ви можете використовувати анімований завантажувальний GIF, якщо хочете,

HTML:

<div class="iframe-loading">
    <iframe src="http://your_iframe_url_goes_here"  onload="$('.iframe-loading').css('background-image', 'none');"></iframe>
</div>

За допомогою події завантаження ви можете видалити завантажувальне зображення після завантаження вихідної сторінки всередині рамки iframe.

Якщо ви не використовуєте jQuery, просто введіть ідентифікатор у div і замініть цю частину коду:

$('.iframe-loading').css('background-image', 'none');

чимось подібним:

document.getElementById("myDivName").style.backgroundImage = "none";

Всього найкращого!


2

Так, ви можете використовувати прозорий div, розміщений над областю iframe, з gif-завантажувачем як лише фоном.

Потім ви можете долучити onloadподію до iframe:

 $(document).ready(function() {

   $("iframe#id").load(function() {
      $("#loader-id").hide();
   });
});

1

Я дотримувався наступного підходу

По-перше, додайте рідний брат

$('<div class="loading"></div>').insertBefore("#Iframe");

а потім, коли iframe завершив завантаження

$("#Iframe").load(function(){
   $(this).siblings(".loading-fetching-content").remove(); 
  });

0
<!DOCTYPE html>
<html>
<head>
<title>jQuery Demo - IFRAME Loader</title>
<style>
#frameWrap {
    position:relative;
    height: 360px;
    width: 640px;
    border: 1px solid #777777;
    background:#f0f0f0;
    box-shadow:0px 0px 10px #777777;
}

#iframe1 {
    height: 360px;
    width: 640px;
    margin:0;
    padding:0;
    border:0;
}

#loader1 {
    position:absolute;
    left:40%;
    top:35%;
    border-radius:20px;
    padding:25px;
    border:1px solid #777777;
    background:#ffffff;
    box-shadow:0px 0px 10px #777777;
}
</style>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</head>
<body>

<div id="frameWrap">
<img id="loader1" src="loading.gif" width="36" height="36" alt="loading gif"/>
<iframe id="iframe1" src="https://bots.actcorp.in/ACTAppChat/chat?authtext=test@user8.com&authToken=69d1afc8d06fb97bdb5a9275edbc53b375c3c7662c88b78239ba0cd8a940d59e" ></iframe>
</div>
<script>
    $(document).ready(function () {
        $('#iframe1').on('load', function () {
            $('#loader1').hide();
        });
    });
</script>

</body>
</html>

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