Firefox - Dynamically embed an <svg> element in SVG

I am trying to dynamically add an element <svg>to an existing SVG island in an XHTML page (Firefox 3.6.3). And this is a browser crash.

Done manually, this works as expected:

<svg xmlns="http://www.w3.org/2000/svg">
    <svg xmlns="http://www.w3.org/2000/svg">
        ...         
    </svg>
</svg>

However, if you dynamically add this element using JavaScript, the browser will crash. A simple example:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>SVG island example</title>
    <script type="text/javascript"><![CDATA[
        function crash( )
        {
            svgs = document.getElementsByTagNameNS( "http://www.w3.org/2000/svg", "svg" );

            for ( var i = 0; i < svgs.length; i++ )
            {
                var e = document.createElementNS( "http://www.w3.org/2000/svg", "svg" );
                svgs[i].appendChild( e );
            }
        }
    ]]></script>
</head>
<body>
    <svg id="mySVG" xmlns="http://www.w3.org/2000/svg">
    </svg>
    <button onclick="crash()">Crash Firefox</button>
</body>
</html>

Interestingly, if I do getElementById, it works great. Interesting, but not particularly useful in my situation, since I keep pointers to SVGDocuments. Example:

function doesntCrash( )
{
    var svg = document.getElementById( "mySVG" );
    var e = document.createElementNS( "http://www.w3.org/2000/svg", "svg" );
    svg.appendChild( e );
}

As far as I can tell, this is a Firefox bug. Does anyone have an understanding of this issue?

(): , "" HTMLCollection, getElementsByTagNameNS, (tsk, tsk!). , . , . :

function doesntCrash( )
{
    var svgs = document.getElementsByTagNameNS( "http://www.w3.org/2000/svg", "svg" );

    // copy contents to native a static, array
    svgs = Array.prototype.slice.call( svgs );

    for ( var i = 0; i < svgs.length; i++ )
    {
        var e = document.createElementNS( "http://www.w3.org/2000/svg", "svg" );
        svgs[i].appendChild( e );
    }
}

!

+3
1

, , NodeSet, getElementByTagName (NS) (, , querySelectorAll). , "svg" SVG, "svg" , , . script , , .

+1

Source: https://habr.com/ru/post/1746611/


All Articles