Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как установить прелоадер на div с подгружаемым содержимым (https://javascript.ru/forum/dom-window/74490-kak-ustanovit-preloader-na-div-s-podgruzhaemym-soderzhimym.html)

berdps 16.07.2018 16:47

Как установить прелоадер на div с подгружаемым содержимым
 
Приветствую уважаемые форумчане!!!

Никак не удается установить прелоадер на контейнер div в котором отображается содержимое загружаемое скриптами с другого ресурса.

Вот контейнер:

<div class="mydiv"
<div id="tj-store-app"></div>
<script type="text/javascript">function addScript(path){var tjs=document.createElement('script'); tjs.type='text/javascript';tjs.async = true;tjs.src=path;var s=document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(tjs, s); };

addScript("https://cabinet.xn-----6kcabd1eqfgcfyoae1a.xn--p1ai/code/store_app?menu=js/no-menu.js&use_partials_folder=true");
tj_partials_folder_url = "/tj-store/app/partials";
</script>
</div>


Вот код прелодера, который я вставляв в этот mydiv

<div class="loader">
<div class="loader_inner"></div>
</div>


Других идей кроме как поставить функцию для скрытие прелоадера на событие onload у меня не возникло.

Нашел функцию:

function iframeOnload() {
document.querySelector('.loader').classList.add('h idden')
}

Не хочет работать.

На некольких других сайтах пользовался этим же прелоадером и функцией

$(window).load(function() {

$(".loader_inner").fadeOut();
$(".loader").delay(400).fadeOut("slow");

});


Работает нормально, но как ее переделать для работы не со всем сайтом а с отдельным div? подскажите пожалуйста, заранее благодарен.

В JS полный новичок, думаю это было понятно )

senex 17.07.2018 02:18

Последовательность событий такая:

- Генерируется скрипт
- скрипт создает и вставляет в mydiv елемент <iframe>
- iframe загружает содержимое с другого ресурса

И здесь целых две трудно решаемые проблемы:

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

Далее. Скрипт асинхронный. Он может вставить iframe после того как загрузится основной документ или раньше. Он также никак не синхронизирован с выполнением вашего скрипта. Он может выполниться позже или раньше вашего скрипта. Если позже - то ваш скрипт не найдет ифрейм потому что его еще не существует и событие load навесить будет не на что. Если раньше - то событие load также может произойти раньше и повесить на него обработчик нельзя ибо поезд ушел.

Поэтому лучше не заморачиваться и сделать так - поставить картинку loader.gif на backgound:

<div class="mydiv" style="background: url('loader.gif') no-repeat center center"/>

Когда загрузится документ в iframe, то закроет эту картинку своим фоном.

berdps 17.07.2018 14:48

Спасибо Вам огромное, элегантное решение, буду пробовать


Часовой пояс GMT +3, время: 13:58.