Sebastian Philipp: (SVG) Was macht Firefox anders?

Hi,

Ich hab mich heute mal in Javascript versucht, allerdings nur mit mäßigem Erfolg. Vor allem der Firefox braucht vielleicht ein etwas weniger fehlerhaften Code. Laut DOM Inspector werden die mit appendChild erzeugen Kreise auch an die richtige Stelle eingefügt, nur ein getElementById gibt nur noch ein

Fehler: uncaught exception: [Exception... "Component returned failure code: 0x80004001 (NS_ERROR_NOT_IMPLEMENTED) [nsIDOMSVGSVGElement.getElementById]"  nsresult: "0x80004001 (NS_ERROR_NOT_IMPLEMENTED)"  location: "JS frame :: /*...*//test2.svg :: update :: line 14"  data: no]

aus. wenn alles funktioniert, müsste ein roter kreis an position 100;390 auftauchen, wenn zeite 14 nicht geht müsste der kreis zumindest an position 0;390 sein, er ist aber gar nicht da - wieso? Mit der Exception kann ich wenig anfangen. Opera und Konqueror machen keine Probleme.

<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:ev="http://www.w3.org/2001/xml-events"
    version="1.1" baseProfile="full"
    width="300" height="300" viewBox="-10 -10 420 420" onload="init(evt)" >
<defs>
 <script type="text/ecmascript"><![CDATA[
var svgdoc,svgroot;
var ary = new Array(40);
function update()
{
   var circle = "ci0";
   svgroot.getElementById(circle).setAttribute("cx" ,100); //line 14
}

function init(load_evt)
{
 svgdoc=load_evt.target.ownerDocument;
 svgroot=svgdoc.documentElement;
 var newCircle = document.createElement("circle");
   newCircle.setAttribute("id" ,"ci0");
   newCircle.setAttribute("cx" ,0);
   newCircle.setAttribute("cy" ,390);
   newCircle.setAttribute("r" ,5);
   newCircle.setAttribute("fill" , "#ff0000");
   newCircle.setAttribute("stroke-width" , "3px");
   svgroot.appendChild(newCircle);
 update();
}
 ]]></script>
 </defs>
</svg>

  1. hallo,

    Fehler: uncaught exception: [Exception... "Component returned failure code: 0x80004001 (NS_ERROR_NOT_IMPLEMENTED) [nsIDOMSVGSVGElement.getElementById]"  nsresult: "0x80004001 (NS_ERROR_NOT_IMPLEMENTED)"
    Mit der Exception kann ich wenig anfangen.

    Ich halte die Fehlermeldung für aussagekräftig. Deinem Firefox fehlt irgendein Plugin, das ihm ermöglicht, die gewünschte Ausgabe zu erzeugen.

    Opera und Konqueror machen keine Probleme.

    Es macht in einem solchen Fall Sinn, die Browserversionen anzugeben - und das Betriebssystem. SVG hat sich leider immer noch nicht so weit durchgesetzt, daß Browser und Plattform keine Rolle spielen und unerwähnt bleiben dürfen.

    Grüße aus Berlin

    Christoph S.

    --
    Visitenkarte
    ss:| zu:) ls:& fo:) va:) sh:| rl:|
  2. Hallo Sebastian,

    Fehler: uncaught exception: [Exception... "Component returned failure code: 0x80004001 (NS_ERROR_NOT_IMPLEMENTED)

    Du willst also ein Feature nutzen, das in Firefox (noch) nicht implementiert ist.

    Mit der Exception kann ich wenig anfangen.

    Noch klarer kann man es aber nicht sagen :-)

    Opera und Konqueror machen keine Probleme.

    die SVG-Unterstützung in den einzelnen Browsern ist unterschiedlich und ändert
    sich von Browserversion zu Browserversion, siehe SVG-Comparison-Chart [1]

    Freundliche Grüße

    Vinzenz

    [1] Danke, Orlando!

  3. Hi,

    Fehler: uncaught exception: [Exception... "Component returned failure code: 0x80004001 (NS_ERROR_NOT_IMPLEMENTED) [nsIDOMSVGSVGElement.getElementById]"  nsresult: "0x80004001 (NS_ERROR_NOT_IMPLEMENTED)"  location: "JS frame :: /*...*//test2.svg :: update :: line 14"  data: no]

    svgroot.getElementById(circle).setAttribute("cx" ,100); //line 14

    War da nicht was, daß man bei XML mit den NS-Varianten arbeiten muß, also getElementByIdNS?

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. War da nicht was, daß man bei XML mit den NS-Varianten arbeiten muß, also getElementByIdNS?

      Error: svgroot.getElementByIdNS is not a function
      Line: 14

      auch ein getElementByIdNs gibts nicht. Was sind überhaupt ...NS-Varianten?

      1. hallo,

        Was sind überhaupt ...NS-Varianten?

        Nix ;-)

        Aber für "IDN" gibt es Definitionen, mit denen der IE7 was anfangen kann. Schau dir einfach mal die "Internetoptionen" im IE7 an.

        Grüße aus Berlin

        Christoph S.

        --
        Visitenkarte
        ss:| zu:) ls:& fo:) va:) sh:| rl:|
      2. Hallo

        auch ein getElementByIdNs gibts nicht. Was sind überhaupt ...NS-Varianten?

        NS wie

        Name
            Space

        siehe auch:

        http://developer.mozilla.org/en/docs/SVG:Namespaces_Crash_Course#Scripting_in_namespaced_XML
        </archiv/2005/10/t116579/#m746098>

        Freundliche Grüße

        Vinzenz

    2. Hallo MudGuard,

      War da nicht was, daß man bei XML mit den NS-Varianten arbeiten muß, also getElementByIdNS?

      Dann wohl eher SetAttributeNS, das gibts sogar tatsächlich. ;)

      Jonathan

  4. Hallo Sebastian,

    function update()
    {
       var circle = "ci0";
       svgroot.getElementById(circle).setAttribute("cx" ,100); //line 14

    ^^^
          svgdoc

    }

    function init(load_evt)
    {
    svgdoc=load_evt.target.ownerDocument;
    svgroot=svgdoc.documentElement;
    var newCircle = document.createElement("circle");

    ^^^
       var newCircle = svgdoc.createElementNS("http://www.w3.org/2000/svg","circle");

    document statt svgdoc würde hier auch funktionieren, aber wenn es schon mal explizit definiert wurde ...

    Grüße,
    Thomas