Не могу получить доступ к переменным из динамически загружаемого JavaScript - PullRequest
3 голосов
/ 29 апреля 2010

Я использую довольно простую систему для динамической загрузки javascript:

include = function (url) {
  var e = document.createElement("script");
  e.src = url;
  e.type="text/javascript";
  document.getElementsByTagName("head")[0].appendChild(e);
};

Допустим, у меня есть файл test.js, который имеет следующее содержимое:

var foo = 4;

Теперь в моем оригинальном сценарии я хочу использовать

include(test.js);
console.log(foo);

Тем не менее, я получаю сообщение об ошибке «foo не был определен». Я предполагаю, что это связано с динамическим сценарием, включенным в качестве последнего потомка тега <head>. Как я могу заставить это работать?

Ответы [ 2 ]

5 голосов
/ 29 апреля 2010

Это потому, что вам нужно дождаться загрузки скрипта. Это не синхронно, как вы думаете. Это может работать для вас:

include = function (url, fn) {
    var e = document.createElement("script");
    e.onload = fn;
    e.src = url;
    e.async=true;
    document.getElementsByTagName("head")[0].appendChild(e);
};

include("test.js",function(){
    console.log(foo);
});
3 голосов
/ 29 апреля 2010

Это одна из проблем, но браузеру также требуется время, чтобы загрузить и проанализировать удаленный файл JS - и он этого не сделал, прежде чем вызвать console.log.

Вам нужно отложить вещи до загрузки скрипта.

Это проще всего сделать, если библиотека выполняет тяжелую работу, в jQuery есть метод getScript , который позволяет передавать обратный вызов для запуска после загрузки скрипта.

...