注:以下は時間遅延を回避するのに適しています-ちょうど間に合います。この例は、一般的にすべてのスクリプトで使用できます(必要です)が、特にGreasemonkeyで使用されました。また、例としてGoogleチャートAPIを使用していますが、このソリューションは他のGoogle APIにとどまらず、スクリプトが読み込まれるのを待つ必要がある場所であればどこでも使用できます。
コールバックでgoogle.loadを使用しても、Greasemonkeyを使用してGoogleチャートを追加するときの問題は解決しませんでした。プロセス(Greasemonkeyがページに挿入される)では、www.google.com / jsapiスクリプトノードが追加されます。この要素をGoogleのjsapi javascriptに追加すると、注入された(またはページの)スクリプトはgoogle.loadコマンドを使用する準備が整います(追加されたノードにロードする必要があります)が、このjsapiスクリプトはまだロードされていません。タイムアウトの設定は機能しましたが、タイムアウトは、注入された/ページスクリプトを使用したGoogle jsapiスクリプトロードのタイミングレースの回避策にすぎませんでした。スクリプトがgoogle.load(場合によってはgoogle.setOnLoadCallback)を実行する場所を移動すると、タイミングレースの状況に影響を与える可能性があります。以下は、google.loadを呼び出す前にgoogleスクリプト要素が読み込まれるのを待つソリューションを提供します。次に例を示します。
// ********* 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";