8

いくつかの複雑な図を含むSVGページがあります。オンデマンドでAjax呼び出しを介して、さらに複雑なコードを追加しようとしています。これはほとんど機能していますが、挿入されたノードは正しく動作しません。特に、getBBox()は一部の要素で失敗しますが、Firefoxではエラーは次のようになります。

uncaught exception: [Exception... "Component returned failure code: 0x80004005  (NS_ERROR_FAILURE) [nsIDOMSVGLocatable.getBBox]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: http://localhost:1555/svg-scripts.js :: addBackground :: line 91"  data: no]

この問題は https://bugzilla.mozilla.org/show_bug.cgi?format=multiple&id=612118に関連しているようです が、私の場合、オブジェクトは確実にレンダリングされており、見ることができます。

洞察や回避策をいただければ幸いです。残念ながら、これはサーバーの相互作用に依存しているため、例を簡単に指摘することはできません。

4

2 に答える 2

8

https://bugzilla.mozilla.org/show_bug.cgi?id=612118を参照してください(SVGLocatable.getBBox()は、適用されるSVG要素がアタッチされてレンダリングされない限り失敗します)。

要素をSVGに配置する必要があり、style.displayは「none」以外である必要があります。

関連項目SVG'getBBox'がjQueryUIタブで失敗する

非表示領域( [-1000; -1000] )にテキストを配置することで問題を回避します:

function SVGlibText(x, y, text) {
    this.value = document.createElementNS(SVGlibBase.svgNS, "text");
    this.value.setAttribute("x", x);
    this.value.setAttribute("y", y);
    this.value.textContent = text;
}
SVGlibText.prototype.moveTo = function(x, y) {
    this.value.setAttribute("x", x);
    this.value.setAttribute("y", y);
    return this;
}
SVGlibText.prototype.getW = function() {
    return this.value.getBBox().width;
}
SVGlibText.prototype.getH = function() {
    return this.value.getBBox().height;
}

var text = new SVGlibText(-1000, -1000, "Hello world!");

幅/高さの取得:

var textW = text.getW();
var textH = text.getH();

幅/高さ(テキストの位置を決定するために幅/高さが必要)で計算した後、テキストを必要な位置に配置します。

text.moveTo(off, off + textH);
于 2013-01-21T11:40:31.110 に答える