2015-07-13 2 views
2

Я пытаюсь добавить таблицу Google с помощью AJAX, но в Firebug я получаю:Загрузка Javascript после ajaxComplete

ReferenceError: google is not defined 

на основе AJAX, что я посылаю выглядит так:

<script type="text/javascript" src="https://www.google.com/jsapi"></script> 
<script type="text/javascript"> 
    google.load("visualization", "1", {packages:["corechart"]}); 
    google.setOnLoadCallback(drawVisualization); 

    etc etc... 

</script> 

Я m, предполагая, что первый скрипт не загружается. Как я могу это исправить? Я пробовал загружать после ajaxComplete, но я не могу заставить его работать.

+1

Что происходит, когда вы завершаете функции google в функции DOM ready? –

+0

Но я отправляю эти 2 скрипта на страницу через AJAX (после загрузки страницы). Разве это не означает, что DOM уже готов? – user537137

+0

@ user537137 Итак, если вы загружаете этот скрипт после анализа документа, этот скрипт загружается асинхронно. Поэтому установите логику внутри обработчика onload скрипта, включая google jsapi. Теперь мне интересно, как вы включаете эти скрипты на странице? И будьте осторожны, если google jsapi использует любое событие onload для инициализации окна, вы не можете использовать этот способ для загрузки goggle script –

ответ

1

Если вы хотите подождать до загрузки вашей библиотеки, вы можете периодически проверять, загружена ли она, и когда вы ее обнаружите, вы можете выполнить свой код. Я основываю свое решение на этом answer.

Добавить функцию Javascript для проверки:

function whenAvailable(name, callback) { 
    var interval = 10; // ms 
    window.setTimeout(function() { 
     if (window[name]) { 
      callback(window[name]); 
     } else { 
      window.setTimeout(arguments.callee, interval); 
     } 
    }, interval); 
} 

А затем добавить код, который проверяет, если вы ваш Google загружен и запустить код с внутренней стороны, когда он загружает

whenAvailable("google", function(t) { 
    google.load("visualization", "1", {packages:["corechart"]}); 
    google.setOnLoadCallback(drawVisualization); 

    etc etc... 
}); 

Вы можете настройте свой интервал. Это полезная модель.

Смежные вопросы