TypeError:google.visualization.DataTable不是构造函数

时间:2015-09-08 12:55:13

标签: javascript charts google-visualization

在我的网页上,我有一张谷歌地图,以及三张图表。当页面加载时,地图很好,但图表要么不加载,要么只加载一两个。继续收到错误TypeError:google.visualization.DataTable不是构造函数。

function load() {
     //map object
        var MY_MAP = new google.maps.Map(document.getElementById("map"), {
        center: {lat: 54.870902, lng: -6.300565}, 
        zoom: 14
      });    
      //call to get and process data
      downloadUrl("Map.php", processXML);
  }  

 // Load the Visualization API and the piechart package.
      google.load('visualization', '1.0', {'packages':['corechart']}); 
        // Set a callback to run when the Google Visualization API is loaded. 
google.setOnLoadCallback(drawAltitudeChart());  
google.setOnLoadCallback(drawDisplacementChart());
google.setOnLoadCallback(drawDistanceChart());  



function drawAltitudeChart(){

         //console.log('hello');
         var graph = [];
          downloadUrl("Map.php", function (data){
              var xml = data.responseXML;
              var markers = xml.documentElement.getElementsByTagName("marker");
              var dataTable = new google.visualization.DataTable();
              var options = {title:'Altitude (m above sea level)', 
                  curveType:'function', 
                  legend:{position:'bottom'},
                  is3d:true     
              };
              var chart;

              for(var i = 0; i<markers.length; i++){
                  graph[i] = ['', parseInt(markers[i].getAttribute("alt"))];   
              }

              dataTable.addColumn('string', 'id');
              dataTable.addColumn('number', 'Altitude');
              dataTable.addRows(graph);


              chart = new google.visualization.LineChart(document.getElementById('curve_chart'));
              chart.draw(dataTable, options); 

          });
      }  

3 个答案:

答案 0 :(得分:12)

我认为你不能像这样添加多个回调。

此外,您可以在load方法中定义回调,如此...

google.load('visualization', '1.0', {'packages':['corechart'], 'callback': drawCharts});

function drawCharts() {
  drawAltitudeChart();
  drawDisplacementChart();
  drawDistanceChart();
}

编辑

以上load声明适用于较旧库...

<script src="http://www.google.com/jsapi"></script>

根据release notes ...

  

通过jsapi加载程序保留的Google图表版本不再一致更新。从现在开始请使用新的gstatic装载机。

使用库...

<script src="https://www.gstatic.com/charts/loader.js"></script>

load语句更改为...

google.charts.load('current', {'packages': ['corechart'], 'callback': drawCharts});

编辑2

您还可以在一个load声明中加载所需的所有包,例如
而不是......

google.charts.load('current', { 'packages': ['table'] });
google.charts.load('current', { 'packages': ['bar'] });
google.charts.load('current', { 'packages': ['pie'] });  // <-- 'pie' package does not exist
google.charts.load('current', { 'packages': ['corechart'] });
google.charts.setOnLoadCallback(drawCharts);

它应该是......

google.charts.load('current', {
  callback: drawCharts,
  packages: ['bar', 'corechart', 'table']
});

答案 1 :(得分:2)

我收到了相同的消息,但仅仅是因为我忘了加载包

  // was -> google.charts.load('current', {'packages':['bar', 'corechart']});
  google.charts.load('current', {'packages':['bar', 'corechart', 'table']});

答案 2 :(得分:0)

即使您使用正确的策略,即加载谷歌图表并在加载事件上使用回调,也有必要将脚本保留在 head 标记中,这与我们将脚本保留在底部以防止页面加载缓慢不同。

>

我直接从谷歌图表的文档中引用了这一点:

除了少数例外,所有带有 Google Charts 的网页都应在网页的 <head> 中包含以下几行:

<script src="https://www.gstatic.com/charts/loader.js"></script>
<script>
  google.charts.load('current', {packages: ['corechart']});
  google.charts.setOnLoadCallback(drawChart);
  ...
</script>

参考:Basic Chart Loading

P.S:我遵循了每个细节,但没有将加载脚本保留在 head 标签中,我不断收到此错误 TypeError: google.visualization.arrayToDataTable is not a function 。将脚本保留在 head 标签中解决了这个问题。