Hinweis: Das Folgende ist gut, um eine Zeitverzögerung zu vermeiden - es ist gerade noch rechtzeitig. Das Beispiel kann allgemein von allen Skripten verwendet werden (die es benötigen), wurde jedoch insbesondere bei Greasemonkey verwendet. Es wird auch die Google-Diagramm-API als Beispiel verwendet. Diese Lösung geht jedoch über andere Google-APIs hinaus und kann überall dort verwendet werden, wo Sie auf das Laden eines Skripts warten müssen.
Die Verwendung von google.load mit einem Rückruf hat das Problem bei der Verwendung von Greasemonkey zum Hinzufügen eines Google-Diagramms nicht gelöst. Dabei wird der Skriptknoten www.google.com/jsapi hinzugefügt (Greasemonkey in Seite eingefügt). Nach dem Hinzufügen dieses Elements für das jsapi-Javascript von Google kann das injizierte (oder Seiten-) Skript den Befehl google.load verwenden (der in den hinzugefügten Knoten geladen werden muss), dieses jsapi-Skript wurde jedoch noch nicht geladen. Das Festlegen eines Timeouts funktionierte, aber das Timeout war nur eine Problemumgehung für das Timing-Rennen des Google jsapi-Skriptladens mit dem injizierten / page-Skript. Wenn Sie sich dort bewegen, wo ein Skript google.load (und möglicherweise google.setOnLoadCallback) ausführt, kann dies die Situation des Timing-Rennens beeinflussen. Im Folgenden wird eine Lösung angeboten, die darauf wartet, dass das Google Script-Element geladen wird, bevor google.load aufgerufen wird. Hier ist ein Beispiel:
// ********* 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;
// set the durationChart data (not in example)
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";