示例代码: 这两个似乎都可以正常工作,以显示一条消息:
google.load("visualization", "1", { packages: ["corechart"] });
...
$(document).ready(function () {
google.setOnLoadCallback(function () {
alert('from inside ready 1');
});
});
$(document).ready(function () {
google.setOnLoadCallback(alert('from inside ready 2'));
});
注意:我使用 alert(..( 只是为了调试目的 - 我的真实代码绘制图表。现在,我想在 $.ajax 中使用这些技术,例如:
$.ajax({
type: "POST",
...
success: function (result) {
if (result.d) {
$(document).ready(function () {
alert('sucess');
// option 1
google.setOnLoadCallback(function () {
alert('from inside ready 3');
});
// option 2
// google.setOnLoadCallback(alert('from inside ready 4'));
});
现在,在 ajax 成功时,我可以看到显示"成功",但选项 1 似乎不起作用。 即我没有看到"从内部准备好 3"。如果我在选项 2 处启用代码,并注释掉选项 1 的代码,我确实会看到"从内部准备好 4"。
因此,似乎选项 2 有效,但选项 1 不适用于 jquery ajax 调用。谁能说出一些启示?选项 2 100% 安全使用吗?它似乎有效,但我看到的所有示例似乎都使用选项 1。
首先,您使用的是旧版本的Google图表,jsapi
库应该不再使用
,请参阅发行说明...
通过
jsapi
加载程序提供的 Google 图表版本不再持续更新。请从现在开始使用新的静态loader.js
。
旧:<script src="https://www.google.com/jsapi"></script>
电流:<script src="https://www.gstatic.com/charts/loader.js"></script>
这只会更改加载语句...
从。。。
google.load("visualization", "1", { packages: ["corechart"] });
自。。。
google.charts.load("current", { packages: ["corechart"] });
接下来,你不需要每次需要绘制图表时都使用回调,只需要使用一次,
以确保谷歌图表已经加载。
并且有几种使用回调的方法,
可以使用更新的setOnLoadCallback
函数。
google.charts.setOnLoadCallback(drawChart);
或者,您可以将回调直接放在load
语句中。
google.charts.load('current', {
callback: drawChart,
packages: ['corechart']
});
或者我更喜欢的,它回报的承诺。(谷歌包括一个用于IE的承诺polyfill(
google.charts.load('current', {
packages: ['corechart']
}).then(drawChart);
现在到手头的问题,
Google 的load
语句默认会等待文档加载,
所以你可以用google.charts.load
代替$(document).ready
建议先加载Google,然后使用Ajax获取数据,然后绘制图表。
类似于以下设置...
google.charts.load('current', {
packages: ['corechart']
}).then(function () {
// get data for chart 1
$.ajax({
type: 'POST',
...
}).done(function (result) {
drawChart1(result.d);
}).fail(function (jqXHR, status, errorThrown) {
console.log(errorThrown);
});
// get data for chart 2
$.ajax({
type: 'POST',
...
}).done(function (result) {
drawChart2(result.d);
}).fail(function (jqXHR, status, errorThrown) {
console.log(errorThrown);
});
});
function drawChart1(chartData) {
...
}
function drawChart2(chartData) {
...
}