Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с динамически подключаемым скриптом 
:(
    Опции темы
Igor_K
Дата 25.11.2009, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 4.2.2008
Где: Kyiv

Репутация: нет
Всего: нет



Здравствуйте!
Код

var sc = document.createElement("script");
sc.type = 'text/javascript';
sc.src = 'file.js';
document.getElementsByTagName('head')[0].appendChild(sc);

alert(abcd);


Скрипт загружается нормально. Проблема в том, что alert(abcd) вызывается похоже когда file.js еще не загружен. Пишет abcd is not defined.
Если вместо alert(abcd); записать setTimeout("alert(abcd)", 1000); то тогда алерт срабатывает. Из этого я сделал вывод, что алерт вызывается раньше чем скрипт file.js загрузится.

Вопрос: Как мне "подождать" пока загрузится скрипт и только после этого начать выполнять следующие операторы? 
PM MAIL   Вверх
Amphiluke
Дата 25.11.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 35
Всего: 112



Занесите все последующие действия в функцию. После кода динамического подключения скрипта поставьте вызов этой функции с короткой задержкой (скажем, 30 мс). Внутри функции проверяйте: если нужные данные из динамически подключаемого скрипта еще не доступны, то сгенерировать новый рекурсивный вызов этой функции с задержкой, а если данные доступны, то выполнить ожидающие операторы.
Выглядеть это может примерно так:

Код

function waitForScript() {
   if (abcd) {
      alert(abcd);
      // еще какие-то действия с abcd
   } else {
      window.setTimeout(waitForScript, 30);
   }
}

var sc = document.createElement("script");
sc.type = 'text/javascript';
sc.src = 'file.js';
document.getElementsByTagName('head')[0].appendChild(sc);

window.setTimeout(waitForScript, 30);


Вместо abcd можно (лучше) использовать какой-нибудь специальный флажок, который инициализируется ненулевым значением в самом конце динамически подключаемого сценария.
PM   Вверх
TryLight
Дата 26.11.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 26.8.2007

Репутация: нет
Всего: 1



ну или вот еще решение
но не знаю, насколько валидно

Код

var sc = document.createElement("script");
sc.type = 'text/javascript';
sc.src = 'file.js';
sc.onload = function(){alert('complete, FF');}; // для мозиллы
sc.onreadystatechange = function(){alert('complete, IE');}; // для ие
document.getElementsByTagName('head')[0].appendChild(sc);


Код

<script language="JavaScript" type="text/javascript">
var script_loaded = false;
var script_loaded_count = 0;

var sc = document.createElement("script");
sc.type = 'text/javascript';
sc.src = 'file.js';
sc.onload = function(){script_loaded = true}; // для мозиллы
sc.id = "sc1";
sc.onreadystatechange = function(){
    if(document.getElementById('sc1').readyState == 'complete') script_loaded = true}; // для ие
document.getElementsByTagName('head')[0].appendChild(sc);

function script_loaded_check(){
    if(script_loaded_count>100) alert("Ошибка загрузки скрипта");
    else if(!script_loaded) setTimeout("script_loaded_check()", "100");
    script_loaded_count++;
}

alert(abcd);


</script>


Это сообщение отредактировал(а) TryLight - 26.11.2009, 10:37
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0626 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.