Динамическая загрузка JavaScript с помощью JavaScript

После более чем часа попыток заставить его работать, я думаю, что это из-за междоменных политик, но я действительно думал, что это сработает. Я тоже не могу найти много информации о нем. Но вот моя проблема. У меня есть сайт с именем http://mysite.com, а затем я включаю сторонний скрипт (то, что я пишу) и его на http://supercoolsite.com/api/script.js, и этот скрипт должен загружаться динамически Google Maps API по адресу: http://maps.google.com/maps/api/js?sensor=false перед запуском. Ну, я подумал, что этот код будет работать:

function loadScript(filename,callback){
  var fileref=document.createElement('script');
  fileref.setAttribute("type","text/javascript");
  fileref.setAttribute("src", filename);
  fileref.onload = callback();
  if (typeof fileref!="undefined"){
    document.getElementsByTagName("head")[0].appendChild(fileref)
  }
}

loadScript('http://maps.google.com/maps/api/js?sensor=false',function(){
  console.log('done loading');
  init();
});

Но мой ответ в моей консоли:

api.js:408 done loading
api.js:115 test
api.js:310 Uncaught ReferenceError: google is not defined

"test" находится вверху init(). Итак, он загружает скрипт, но, похоже, не выполняет его. Итак, есть идеи? Если это проблема межсайтового скриптинга, мой единственный способ исправить это, о котором я мог бы подумать, - это PHP-скрипт на нашей стороне, который в основном просто устанавливает заголовок в текстовый/javascript-заголовок, а затем echo file_get_contents() в файл googlemaps.php, который мы размещаем. Мы собираемся попробовать это, пока мы говорим, но, если возможно, способ сделать это с помощью чистого JS был бы потрясающим.

P.S. Я также пытался добавить jQuery, а затем выполнить getScript(), и это все равно не сработало.

-- ОБНОВИТЬ --

См. эту скрипту: http://jsfiddle.net/ycMCa/2/

Вы увидите, что в консоли появляется сообщение об ошибке: Uncaught TypeError: undefined is not a function

Несмотря на это переменная google является глобальной.


person Oscar Godson    schedule 29.04.2011    source источник


Ответы (1)


У вас просто небольшая ошибка:

fileref.onload = callback();

Это немедленно вызовет callback и присвоит его возвращаемое значение fileref.onload.

Так должно быть

fileref.onload = callback;

Вы также должны добавить обработчик перед установкой источника (на всякий случай).

ДЕМО

person Felix Kling    schedule 29.04.2011