Nota: quanto segue è un buon modo per evitare ritardi - è appena in tempo. L'esempio può essere usato generalmente da tutti gli script (che ne hanno bisogno), ma è stato particolarmente utilizzato con Greasemonkey. Ad esempio, utilizza l'API del grafico di Google, ma questa soluzione va oltre alle altre API di Google e può essere utilizzata ovunque sia necessario attendere il caricamento di uno script.
L'utilizzo di google.load con un callback non ha risolto il problema quando si utilizza Greasemonkey per aggiungere un grafico di Google. Nel processo (Greasemonkey immesso nella pagina), viene aggiunto il nodo di 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 del timeout ha funzionato, ma il timeout era semplicemente una soluzione alternativa per la corsa dei tempi del carico di script di jsapi di Google con lo script di input/page. Spostarsi dove uno script esegue il google.load (ed eventualmente google.setOnLoadCallback) può influenzare la situazione della corsa a tempo. 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";
bella domanda, ecco un link: http://friendlybit.com/js/lazy-loading -asyncronous-javascript/(in altre parole: nessun indizio) – mindandmedia
ho notato che document.write ('qualsiasi cosa') cancellerà anche l'html precedente, forse il documento è fuori questione nel contesto di settimeout? – mindandmedia