2015-11-11 100 views
1

我们使用AJAX来显示用户的统计信息 - 每月(当前月份和前12个月)发送和接收的邮件数量。我正在使用Google图表。当我没有使用AJAX的时候,它可以工作,但使用AJAX Google图表不起作用 - 整个页面变成空白,控制台中也没有例外。这里是我的代码:谷歌图表不能正常工作

<script type="text/javascript" src="https://www.google.com/jsapi"></script> 
<script type="text/javascript"> 
    $(document).ready(function() { 
     var params = { 
      "email": "{{ statistics_user_email }}", 
      "today_email_statistics_query_job_json": JSON.stringify({{ today_email_statistics_query_job_json|safe }}), 
      "this_month_email_statistics_query_job_json": JSON.stringify({{ this_month_email_statistics_query_job_json|safe }}), 
      "last_13_months_monthly_email_statistics_query_job_json": JSON.stringify({{ last_13_months_monthly_email_statistics_query_job_json|safe }}) 
     }; 

     function try_ajax() { 
      $.ajax({ 
       type: 'POST', 
       url: '/ajax/user/email_statistics', 
       data: params, 
       success: function(reply) { 
        if (reply.wait === true) { 
         // Try again after 4 seconds. 
         setTimeout(try_ajax, 4000); 
        } else if (reply.ready === true) { 
         function drawTitleSubtitle() { 
          var data = new google.visualization.DataTable(); 
          data.addColumn('string', 'Month'); 
          data.addColumn('number', 'Emails sent'); 
          data.addColumn('number', 'Emails received'); 

          var rows = []; 
          for (var i = 0; i < reply["last_13_months_monthly_email_statistics"].length; i++) { 
           var row = reply["last_13_months_monthly_email_statistics"][i]; 
           rows.push([row["month"], row["sent"], row["received"]]); 
          } 
          data.addRows(rows); 

          var options = { 
           'title': 'How Many Vegan Cheeseburgers I Ate Last Night', 
           'width': 400, 
           'height': 300 
          }; 

          var material = new google.charts.Bar(document.getElementById('last-13-month-chart-div')); 
          material.draw(data, options); 
         } 

         $("#today-emails-sent-span").html(reply["today_email_statistics"]["messages_sent"]); 
         $("#today-emails-received-span").html(reply["today_email_statistics"]["messages_received"]); 
         $("#this-month-emails-sent-span").html(reply["this_month_email_statistics"]["messages_sent"]); 
         $("#this-month-emails-received-span").html(reply["this_month_email_statistics"]["messages_received"]); 
         google.load('visualization', '1', {packages: ['corechart', 'bar']}); 
         google.setOnLoadCallback(drawTitleSubtitle); 
         $("#please-wait-div").addClass("hidden"); 
         $("#email-statistics-div").removeClass("hidden"); 
        } else { 
         console.error("AJAX returned unexpected results!", reply); 
        } 
       } 
      }); 
     } 

     try_ajax(); 
    }); 
</script> 

当我评论以下行,它的工作原理没有图表:

     google.load('visualization', '1', {packages: ['corechart', 'bar']}); 
         google.setOnLoadCallback(drawTitleSubtitle); 

的AJAX返回此对象一次:

{"wait": true} 

了第二遍:

{"ready": true, "last_13_months_monthly_email_statistics": [{"received": 23, "sent": 2, "month": "2015-10"}, {"received": 15, "sent": 4, "month": "2015-11"}], "this_month_email_statistics": {"messages_received": 15, "messages_sent": 4}, "today_email_statistics": {"messages_received": 0, "messages_sent": 1}} 

我是不包括HTML,但页面上存在所有元素。除了图表之外的所有东西都可以工作,在我没有使用AJAX的时候,这个工作方式很有用。问题是什么?

顺便说一句,我只加载了本月和上个月的数据,这不是一个错误。未来我们可以显示前12个月。

我试图在功能drawTitleSubtitle()中使用console.log,但它似乎根本没有被调用。但在AJAX返回结果(第二次调用结果)后<html>内部没有<body>

JS小提琴 - http://jsfiddle.net/uriwise/Lpsb0tqn/

+1

也许谷歌不喜欢的素食干酪牛肉三明治这是:) –

+2

@ T3H40比萨饼(从https://google-developers.appspot.com/chart复制/ interactive/docs/quick_start),我改变了它::-) – Uri

+1

你走了!问题解决,修复和关闭。 –

回答

1

你看到的行为(“drawTitleSubtitle() [...]似乎并没有被称为”)主要是由于操作的执行顺序。

因为你加载所需的软件包(google.load(...))和内$(document).ready()设置所需的回调(google.setOnLoadCallback(...)),谷歌的API图表无法引用所需的回调(drawTitleSubtitle())时,最终被装入包。

您应该定义drawTitleSubtitle(),加载所需的包(google.load(...))并在输入$(document).ready()之前设置所需的回调google.setOnLoadCallback(...)

$(document).ready()之内,try_ajax()应当调用drawTitleSubtitle(),同时传递来自/ajax/user/email_statistics的期望的Ajax响应。

0

最终我做了Lee建议的功能,并且在不等待$(document).ready()的情况下调用google函数。这里是我的代码:

编辑:我把我的代码分成3个独立的函数,并在调用它们时传递参数。

<script type="text/javascript" src="https://www.google.com/jsapi"></script> 
<script type="text/javascript"> 
    function draw_google_chart(ajax_reply) { 
     var data = new google.visualization.DataTable(); 
     data.addColumn('string', 'Month'); 
     data.addColumn('number', 'Emails sent'); 
     data.addColumn('number', 'Emails received'); 

     var rows = []; 
     for (var i = 0; i < ajax_reply["last_13_months_monthly_email_statistics"].length; i++) { 
      var row = ajax_reply["last_13_months_monthly_email_statistics"][i]; 
      rows.push([row["month"], row["sent"], row["received"]]); 
     } 
     data.addRows(rows); 

     var options = { 
      'title': 'How Many Vegan Cheeseburgers I Ate Last Night', 
      'width': 400, 
      'height': 300 
     }; 

     var material = new google.charts.Bar(document.getElementById('last-13-month-chart-div')); 
     material.draw(data, options); 
    } 

    function try_ajax(ajax_params) { 
     $.ajax({ 
      type: 'POST', 
      url: '/ajax/user/email_statistics', 
      data: ajax_params, 
      success: function(ajax_reply) { 
       if (ajax_reply.wait === true) { 
        // Try again after 4 seconds. 
        setTimeout(function() { 
         try_ajax(ajax_params); 
        }, 4000); 
       } else if (ajax_reply.ready === true) { 
        $("#today-emails-sent-span").html(ajax_reply["today_email_statistics"]["messages_sent"]); 
        $("#today-emails-received-span").html(ajax_reply["today_email_statistics"]["messages_received"]); 
        $("#this-month-emails-sent-span").html(ajax_reply["this_month_email_statistics"]["messages_sent"]); 
        $("#this-month-emails-received-span").html(ajax_reply["this_month_email_statistics"]["messages_received"]); 
        draw_google_chart(ajax_reply); 
        $("#please-wait-div").addClass("hidden"); 
        $("#email-statistics-div").removeClass("hidden"); 
       } else { 
        console.error("AJAX returned unexpected results!", ajax_reply); 
       } 
      } 
     }); 
    } 

    function try_ajax_first_time() { 
     $(document).ready(function() { 
      var ajax_params = { 
       "email": "{{ statistics_user_email }}", 
       "today_email_statistics_query_job_json": JSON.stringify({{ today_email_statistics_query_job_json|safe }}), 
       "this_month_email_statistics_query_job_json": JSON.stringify({{ this_month_email_statistics_query_job_json|safe }}), 
       "last_13_months_monthly_email_statistics_query_job_json": JSON.stringify({{ last_13_months_monthly_email_statistics_query_job_json|safe }}) 
      }; 

      try_ajax(ajax_params); 
     }); 
    } 

    google.load('visualization', '1', {packages: ['corechart', 'bar']}); 
    google.setOnLoadCallback(try_ajax_first_time); 
</script> 

请注意,功能try_ajaxdraw_google_chart$(document).ready()后总是叫,从来没有(因为我需要的HTML元素是在DOM)。

JS小提琴 - http://jsfiddle.net/uriwise/tp1xhun0/

但是,如果我叫内$(document).ready()google功能,然后它不工作,我再次得到了空白页。我没有找到这个文件对谷歌的网站:

$(document).ready(function() { 
    google.load('visualization', '1', {packages: ['corechart', 'bar']}); 
    google.setOnLoadCallback(try_ajax_first_time); 
});