今日、私は同様の問題に遭遇しました。外部フォントがまだロードされておらず、代わりに標準フォントが使用されているため、getBBox() が予期しない一時的なメトリックを返す可能性があるという Duopixel は正しいです。
WebKit の問題 (Chrome 24.0.1312.52 および 26.0.1389.0 canary でテスト済み) は、ページのどこかで最初に効果的に使用されるまで、ブラウザーが外部フォントの読み込みを延期することです。したがって、onreadystatechange が「完了」するのを待っても、getBBox() を呼び出すときにフォント メトリックが準備できているとは限りません。外部フォントでスタイル設定されたテキストをレンダリングし、それをドキュメントに挿入してすぐにその上で getBBox() (私の場合)。
mySVGInitCode() を直接呼び出す代わりに、私の回避策は次のとおりです。
$("body").append(
$("<div/>")
.attr("class", "force-external-font-loading")
.attr("style", "font-family: \"xkcd\";visibility:hidden;position:absolute")
.text("x")
);
setTimeout(function(){ mySVGInitCode() }, 100); // 100ms is just arbitrary waiting time which should be sufficient for fetching the external font on a fast network, anyone has a better solution?
ご覧のとおり、絶対位置にスタイル設定されたテキストを動的に挿入して、外部フォントの読み込みを強制しています (ここでは、display:none ではなく、visibility:hidden が重要です)。次に、何かをレンダリングする可能性のある SVG コードを実行する前にしばらく待ってから、すぐにメトリックを要求します。