Ответ 1
google.setOnLoadCallback с jQuery $(document).ready(), нормально ли смешивать?
вероятно, самый близкий ответ, и ответ Райана Уайла на следующее также может быть полезным.
У меня есть несколько функций, которые создают различные диаграммы с помощью API графиков Google.
Когда я вызываю их без метода jQuery $(document).ready
, все работает нормально. Но с этим методом я смотрю на пустой экран.
Почему?
<script type="text/javascript" src = "http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js" charset="utf-8"></script>
<script type="text/javascript" src = "http://www.google.com/jsapi" charset="utf-8"></script>
function drawColumnChart1(){..some code..}
function drawColumnChart2(){..some code..}
function drawGeoChart(){.some code..}
//This works fine.
google.load("visualization", "1", {packages:["piechart", "corechart", "geomap"]});
google.setOnLoadCallback(window.drawColumnChart1);
google.setOnLoadCallback(window.drawColumnChart2);
google.setOnLoadCallback(window.drawGeoChart);
//This doesn't work
$(document).ready(function(){
google.load("visualization", "1", {packages:["piechart", "corechart", "geomap"]});
google.setOnLoadCallback(window.drawColumnChart1);
google.setOnLoadCallback(window.drawColumnChart2);
google.setOnLoadCallback(window.drawGeoChart);
});
UPDATE Вот ошибка, которую я получаю в Firebug:
uncaught exception: [Exception... "Could not convert JavaScript argument" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: http://www.google.com/jsapi :: Q :: line 20" data: no]
http://www.google.com/jsapi
Line 22
google.setOnLoadCallback с jQuery $(document).ready(), нормально ли смешивать?
вероятно, самый близкий ответ, и ответ Райана Уайла на следующее также может быть полезным.
В соответствии с документацией по визуализации google вам необходимо загрузить визуальный пакет (s) до в onload или jquery ready. Я предлагаю загрузить сразу после ссылки jsapi script, как показано ниже.
В противном случае вы получите 1) Google не определен (ссылка ошибка) или 2), если использовать ajax, возможно, пустой ответ и пустую страницу без ошибок.
последовательность загрузки: (используя ваш пример)
<script type="text/javascript" src = "http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.js" charset="utf-8"></script>
<script type="text/javascript" src = "http://www.google.com/jsapi" charset="utf-8"></script>
<script type="text/javascript">
google.load("visualization", "1", {packages:["piechart", "corechart", "geomap"]});
</script>
$(document).ready(function(){
google.setOnLoadCallback(window.drawColumnChart1);
google.setOnLoadCallback(window.drawColumnChart2);
google.setOnLoadCallback(window.drawGeoChart);
});
Вот парадигма, которую я использую. Установите обратный вызов для метода google.load и вообще не используйте google.setOnLoadCallback(AFAIK это не нужно).
MyChart.prototype.render = function() {
var self = this;
google.load("visualization",
"1",
{ callback: function() { self.visualize(); },
packages: ["corechart"] }
);
}
MyChart.prototype.visualize = function() {
var data = google.visualization.arrayToDataTable(
[
['Year', 'Sales', 'Expenses'],
['2004', 1000, 400],
['2005', 1170, 460],
['2006', 660, 1120],
['2007', 1030, 540]
]);
var options = {
title: 'Company Performance',
hAxis: {title: 'Year', titleTextStyle: {color: 'red'}}
};
var chart = new google.visualization.ColumnChart(document.getElementById("mychart_div"));
chart.draw(data, options);
}
Привет, это решение не сработало для меня, по-видимому (я предполагаю, что я не уверен). В библиотеке google есть некоторые проблемы с областью, когда вы вызываете ее внутри объекта jquery, поэтому решение довольно просто (хотя и получено было не так просто: s) определить глобальную переменную и назначить библиотеку google:
var localGoogle = google;
выглядит смешно huh:)... затем используйте переменную, которую вы определили, чтобы invoque setOnCallback, он работал у меня, я надеюсь, что это сработает для вас.
$(document).ready(function(){
localGoogle.setOnLoadCallback(window.drawColumnChart1);
}
Попробуйте закрыть вызов ready
?
$(document).ready(function(){
...
});
^^^
Для альтернативного решения вы можете использовать "автозагрузку" для включения пакетов, которые вы хотите в тег script. Это отрицает необходимость "google.setOnLoadCallback".
Подробнее см. https://developers.google.com/loader/#AutoLoading.
Итак, вы можете делать все, как обычно, из события готовности к jQuery.
Существует также мастер, который может настроить URL-адрес для вас, но в настоящее время ссылка не работает. Здесь все равно: http://code.google.com/apis/loader/autoloader-wizard.html
вы можете позвонить https://www.google.com/jsapi вместо http://www.google.com/jsapi
удача
Это работает для меня:
google.load("visualization", "1", {packages:["corechart"],
callback:function(){drawChart();}});
//google.setOnLoadCallback(drawChart);
function drawChart() {
console.log("enter draw");
var data = google.visualization.arrayToDataTable([
['Year', 'value', { role: 'style' } ],
['2010', 10, ' color: gray'],
['2010', 200, 'color: #76A7FA'],
['2020', 16, 'opacity: 0.2'],
['2040', 22, 'stroke-color: #703593; stroke-width: 4; fill-color: #C5A5CF'],
['2040', 28, 'stroke-color: #871B47; stroke-opacity: 0.6; stroke-width: 8;
fill-color: #BC5679; fill-opacity: 0.2']
]);
var view = new google.visualization.DataView(data);
var options = {
title: 'Company Performance',
tooltip: {isHtml: false},
legend: 'none',
};
var chart = new google.visualization.ColumnChart(document.getElementById('chart_div'));
chart.draw(view, options);
}
Демо: jsfiddle
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script>
<script type="text/javascript">
google.load("visualization", "1", {packages:["corechart"]});
function drawChart(gtitle,glabel,gwidth,gheight,gtype,gstart,gend,gid) {
$.ajax({
url: "http://localhost/reporte/response.php",
type: "GET",
dataType: "JSON",
cache: false,
async: false,
data: {start:gstart,end:gend,id:gid},
success: function(data) {
var len = 0;
if (data.length)
{
len = data.length;
}
if(len > 0)
{
dataarray = [[gtitle,glabel]];
for (var i = 0; i< len; i++) {
dataarray.push([data[i].label,data[i].value]);
}
}
else if(len==0)
{
}
},
error:function(data)
{
}
});
var values = new google.visualization.arrayToDataTable(dataarray);
var options = {title: gtitle,width:gwidth,height:gheight};
switch(gtype){
case 'PieChart':
var chart = new google.visualization.PieChart(document.getElementById('chart'));
break;
case 'LineChart':
var chart = new google.visualization.LineChart(document.getElementById('chart'));
break;
case 'ColumnChart':
var chart = new google.visualization.ColumnChart(document.getElementById('chart'));
break;
case 'AreaChart':
var chart = new google.visualization.ColumnChart(document.getElementById('chart'));
break;
}
chart.draw(values, options);
}
$(document).ready(function(){
//drawChart('Titulo del Grafico','Tickets',800,800,'PieChart',20141001,20141010,'procedure1');
//drawChart('Titulo del Grafico','Tickets',400,400,'ColumnChart',20141001,20141010,'procedure2');
//drawChart('Titulo del Grafico','Tickets',400,400,'LineChart',20141001,20141010,'procedure3');
drawChart('Titulo del Grafico','Tickets',600,400,'AreaChart',20141001,20141010,'procedure4');
});
</script>
</head>
<body>
<div id="chart"></div>
</body>
</html>