Подтвердить что ты не робот

JQuery загружает API визуализации Google с помощью AJAX

Есть проблема, которую я не могу решить, я много искал в интернете, но ничего не нашел.

У меня есть этот JavaScript, который используется для выполнения запроса Ajax с помощью PHP. Когда запрос выполняется, он вызывает функцию, которая использует API визуализации Google, чтобы нарисовать аннотированную строку для представления данных.

script отлично работает без AJAX, если я все делаю, он отлично работает, но когда я пытаюсь сделать это с AJAX, он не работает!!!

Ошибка, которую я получаю, заключается в объявлении DataTable "данных", в Инструментах разработчика Google Chrome я получаю Uncaught TypeError: Cannot read property 'DataTable' of undefined.

Когда ошибка script попадает на ошибку, все на странице очищается, она просто показывает пустую страницу.

Поэтому я не знаю, как заставить его работать.

$(document).ready(function(){               
    // Get TIER1Tickets                 
    $("#divTendency").addClass("loading");

    $.ajax({
        type: "POST",
        url: "getTIER1Tickets.php",
        data: "",
        success: function(html){
            // Succesful, load visualization API and send data      
            google.load('visualization', '1', {'packages': ['annotatedtimeline']}); 
            google.setOnLoadCallback(drawData(html));                                                   
        }
    });     
});


function drawData(response){            
    $("#divTendency").removeClass("loading");

    // Data comes from PHP like: <CSV ticket count for each day>*<CSV dates for ticket counts>*<total number of days counted>
    // So it has to be split first by * then by ,
    var dataArray   = response.split("*");
    var dataTickets = dataArray[0];
    var dataDates   = dataArray[1];
    var dataCount   = dataArray[2];

    // The comma separation now splits the ticket counts and the dates
    var dataTicketArray = dataTickets.split(",");
    var dataDatesArray  = dataDates.split(",");

    // Visualization data                               
    var data = new google.visualization.DataTable();
    data.addColumn('date', 'Date');
    data.addColumn('number', 'Tickets');
    data.addRows(dataCount);                                                    

    var dateSplit = new Array();
    for(var i = 0 ; i < dataCount ; i++){
        // Separating the data because must be entered as "new Date(YYYY,M,D)"
        dateSplit = dataDatesArray[i].split("-");
        data.setValue(i, 0, new Date(dateSplit[2],dateSplit[1],dateSplit[0]));
        data.setValue(i, 1, parseInt(dataTicketArray[i]));
    }               

     var annotatedtimeline = new google.visualization.AnnotatedTimeLine(document.getElementById('divTendency'));
     annotatedtimeline.draw(data, {displayAnnotations: true});                              
}
4b9b3361

Ответ 1

Помню, когда я использовал API Google, он явно сказал, что сначала инициализирует загрузку. Поэтому, возможно, сохраните функцию google.load из AJAX, а затем просто продолжайте называть вторую часть своей функции успешной:

//Straight Away!
google.load('visualization', '1', {'packages': ['annotatedtimeline']}); 

$(document).ready(function(){
    // Get TIER1Tickets                 
    $("#divTendency").addClass("loading");

    $.ajax({
        type: "POST",
        url: "getTIER1Tickets.php",
        data: "",
        success: function(html){
            // Succesful, load visualization API and send data
            google.setOnLoadCallback(drawData(html)); 
        }
    });  
});

Ответ 2

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

http://code.google.com/apis/loader/

function loadMaps() {
   google.load("visualization", "2", {"callback" : function(){ alert(4); }});
}

Ответ 3

Это немного выстрел в темноте:

google.setOnLoadCallback(function() { drawData(html) });

Возможно, ссылка на html потеряна, и требуется закрытие.

Ответ 4

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

код на странице:

<div id='targetdiv'></div>
<script type="text/javascript">
$(document).ready( function () {
   $('#targetdiv').load('...some url...');
});
</script>

часть script, загруженная с помощью ajax:

<script type="text/javascript">
  document.write("hello");
</script>

Результатом является страница с текстом "привет", который выглядит так, будто он все еще загружается. Это вызвано методом document.write. Поскольку script загружается в уже завершенный и закрытый документ, браузер открывает новый, и я полагаю, что механизм javascript ожидает следующей строки кода, которая никогда не появится, поскольку открытие нового документа удалит исполняемый.

Ответ 5

Не могли бы вы предоставить образец возвращаемых данных? Вы можете напрямую вызвать drawData (html):

$.ajax({
type: "POST",
async: false,
url: "getTIER1Tickets.php",
data: "",
success: function(html){
    // Succesful, load visualization API and send data      
    google.load('visualization', '1', {'packages': ['annotatedtimeline']}); 
   //You are already in a callback function, better like this ? 
    drawData(html);                                                   
}}); 

Ответ 6

Вы пытались сделать это как синхронный запрос AJAX? Обратите внимание на настройку async ниже.

$.ajax({
    type: "POST",
    async: false,
    url: "getTIER1Tickets.php",
    data: "",
    success: function(html){
        // Succesful, load visualization API and send data      
        google.load('visualization', '1', {'packages': ['annotatedtimeline']}); 
        google.setOnLoadCallback(drawData(html));                                                   
    }
}); 

Ответ 7

Я вообще не знаком с google apis, но я предполагаю, что "html" в обратном вызове на самом деле json или script, вы можете попробовать опцию $.ajax 'dataType':

$.ajax({
    type: "POST",
    url: "getTIER1Tickets.php",
    dataType: "json",//"script"
    data: "",
    success: function(html){
        // Succesful, load visualization API and send data      
        google.load('visualization', '1', {'packages': ['annotatedtimeline']}); 
        google.setOnLoadCallback(drawData(html));                                                   
    }
});

Дополнительная информация: http://api.jquery.com/jQuery.ajax/

Ответ 8

Похоже, вам не хватает библиотеки Google, которая обеспечивает визуализацию. Вы уверены, что включили все необходимые скрипты Google?

Ответ 9

Я использую систему вкладок на основе AJAX и визуализацию интерактивной линейной диаграммы Google в одном из моих проектов и столкнулась с подобной кирпичной стеной.

Из-за присущей AJAX блокировки междоменных скриптов вы не можете загрузить API javascript Google (http://www.google.com/jsapi) или любой другие внешние ресурсы.

И поскольку условия использования Google запрещают офлайн-оффу (например, "не размещенные в Google" ) использование их API визуализации, вы не можете законно получить копию сценариев и разместить их самостоятельно, как это требуется.

Я попробовал взломанное обходное решение с включением в мои вкладки файла с именем "get_vis.php" вместо "visualization_page.php"; где содержимое "get_vis.php":

<?php 
echo file_get_contents('http://domain.com/path/to/visualization_page.php');
?>

Но, не удача, кажется, единственный способ правильно загрузить API для загрузки - это настроить параметры безопасности, чтобы обеспечить взаимодействие с серверами Google. Я не знаю, помогает ли она, но удачи.

Ответ 10

Это работает для меня

google.load("visualization", "1", { packages: ["corechart"] });

             var chart ;
             var data ;
             var options;
        function Change(s)
        {
              // s in json format    
              google.setOnLoadCallback(reDraw(s));
              function reDraw(s) {
                  console.log(new Function("return " + s)().length); // to test if json is right
                  data = google.visualization.arrayToDataTable(new Function("return "+s)());

                    options = {
                    title: 'Product Scanes',
                    vAxis: { title: '', titleTextStyle: { color: 'red'} }         
                };

              }         
                chart = new google.visualization.BarChart(document.getElementById('chart_div'));
                chart.draw(data, options);
        }  
        function requestDate() // cal the method when you want to draw the chart 
        {

            $.ajax({
                type: "POST", // CHANGED
               // contentType: "application/json; charset=utf-8",
                url: "something.php",
                data: {  parameters you wanna pass },
                success: function (d) { 
                Change(d);


                }
            });    
        }
}