Как отображать сообщение о загрузке при загрузке iFrame?


107

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

Есть ли способ отобразить сообщение о загрузке, пока этот iframe загружается, и пользователь не видит большого пустого пространства?

PS. Обратите внимание, что iframe предназначен для стороннего веб-сайта, поэтому я не могу ничего изменять / вводить на их страницу.


Да, мне не известно о каких-либо обратных вызовах для iframe ... Хм.
— Джеффри Суини,

Ответы:


232

Я сделал следующий подход 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
Это не сработает, если загружаемый iframe имеет прозрачный фон. Вы все еще можете видеть загружаемый gif после загрузки iframe!
— Westy92

3
@Christna Этот трюк не работает в IE-11. Есть хак?
— mmuzahid

3
С помощью функции загрузки iframe вы можете удалить фоновое изображение CSS.
— Хьюго Кокс,

1
Отличный ответ. Оно работает. Также лучше добавить немного высоты, чтобы загрузчик был хорошо виден.
— Raz

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
Это зависит от потребностей пользователя. Если ему не нужно загружать все изображения до того, как он скроет сообщение о загрузке, тогда ему не понадобится обратный вызов при загрузке.
— Minko Gechev

9
jquery не является "JS".
— OZ_

5
@OZ_ не трудно превратить код выше в ванильный JavaScript с использованием addEventListenerи использование querySelector+ styles свойства :-). В дополнение к этому, автор вопроса пометил как jquery. Не понимаю, почему было ваше сообщение? :-)
— Минько Гечев

17

Если это всего лишь заполнитель, которого вы пытаетесь достичь: безумный подход - вставить текст в качестве svg-фона. Это обеспечивает некоторую гибкость, и из того, что я читал, поддержка браузера должна быть довольно приличной (хотя не тестировал):

  • Chrome> = 27
  • FireFox> = 30
  • Internet Explorer> = 9
  • Safari> = 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 \')

  • текст: найдите значение элемента текстового элемента, в котором вы видите строку PLACEHOLDER . Вы можете заменить строку PLACEHOLDER чем-нибудь, что соответствует URL-адресу (специальные символы необходимо преобразовать в процентное обозначение)

Пример на скрипке

Плюсы:

  • Никаких лишних HTML-элементов
  • Нет js
  • Текст можно легко (...) изменить без необходимости использования внешней программы
  • Это SVG, поэтому вы можете легко поместить туда любой SVG, какой захотите.

Минусы:

  • Поддержка браузера
  • Это сложно
  • Это взломано
  • Если для iframe-src не установлен фон, заполнитель будет светиться (что не присуще этому методу, а просто стандартное поведение при использовании bg в iframe)

Я бы рекомендовал это только в том случае, если абсолютно необходимо отображать текст в качестве заполнителя в iframe, который требует некоторой гибкости (несколько языков, ...). Найдите минутку и подумайте: действительно ли все это необходимо? Если бы у меня был выбор, я бы выбрал метод @Christina


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>

Используя событие onload, вы можете удалить загружаемое изображение после загрузки исходной страницы внутри вашего 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

$('<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.