Nota: quanto segue è utile per evitare ritardi: è giusto in tempo. L'esempio può essere utilizzato generalmente da tutti gli script (che lo richiedono), ma è stato particolarmente utilizzato con Greasemonkey. Utilizza anche l'API del grafico di Google come esempio, ma questa soluzione va oltre ad altre API di Google e può essere utilizzata ovunque sia necessario attendere il caricamento di uno script.
L'utilizzo di google.load con una richiamata non ha risolto il problema quando si utilizzava Greasemonkey per aggiungere un grafico di Google. Nel processo (Greasemonkey iniettato nella pagina), viene aggiunto il nodo script www.google.com/jsapi. Dopo aver aggiunto questo elemento per jsapi javascript di Google, lo script iniettato (o pagina) è pronto per utilizzare il comando google.load (che deve essere caricato nel nodo aggiunto), ma questo script jsapi non è stato ancora caricato. L'impostazione di un timeout ha funzionato, ma il timeout era solo una soluzione alternativa per la corsa temporale del caricamento dello script jsapi di Google con lo script iniettato / page. Spostarsi nel punto in cui uno script esegue google.load (e possibilmente google.setOnLoadCallback) può influire sulla situazione della corsa ai tempi. Quanto segue offre una soluzione che attende il caricamento dell'elemento script di Google prima di chiamare google.load. Ecco un esempio:
// ********* 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";