Задать вопрос
phfaster
@phfaster
Прогрессивный веб-разработчик

Почему рано срабатывает (DOM)script.onload?

Добрый вечер.

Пытаюсь динамически подгрузить ES6-класс из файла под названием blur.js. Код подгружающего файла:
function require(src,cb){
    var script = document.createElement('script');
    script.src = src;
    document.documentElement.appendChild(script);

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

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

require('/js/classes/blur.js',function() {
    var Blur = new Blur();

    Blur.sayHi("John"); // alert("Hi, "+{name});
});


Chrome говорит, что у Blur нет конструктора:
Uncaught TypeError: Blur is not a constructor
и указывает на строку с объявлением экземпляра класса. Ввожу в консоли ту же строку с объявлением - все отлично работает. Сделал вывод, что скрипт не загрузился на момент вызова колбека.
Это специфика onload или я что-то делаю не так?

UPDATE: Поставил интервал на 10 секунд. Все равно выдает ту же ошибку. Я подозреваю, что у callback-а другая область видимости? Или я ошибаюсь? В консоли, потому что, все прекрасно работает и через 1-2-3... секунды. Как можно завести этот код? Буду очень благодарен за наводки.
  • Вопрос задан
  • 242 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
taliban
@taliban
php программист
script.onload = script.onerror - первое что бросается в глаза, при ошибке у вас выполнится калбак.
а во вторых, пропишите внутри require несколько логов, чтоб видеть какой блок выполняется, если вообще выполняется, как минимум это будет отправной точкой
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы