jQuery 3 nie ma tego problemu
Jedną ze zmian wymienionych w wersjach jQuery 3.0 jest:
dodaj manipulację klasy SVG ( # 2199 , 20aaed3 )
Jednym rozwiązaniem tego problemu byłoby uaktualnienie do jQuery 3. Działa świetnie:
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>
Problem:
Powodem, dla którego funkcje manipulacji klasą jQuery nie działają z elementami SVG, jest to, że wersje jQuery wcześniejsze niż 3.0 używają tej className
właściwości do tych funkcji.
cur = elem.nodeType === 1 && ( elem.className ?
( " " + elem.className + " " ).replace( rclass, " " ) :
" "
);
Zachowuje się to zgodnie z oczekiwaniami w przypadku elementów HTML, ale w przypadku elementów SVG className
jest nieco inaczej. Dla elementu SVG className
nie jest ciągiem, lecz wystąpieniem SVGAnimatedString
.
Rozważ następujący kod:
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>
Jeśli uruchomisz ten kod, zobaczysz w konsoli programisty coś takiego:
test div
SVGAnimatedString { baseVal="test svg", animVal="test svg"}
Gdybyśmy rzutowali ten SVGAnimatedString
obiekt na ciąg znaków, tak jak robi to jQuery, mielibyśmy [object SVGAnimatedString]
, czyli tam, gdzie jQuery zawodzi.
Jak radzi sobie z tym wtyczka jQuery SVG:
Wtyczka jQuery SVG działa w ten sposób, łatając odpowiednie funkcje w celu dodania obsługi SVG.
function getClassNames(elem) {
return (!$.svg.isSVGElem(elem) ? elem.className :
(elem.className ? elem.className.baseVal : elem.getAttribute('class'))) || '';
}
Ta funkcja wykryje, czy element jest elementem SVG, a jeśli tak, użyje baseVal
właściwości SVGAnimatedString
obiektu, jeśli jest dostępny, przed powrotem do class
atrybutu.
Historyczne stanowisko jQuery w tej kwestii:
jQuery obecnie wyświetla ten problem na stronie Nie naprawi . Oto odpowiednie części.
Błędy elementów SVG / VML lub elementów
jQuery jest przede wszystkim biblioteką dla HTML DOM, więc większość problemów związanych z dokumentami SVG / VML lub elementami przestrzeni nazw jest poza zakresem. Staramy się rozwiązywać problemy, które „przenikają” do dokumentów HTML, takie jak zdarzenia, które wyskakują z SVG.
Najwyraźniej jQuery uznało pełną obsługę SVG poza zakresem rdzenia jQuery i lepiej nadaje się do wtyczek.