2016-04-27 4 views
2

Ich rendere ein Diagramm mit D3, das im Laufe der Zeit animiert, Links zeigt, die entsprechend dem Fluss durch ein System ein- und ausgehen.Wie kann ich dieses Problem mit Firefox mit URL() lösen, so dass es in anderen Browsern nicht bricht?

In meinem Diagramm habe ich Marker auf meinen Links mit marker-mid gerendert, um die Fließrichtung anzuzeigen (siehe meine prototype pen für eine Idee der Marker). Die Verbindungen werden mit eingegeben:

enteringLinks.append('polyline') 
    .attr({ 
     'stroke-width': 0, 
     style: 'marker-mid: url(#chevron);', 
     stroke: 'transparent', 
     path: function(d) {...}, 
     markers: function() {...}, 
     points: function() {...} 
    }); 

Die Sparren sind auch Setup programmatisch früher auf:

svg.append('marker') 
    .attr({ 
     id: 'chevron', 
     // ... 
    }) 
    .append('path') 
    .attr({...}); 

ich auf einem seltsamen Fehler in Firefox kam. Nach dem Aktualisieren der Abfrageparameter auf der Seite (unter Verwendung der Protokoll-API) fehlt allen neuen Verknüpfungen ihre Markierung. Es erscheint nach dem Ändern der URL, kann es nicht finden #chevron. Links, die bereits auf der Seite gerendert wurden, sind nicht betroffen.

Obwohl ich das nicht verstehen kann, weiß ich, wie man es für Firefox löst - document.location.href an die Marker-URL voranstellen, um url(document.location.href + #chevron) zu machen. Ich verstehe nicht wirklich, warum das funktioniert - warum funktioniert es beim ersten Laden, aber nicht nach einer Änderung? Problematisch ist jedoch, dass dies alle Marker in IE9 durchbricht.

Abgesehen von UA ​​Sniffing, würde ich gerne Ratschläge, wie ich dieses Problem in Firefox lösen könnte, ohne andere Browser zu beeinträchtigen.

Übrigens habe ich ursprünglich versucht, marker-mid in einem externen Stylesheet zu spezifizieren, aber die Verwendung dieser Marker würde in Firefox überhaupt nicht erscheinen - das gleiche oder ein ähnliches Problem, denke ich. Meine Browser-Support-Anforderungen sind alle gängigen Browser neueste Versionen und IE9 +.

+0

Wenn Sie ein externes Stylesheet verwenden, muss die URL den Namen der html/svg-Datei enthalten, die den Marker enthält. Hast du das gemacht? –

+0

Hallo Robert - leider ist das keine Option für mich - das Markup wird durch JS erstellt und als ein api + Stylesheet verfügbar gemacht, das von anderen Teilen unseres Produktes konsumiert wird, von denen mein Code keine Kenntnis hat. – goodforenergy

Antwort

1

Es scheint eine Inkonsistenz zwischen den Spezifikationen svg, css und html5 zu geben, wie der URI des Dokuments gehandhabt werden kann, der sich über pushState und Ressourcen von Fragmentbezeichnern ändert, was wiederum dazu führt, dass Browser Dinge anders implementieren.

Eine vorgeschlagene Abhilfe scheint document.base nach pushstate gesetzt zu sein.

+0

Wow, danke für diese! Ich hatte Mühe, bei meiner Suche nach relevanten Themen zu suchen. Anscheinend wird gerade an dem Firefox-Problem gearbeitet, also warte ich ab, was passiert. Ich habe versucht, Base nach Pushstate zu setzen, aber ohne Erfolg. – goodforenergy

Verwandte Themen