Google.load вызывает пустой dom/screen
Я пытаюсь добавить асинхронную визуализацию google, но у меня проблемы. Я сузил его до google.load, вызвав проблему. Когда google.load часть js работает, я получаю пустой экран /dom. Любой знает, что я делаю неправильно.
Я также попытался использовать google.setOnLoadCallback, получив тот же результат.
Любая помощь будет отличной
Соответствующий код:
$(document).ready(function () {
google.load('visualization', '1', { 'packages': ['geomap'] }, { 'callback': drawVisualization });
function drawVisualization() {
$.ajax({
type: "POST",
data: "{'monitorId':'" + monitor + "','monitorName':'" + name + "','context':'" + context + "'}",
dataType: "json",
url: "WebService.asmx/LoadMonitorToolGeo",
contentType: "application/json; charset=utf-8",
processData: true,
success: function (msg) {
var obj = jQuery.parseJSON(msg.d);
// $(msg.d).hide().appendTo("#sortable").fadeIn();
$("#" + obj.context).find(".toolContent").hide().html(obj.data).fadeIn();
DrawWorldMap(obj.map, obj.context);
},
error: function (req, status, error) {
},
complete: function (req, status) {
}
});
function DrawWorldMap(response, id) {
var data = new google.visualization.DataTable();
data.addRows(response.d.length);
data.addColumn('string', 'Country');
data.addColumn('number', 'Popularity');
for (var i = 0; i < response.d.length; i++) {
data.setValue(i, 0, response.d[i].Country);
data.setValue(i, 1, response.d[i].Popularity);
}
var options = {};
options['dataMode'] = 'regions';
var container = document.getElementById(id);
var geomap = new google.visualization.GeoMap(container);
geomap.draw(data, options);
}
});
Ответы
Ответ 1
Эта статья помогла мне:
Как динамически загружать API javascript Google Maps (по запросу)
В чем разница: callback
в атрибуте options метода load
:
var options = {packages: ['corechart'], callback : myCallback};
google.load('visualization', '1', options);
Я так считаю, что google.setOnLoadCallback(myCallback)
больше не понадобится, и, к счастью, кажется, что при добавлении callback
метод не будет очищать страницу.
Ответ 2
У меня была такая же проблема. Хотя моя работала в Chrome, она просто не работала в Firefox.
Мне пришлось добавить это, чтобы заставить его работать
setTimeout(function() {
// Google Visualization stuff goes here
}, 0);
см. здесь https://nealpoole.com/blog/2010/07/jquery-getjson-firefox-and-google-visualization-madness/
Кроме того, вы можете попробовать поставить
google.load('visualization', '1', { 'packages': ['geomap'] }, { 'callback': drawVisualization });
в заголовке вашего html в теге script и удалении его из функции $(document).ready
Ответ 3
Примечание. Следующее хорошо для всех javascript, но было сделано с Greasemonkey. Он также использует API диаграммы Google в качестве примера, но это решение выходит за рамки других API Google и может использоваться везде, где вам нужно дождаться, когда script загрузит БЕСПЛАТНЫЕ задержки, установленные таймерами.
Использование google.load с обратным вызовом не помогло решить проблему при использовании Greasemonkey для добавления диаграммы Google. В процессе (Greasemonkey вводится на страницу) добавляется www.google.com/jsapi script node. После добавления этого элемента в jsapi javascript Google введенная (или страница) script готова к использованию команды google.load(которая должна быть загружена в добавленный node), но этот jsapi script не сделал загрузите еще. Установка тайм-аута работала, но таймаут был всего лишь обходным решением для гонки jsapi script для загрузки Google при вводе/странице script. Перемещение туда, где script выполняет google.load(и, возможно, google.setOnLoadCallback), может повлиять на ситуацию с расчетом времени. Следующее предложение - это решение, ожидающее загрузки элемента google script перед вызовом google.load. Вот пример:
// ********* INJECTED SCRIPT *********//
// add element
var gscript = document.createElement('script');
gscript.setAttribute("type", "application/javascript");
gscript.setAttribute("id", "XX-GMPlusGoogle-XX");
document.body.appendChild(gscript);
// event listener setup
gscript.addEventListener("load",
function changeCB(params) {
gscript.removeEventListener("load", changeCB);
google.load("visualization", "1", {packages:["corechart"], "callback":
function drawChart() {
var data;
data = new google.visualization.arrayToDataTable(durationChart);
var options = {
title:"Chart Title",
legend: {position:"none"},
backgroundColor:"white",
colors:["white","Blue"],
width: window.innerWidth || document.body.clientWidth,
height: window.innerHeight || document.body.clientHeight,
vAxis: {title: "Durations", baselineColor: "black", textStyle:{fontSize:12}},
hAxis: {title: "Days Since First Instance"},
height: ((cnt > 5)? cnt * 50 : 300),
isStacked: true
}; // options
// put chart into your div element
var chart = new google.visualization.BarChart(document.getElementById('XX-ChartDiv-XX'));
chart.draw(data, options);
} // drawChart function
}); //packages within google.load & google load
} // callback changeCB
);
// can use SSL as "https://www.google.com/jsapi";
gscript.src = "http://www.google.com/jsapi";