@darknefrit

Почему не срабатывает onreadystatechange и readyState при динамическом подключении скриптов?

Не пойму, везде примеры с динамическим подключением скриптов типа такого:
var script = document.createElement('script');
script.src = "https://code.jquery.com/jquery.js";
document.documentElement.appendChild(script);

function afterLoad() {
  alert( "Загрузка завершена: " + typeof(jQuery) );
}

script.onload = script.onerror = function() {
  if (!this.executed) { // выполнится только один раз
    this.executed = true;
    afterLoad();
  }
};

script.onreadystatechange = function() {
  var self = this;
  if (this.readyState == "complete" || this.readyState == "loaded") {
    setTimeout(function() {
      self.onload()
    }, 0); // сохранить "this" для onload
  }
};


Но у script нет ни onreadystatechange , ни readyState и как следствие функция выше не отработает как задумано.

И Второй вопрос хочу подключить несколько сриптов в цикле
var jsArr=['js1.js', 'js2.js'];
      var script=[]
                    for (var jsFile in jsArr) {

                       var script[jsFile ] = document.createElement('script');
                       script[jsFile ].src = "/static/js/"+jsArr[jsFile];                
                       document.body.appendChild(script[jsFile ]);

                        script[jsFile].onload = function() {
                            console.log(script[jsFile]); // оба раза покажет только последний файл
                           console.log(script);
                        };
                        script[jsFile].onerror = function() {
                            alert( "Ошибка: " + this.src );
                        };
                    }

И получается так что оба раза после загрузки скриптов console.log(script[jsFile]); показывает что отработала функция для последнего загруженного файла. Почему так ?
  • Вопрос задан
  • 188 просмотров
Пригласить эксперта
Ответы на вопрос 2
@cryogenian
Редистейт для восьмого ие, в статье, откуда вы примеры скопировали, это написано. Проверьте, что у элемента есть это свойство, а потом используйте. Кстати, сначала регистрируют обработчик, а потом устанавливают срц.
Форлуп не формирует области видимости для переменных определённых варами, значения передаются по ссылке - - конечно, у вас все лисенеры будут с последним значением вызываться. Почитайте про замыкания.
Ответ написан
@darknefrit Автор вопроса
cryogenian
Так надо сделать ?

var jsArr=['js1.js', 'js2.js'];
   
                    for (var jsFile in jsArr) {

                       var script = document.createElement('script');
                       script.src = "/static/js/"+jsArr[jsFile];                
                       document.body.appendChild(script[jsFile ]);
                        (function(script) {
                               return script.onload = function() {
                                    console.log(script);                              
                               };
                           })(script);
                       
                    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы