Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Момент окончания динамической загрузки сценариев (Г.О.)
Author Message
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Tue Mar 21, 2006 6:03 pm (написано за 19 секунд)
   Post subject: Момент окончания динамической загрузки сценариев
Reply with quote

Еще раз Здравствуйте.

Продолжаю пользоваться добротой здешних людей и задавать глупые вопросы.

У меня есть набор js-библиотек. На странице же подключается только одна и уже в ней загружаются все остальные.
После того, когда они все загрузятся, нужно произвести некоторые действия.
Делаю я это собственно так:
Code (JavaScript): скопировать код в буфер обмена
/*
 list_lib = [ 'one.js', 'two.js', 'three.js' ];

 lib_load_all(); //
 
/*
 function lib_load_all() {
 
   for ( var i = 0; i < list_lib.length; i++ )
     lib_load( list_lib[ i ] );
     
   return true;
 
 } // lib_load_all().
 
/*
 function load_lib( lib ) {

   var s = document.createElement( 'script' );
   s.src = lib;
   document.body.appendChild( s );
   
   if ( s.addEventListener ) {
     s.addEventListener( 'load', lib_onload, false );
   } else s.attachEvent( 'onload', lib_onload );

   return true;

 } // load_lib().
 
 list_lib_q = 0; //
 
/*
 function lib_onload() {
 
   list_lib_q++;
   
   if ( list_lib_q < list_lib.length ) //
     return true;
     
/*

 } // lib_onload().
 
Т.е. на каждый созданный <script> вешается обработчик onLoad и когда они все срабатывают, это значит, что все нужные сценарии загружены.
В FF это работает, а в IE нет.
Единственное, до чего я додумался, это в конце каждой загружаемой библиотеки вызывать lib_onload().
Может как-нибудь по-человечески можно, чтобы работало и в FF и в IE?
Back to top
View user's profile Send private message
Миша Спларов
Участник форума



Joined: 17 Nov 2003
Posts: 821
Карма: 65
   поощрить/наказать

Location: Россия, Москва

PostPosted: Tue Mar 21, 2006 8:51 pm (спустя 2 часа 47 минут; написано за 2 минуты 50 секунд)
   Post subject:
Reply with quote

Code (JavaScript): скопировать код в буфер обмена
function lib_load_all() {
  var list_lib = [ 'one.js', 'two.js', 'three.js' ];
  for (var i in list_lib) {
    var s = document.createElement('script');
    s.setAttribute('type','text/javascript');
    s.setAttribute('src', list_lib[i]);
    document.documentElement.firstChild.appendChild(s);
  }
}
if (window.addEventListener) {
  window.addEventListener('load', lib_load_all, false);
}
else {
  window.attachEvent('onload', lib_load_all);
}
Back to top
View user's profile Send private message
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Wed Mar 22, 2006 10:04 am (спустя 13 часов 13 минут; написано за 2 минуты 18 секунд)
   Post subject:
Reply with quote

Миша Спларов, спасибо за ответ, но я несколько другое имел ввиду.

Функция lib_load_all() здесь ведь на самом деле не загружает библиотеки, а только инициирует их загрузку. Т.е., когда данная функция завершается, еще не факт, что все созданные в ней <script> подгрузили нужные данные. И мне, собственно, нужно определить момент, когда все эти библиотеки будут загружены.
Back to top
View user's profile Send private message
Миша Спларов
Участник форума



Joined: 17 Nov 2003
Posts: 821
Карма: 65
   поощрить/наказать

Location: Россия, Москва

PostPosted: Wed Mar 22, 2006 10:16 am (спустя 12 минут; написано за 1 минуту 44 секунды)
   Post subject:
Reply with quote

Г.О.
Боюсь ничего, кроме предложенного вами же метода о вызове функции в каждом подключаемом js, придумать нельзя.
Хотя есть ещё такой вариант. После подгрузки всех js-ов, подгружать ещё один - последним в очереди и в нём делать что-то типа
Code (JavaScript): скопировать код в буфер обмена
all_loaded();
Back to top
View user's profile Send private message
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Wed Mar 22, 2006 10:21 am (спустя 4 минуты; написано за 3 минуты 22 секунды)
   Post subject:
Reply with quote

Миша Спларов wrote:
Боюсь ничего, кроме предложенного вами же метода о вызове функции в каждом подключаемом js, придумать нельзя.
Обидно...
Quote:
Хотя есть ещё такой вариант. После подгрузки всех js-ов, подгружать ещё один - последним в очереди и в нём делать что-то типа
Code (JavaScript): скопировать код в буфер обмена
all_loaded();
Нет, это не пройдет. Потому что грузится разные библиотеки могут разное время, и последний вызванный файл не факт, что загрузится последним.
Back to top
View user's profile Send private message
K.Wiolowan
Участник форума



Joined: 22 Feb 2006
Posts: 53
Карма: 11
   поощрить/наказать


PostPosted: Thu Mar 23, 2006 12:55 pm (спустя 1 день 2 часа 34 минуты; написано за 7 минут 34 секунды)
   Post subject:
Reply with quote

У меня тоже были проблемы, когда загружались несколько скриптов разной "толщины" в разных фреймах.
Я решал это размещением чего-то типа
Code (JavaScript): скопировать код в буфер обмена
top.list_lib_q++;
-в конце каждого скрипта.
Если каждый скрипт _действительно_ загружается и выполняется, то последние операторы, прибавляющие единицу к счетчику list_lib_q, совершенно адекватно сигнализируют об окончании загрузки.

можно, наверное, не заморачиваться с разной моделью событий в IE и FF, а запускать таймер, анализирующий состояние list_lib_q и запускающий "движок" после достижения list_lib_q "порогового значения":
Code (JavaScript): скопировать код в буфер обмена
setTimeout("check_scripts()",100)
function check_scripts(){
        if(list_lib_q < list_lib.length) setTimeout("check_scripts()", 100)
        else init_engine()
}
Back to top
View user's profile Send private message
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Thu Mar 23, 2006 1:03 pm (спустя 8 минут; написано за 2 минуты 16 секунд)
   Post subject:
Reply with quote

K.Wiolowan, ну, собственно, да. Получается единственно, как можно проверить загрузку сценария, это то, чтобы этот сценарий сам об этом заявлял. Именно этого и хотелось бы избежать для того чтобы загружаемые библиотеки были все-таки самодостаточными, а не зависили от того, откуда они загружаются.
Back to top
View user's profile Send private message
Г.О.
Участник форума



Joined: 22 Feb 2006
Posts: 378
Карма: 13
   поощрить/наказать

Location: Ленинград

PostPosted: Mon Jun 05, 2006 5:32 pm (спустя 2 месяца 13 дней 4 часа 29 минут; написано за 2 минуты 45 секунд)
   Post subject:
Reply with quote

Наткнулся на свою старую тему.
Если кому из грядущих поколений будет интересно, то проблема была в том, что в IE на элемент SCRIPT не работал onload.
Как оказалось, вместо него можно использовать onreadystatechange. Тогда ветка для IE в функции load_lib() из первого сообщения будет выглядеть:
Code (JavaScript): скопировать код в буфер обмена
s.attachEvent( 'onreadystatechange', function(e) { if ( s.readyState != "loading" ) return false; lib_onload(); } );
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML