jQuery 3 hat dieses Problem nicht
Eine der in den jQuery 3.0-Revisionen aufgeführten Änderungen ist:
SVG-Klassenmanipulation hinzufügen ( # 2199 , 20aaed3 )
Eine Lösung für dieses Problem wäre ein Upgrade auf jQuery 3. Es funktioniert hervorragend:
var flip = true;
setInterval(function() {
// Could use toggleClass, but demonstrating addClass.
if (flip) {
$('svg circle').addClass('green');
}
else {
$('svg circle').removeClass('green');
}
flip = !flip;
}, 1000);
svg circle {
fill: red;
stroke: black;
stroke-width: 5;
}
svg circle.green {
fill: green;
}
<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>
<svg>
<circle cx="50" cy="50" r="25" />
</svg>
Das Problem:
Der Grund, warum die Manipulationsfunktionen der jQuery-Klasse nicht mit den SVG-Elementen funktionieren, liegt darin, dass jQuery-Versionen vor 3.0 die className
Eigenschaft für diese Funktionen verwenden.
cur = elem.nodeType === 1 && ( elem.className ?
( " " + elem.className + " " ).replace( rclass, " " ) :
" "
);
Dies verhält sich für HTML-Elemente wie erwartet, für SVG-Elemente className
jedoch etwas anders. Ist für ein SVG-Element className
keine Zeichenfolge, sondern eine Instanz von SVGAnimatedString
.
Betrachten Sie den folgenden Code:
var test_div = document.getElementById('test-div');
var test_svg = document.getElementById('test-svg');
console.log(test_div.className);
console.log(test_svg.className);
#test-div {
width: 200px;
height: 50px;
background: blue;
}
<div class="test div" id="test-div"></div>
<svg width="200" height="50" viewBox="0 0 200 50">
<rect width="200" height="50" fill="green" class="test svg" id="test-svg" />
</svg>
Wenn Sie diesen Code ausführen, wird in Ihrer Entwicklerkonsole Folgendes angezeigt.
test div
SVGAnimatedString { baseVal="test svg", animVal="test svg"}
Wenn wir dieses SVGAnimatedString
Objekt wie jQuery in einen String umwandeln würden, hätten wir [object SVGAnimatedString]
, wo jQuery fehlschlägt.
Wie das jQuery SVG-Plugin damit umgeht:
Das jQuery SVG-Plugin umgeht dies, indem es die relevanten Funktionen patcht, um SVG-Unterstützung hinzuzufügen.
function getClassNames(elem) {
return (!$.svg.isSVGElem(elem) ? elem.className :
(elem.className ? elem.className.baseVal : elem.getAttribute('class'))) || '';
}
Diese Funktion erkennt, ob ein Element ein SVG-Element ist, und verwendet, falls verfügbar, die baseVal
Eigenschaft des SVGAnimatedString
Objekts, falls verfügbar, bevor auf das class
Attribut zurückgegriffen wird.
jQuerys historische Haltung zu diesem Thema:
jQuery listet dieses Problem derzeit auf der Seite " Nicht behoben " auf. Hier sind die relevanten Teile.
Fehler bei SVG / VML- oder Namespaced-Elementen
jQuery ist in erster Linie eine Bibliothek für das HTML-DOM, daher liegen die meisten Probleme im Zusammenhang mit SVG / VML-Dokumenten oder Elementen mit Namespace außerhalb des Gültigkeitsbereichs. Wir versuchen, Probleme zu beheben, die in HTML-Dokumenten "durchbluten", z. B. Ereignisse, die aus SVG heraussprudeln.
Offensichtlich hat jQuery die vollständige SVG-Unterstützung außerhalb des Bereichs des jQuery-Kerns in Betracht gezogen und ist besser für Plugins geeignet.