Google 未为 setOnLoadCallback 定义可视化
Google visualization undefined for setOnLoadCallback
我正在使用 Google Geocharts 并按照 Google 的文档 (https://developers.google.com/chart/interactive/docs/gallery/geochart?hl=en) 设置这样的图表:
google.charts.load('current', {'packages':['geochart']});
google.setOnLoadCallback(drawRegionsMap);
function drawRegionsMap() {
...
var data = google.visualization.arrayToDataTable(a1);
var options = {};
var chart = new google.visualization.GeoChart(document.getElementById('div_geochart'));
chart.draw(data, options);
};
array a1 是全局定义的。脚本包含行出现在 header 中。问题是,有时我会收到一条错误消息:
Uncaught TypeError: Cannot read property 'arrayToDataTable' of undefined
图表未加载。真正的问题是很难查明问题所在,因为它并不总是发生。好像有时候google.visualization还没有设置?但是,使用 setOnLoadCallback 调用 drawRegionsMap 的全部意义不在于,它会在 google.visualization 成功设置后调用吗?
我确实尝试更改 setOnLoadCallback 行的位置,如此处所述:Google Visualization - TypeError: Cannot read property 'DataTable' of undefined [Chrome specific]。我也将这两行放在页面的 <head>
部分,但有时仍然会出现错误(在 Chrome 和 IE 中测试)。
有人可以指点一下如何避免出现此错误吗?
我通常会等待 load
事件,然后再加载 google。
您还可以在 google.charts.load
语句中定义 callback
函数。
var a1 = [
['Country', 'Popularity'],
['Germany', 200],
['United States', 300],
['Brazil', 400],
['Canada', 500],
['France', 600],
['RU', 700]
];
// wait for page to load
window.addEventListener('load', loadGoogle, false);
function loadGoogle() {
// define callback in load statement
google.charts.load('current', {'packages':['geochart'], 'callback': drawRegionsMap});
}
function drawRegionsMap() {
var data = google.visualization.arrayToDataTable(a1);
var options = {};
var chart = new google.visualization.GeoChart(document.getElementById('div_geochart'));
chart.draw(data, options);
};
<script src="https://www.gstatic.com/charts/loader.js"></script>
<script src="https://www.google.com/jsapi"></script>
<div id="div_geochart"></div>
请注意 google.setOnLoadCallback 不同于 google.charts.setOnLoadCallback。如果您使用 google.charts.load(),您还需要使用 google.charts.setOnLoadCallback()。他们一起去。
此外,由于您使用的是 GeoChart,您可能还需要加载 jsapi 加载程序,它用于通过 Google 地图加载地理编码数据。但是,对于最新版本,这不再适用,但如果您使用的是旧版本,则仍然适用。所以你的文档应该看起来像这样:
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.charts.load('current', {'packages':['geochart']});
google.charts.setOnLoadCallback(drawSomeGeoChart);
function drawSomeGeoChart() {
...
}
</script>
在 off-chance 中,有人遇到了与我相同的问题:使用 setTimeout()
构建一个小延迟
由于某些原因,当我结合 loader.js
VueJS 时,回调函数没有完成它的工作。经过一些挖掘和构建延迟 - VOILA!地图 :)
这是我的解决方法:
在头部添加 <script>
标签并使用 "defer"。
<head>
<script defer async=false src="https://www.google.com/jsapi"></script>
<script defer src="https://www.gstatic.com/charts/loader.js"></script>
</head>
我正在使用 Google Geocharts 并按照 Google 的文档 (https://developers.google.com/chart/interactive/docs/gallery/geochart?hl=en) 设置这样的图表:
google.charts.load('current', {'packages':['geochart']});
google.setOnLoadCallback(drawRegionsMap);
function drawRegionsMap() {
...
var data = google.visualization.arrayToDataTable(a1);
var options = {};
var chart = new google.visualization.GeoChart(document.getElementById('div_geochart'));
chart.draw(data, options);
};
array a1 是全局定义的。脚本包含行出现在 header 中。问题是,有时我会收到一条错误消息:
Uncaught TypeError: Cannot read property 'arrayToDataTable' of undefined
图表未加载。真正的问题是很难查明问题所在,因为它并不总是发生。好像有时候google.visualization还没有设置?但是,使用 setOnLoadCallback 调用 drawRegionsMap 的全部意义不在于,它会在 google.visualization 成功设置后调用吗?
我确实尝试更改 setOnLoadCallback 行的位置,如此处所述:Google Visualization - TypeError: Cannot read property 'DataTable' of undefined [Chrome specific]。我也将这两行放在页面的 <head>
部分,但有时仍然会出现错误(在 Chrome 和 IE 中测试)。
有人可以指点一下如何避免出现此错误吗?
我通常会等待 load
事件,然后再加载 google。
您还可以在 google.charts.load
语句中定义 callback
函数。
var a1 = [
['Country', 'Popularity'],
['Germany', 200],
['United States', 300],
['Brazil', 400],
['Canada', 500],
['France', 600],
['RU', 700]
];
// wait for page to load
window.addEventListener('load', loadGoogle, false);
function loadGoogle() {
// define callback in load statement
google.charts.load('current', {'packages':['geochart'], 'callback': drawRegionsMap});
}
function drawRegionsMap() {
var data = google.visualization.arrayToDataTable(a1);
var options = {};
var chart = new google.visualization.GeoChart(document.getElementById('div_geochart'));
chart.draw(data, options);
};
<script src="https://www.gstatic.com/charts/loader.js"></script>
<script src="https://www.google.com/jsapi"></script>
<div id="div_geochart"></div>
请注意 google.setOnLoadCallback 不同于 google.charts.setOnLoadCallback。如果您使用 google.charts.load(),您还需要使用 google.charts.setOnLoadCallback()。他们一起去。
此外,由于您使用的是 GeoChart,您可能还需要加载 jsapi 加载程序,它用于通过 Google 地图加载地理编码数据。但是,对于最新版本,这不再适用,但如果您使用的是旧版本,则仍然适用。所以你的文档应该看起来像这样:
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.charts.load('current', {'packages':['geochart']});
google.charts.setOnLoadCallback(drawSomeGeoChart);
function drawSomeGeoChart() {
...
}
</script>
在 off-chance 中,有人遇到了与我相同的问题:使用 setTimeout()
由于某些原因,当我结合 loader.js
VueJS 时,回调函数没有完成它的工作。经过一些挖掘和构建延迟 - VOILA!地图 :)
这是我的解决方法:
在头部添加 <script>
标签并使用 "defer"。
<head>
<script defer async=false src="https://www.google.com/jsapi"></script>
<script defer src="https://www.gstatic.com/charts/loader.js"></script>
</head>