javascript - 使用javascript绘制条形图

标签 javascript jquery django

我正在尝试使用 jQuery 使用从服务器返回的值来绘制条形图。我使用以下代码,

我尝试使用变量data_list中的值绘制图表,问题是图表首先使用空值绘制,而我从服务器获取了值。

我是 Javascript 和 jQuery 的新手。提前致谢。

<html>
    <head>
    <title>the title</title>
       <script src="//code.jquery.com/jquery-1.9.1.js"></script>
       <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">   
       <script type="text/javascript" src="https://www.google.com/jsapi"></script>
       <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
        <script>
            $(function() {
            $( "#datepicker1" ).datepicker();
            $( "#datepicker2" ).datepicker();
            });
        </script>
       <script type="text/javascript" language="javascript">
        var data_list
        $(document).ready(function() {

                $.get('/api/', function(data) {            
                data_list = data;
                alert(data_list); // alert work second

              });  

        });
        alert('test')  // first this alert work
          google.load("visualization", "1", {packages:["corechart"]});
                      google.setOnLoadCallback(drawChart);
                      function drawChart() {

                        var data = google.visualization.arrayToDataTable(data_list);
                        var options = {
                          title: 'Company Performance',
                          hAxis: {title: 'Year', titleTextStyle: {color: 'red'}}
                        };

                        var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
                        chart.draw(data, options);
                      }   

        </script>

    </head>
    <body>
        <form>
            <p>Date1: <input type="text" id="datepicker1"></p>
            <p>Date2: <input type="text" id="datepicker2"></p>
        </form>

    <div id="chart_div" style="width: 900px; height: 500px;"></div>

    </body>
    </html>

最佳答案

JS 代码中有两部分。第一个是使用 AJAX 请求从 API 加载图表数据。第二个启动图表库并附加此行中的数据:

var data = google.visualization.arrayToDataTable(data_list);

问题是 ajax 请求是异步的,当您附加该数据时,数据尚未加载。 data_list var 在 AJAX 请求完成时可用,而不是在页面加载时可用。换句话说,您必须将图表的初始化和附加到图表的数据分开,或者简单地说:初始化图表、加载数据并在 AJAX 请求完成时将其设置到图表。您的代码(未经测试)的一个简单示例可能是:

 google.load("visualization", "1", {packages:["corechart"]});
 google.setOnLoadCallback(drawChart);
 function drawChart() {
     $(document).ready(function() {
         $.get('/api/', function(data) {            
              data_list = data;
              var data = google.visualization.arrayToDataTable(data_list);
              var options = {
                  title: 'Company Performance',
                  hAxis: {title: 'Year', titleTextStyle: {color: 'red'}}
              };

              var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
              chart.draw(data, options);
         });
     });  
 }   

请记住,此代码未经测试,它说明了正确初始化的想法: - 加载谷歌图表库 - 加载数据 - 数据加载后,初始化具体图表

异步加载给代码增加了一些复杂性,但它是使用 AJAX 和 DOM 事件进行 JavaScript 编程的基础。另一种更易读且更简单的选择是使用 jquery 延迟对象和 promise 。有关延迟和 promise 的更多信息: -http://api.jquery.com/category/deferred-object/ -http://www.html5rocks.com/en/tutorials/es6/promises/?redirect_from_locale=es

关于javascript - 使用javascript绘制条形图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22829622/

相关文章:

javascript - 如何在 Typescript 中为 webpack.config.ts 创建一个 switch case?

jquery - 来自非安全站点的 Wix 代码数据

jquery - "Microsoft JScript runtime error: ' $ ' is undefined"使用 Typescript 和 jQuery 时

django - 获取 django.db.utils.IntegrityError : duplicate key value violates unique constraint But value does not exists

django - 与 Django i18n 和 gettext 的词缀合

python - 在 Django 中按月分组并检索为 datetime.date()

javascript - Mootools:获取按键事件上的文本框文本

javascript - 如何从客户端使用 firestore 模拟器

javascript - 如何使用 Laravel WebSockets 通过 Laravel 中的 WebSocket 将消息从客户端发送回服务器?

jquery - 是否有某个版本的 jQuery 可以让我在不托管文件的情况下热链接到?