Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > проблема с динамически подключаемым скриптом


Автор: Igor_K 25.11.2009, 21:06
Здравствуйте!
Код

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 загрузится.

Вопрос: Как мне "подождать" пока загрузится скрипт и только после этого начать выполнять следующие операторы? 

Автор: Amphiluke 25.11.2009, 22:06
Занесите все последующие действия в функцию. После кода динамического подключения скрипта поставьте вызов этой функции с короткой задержкой (скажем, 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 можно (лучше) использовать какой-нибудь специальный флажок, который инициализируется ненулевым значением в самом конце динамически подключаемого сценария.

Автор: TryLight 26.11.2009, 10:19
ну или вот еще решение
но не знаю, насколько валидно

Код

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>

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)