I have an SVG page with some complex diagrams; I'm trying to add code that inserts even more complexity via an Ajax call on demand. This is mostly working, but the inserted nodes don't behave properly. In particular getBBox() fails on some elements, in Firefox the error is something like this:
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]
The problem seems to be related to this one: https://bugzilla.mozilla.org/show_bug.cgi?format=multiple&id=612118 but in my case the objects are definitely rendered, I can see them.
Any insight or workarounds appreciated. Unfortunately I can't easily point to an example since this relies on a server interaction.
See https://bugzilla.mozilla.org/show_bug.cgi?id=612118 (SVGLocatable.getBBox() fails unless the SVG element it is applied to is attached and rendered).
You must put your element to SVG and style.display must be non-"none".
See also SVG 'getBBox' fails in a jQueryUI tab
I workaround issue by placing text at invisible area ([-1000; -1000]):
getting width/height:
and placing text to necessary position after calculation with width/height (which require width/height in order to determine position of text):
The
NS_ERROR_FAILURE
error message, oralso occurs if you try to calculate the bounding box of an
SVGElement
which is attached directly to the HTML DOM and does not have a parentSVGSVGElement
. Examples (you can run the code in Scratchpad,Shift+F4
in Firefox):text
directly attached tobody
This fails because
<html><body><g></g></body></html>
is not allowed.text
attached tosvg
This works.