Как отображать сообщение о загрузке при загрузке 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.