Remarque: ce qui suit est bon pour éviter un retard - c'est juste à temps. L'exemple peut être utilisé généralement par tous les scripts (qui en ont besoin), mais a été particulièrement utilisé avec Greasemonkey. Il utilise également l'API Google Chart comme exemple, mais cette solution va au-delà des autres API Google et peut être utilisée partout où vous devez attendre le chargement d'un script.
L'utilisation de google.load avec un rappel n'a pas résolu le problème lors de l'utilisation de Greasemonkey pour ajouter un graphique Google. Dans le processus (Greasemonkey injecté dans la page), le nœud de script www.google.com/jsapi est ajouté. Après avoir ajouté cet élément pour le javascript jsapi de Google, le script injecté (ou page) est prêt à utiliser la commande google.load (qui doit être chargée dans le nœud ajouté), mais ce script jsapi ne s'est pas encore chargé. La définition du délai d'expiration fonctionnait, mais le délai d'expiration était simplement une solution de contournement pour la course de synchronisation du chargement du script jsapi de Google avec le script injecté / page. Se déplacer où un script exécute google.load (et éventuellement google.setOnLoadCallback) peut affecter la situation de course chronométrée. Ce qui suit présente une solution qui attend le chargement de l'élément de script google avant d'appeler google.load. Voici un exemple:
// ********* 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";