Korzystam z jQuery SVG. Nie mogę dodać ani usunąć klasy do obiektu. Czy ktoś zna mój błąd?
SVG:
<rect class="jimmy" id="p5" x="200" y="200" width="100" height="100" />
JQuery, która nie doda klasy:
$(".jimmy").click(function() {
$(this).addClass("clicked");
});
Wiem, że jQuery SVG i wspólnie pracują grzywny, bo może kierować obiekt i ognia alert, gdy jest kliknięty:
$(".jimmy").click(function() {
alert('Handler for .click() called.');
});
javascript
jquery
css
svg
jquery-svg
Don P.
źródło
źródło
Odpowiedzi:
Edytuj 2016: przeczytaj następne dwie odpowiedzi.
element.classList.add('newclass')
działa w nowoczesnych przeglądarkachJQuery (mniej niż 3) nie może dodać klasy do SVG.
.attr()
współpracuje z SVG, więc jeśli chcesz polegać na jQuery:A jeśli nie chcesz polegać na jQuery:
źródło
.attr("class", "oldclass")
(lub bardziej kłopotliwe.setAttribute("class", "oldclass")
) tak naprawdę nie jest równoważne z usunięciemnewclass
!Jest element.classList w API DOM, który pracuje dla obu elementów HTML i SVG. Nie potrzebujesz wtyczki jQuery SVG ani nawet jQuery.
źródło
jQuery 3 nie ma tego problemu
Jedną ze zmian wymienionych w wersjach jQuery 3.0 jest:
Jednym rozwiązaniem tego problemu byłoby uaktualnienie do jQuery 3. Działa świetnie:
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.Fragment jQuery
attributes/classes.js
:Zachowuje się to zgodnie z oczekiwaniami w przypadku elementów HTML, ale w przypadku elementów SVG
className
jest nieco inaczej. Dla elementu SVGclassName
nie jest ciągiem, lecz wystąpieniemSVGAnimatedString
.Rozważ następujący kod:
Jeśli uruchomisz ten kod, zobaczysz w konsoli programisty coś takiego:
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.
Fragment jQuery SVG
jquery.svgdom.js
:Ta funkcja wykryje, czy element jest elementem SVG, a jeśli tak, użyje
baseVal
właściwościSVGAnimatedString
obiektu, jeśli jest dostępny, przed powrotem doclass
atrybutu.Historyczne stanowisko jQuery w tej kwestii:
jQuery obecnie wyświetla ten problem na stronie Nie naprawi . Oto odpowiednie części.
Najwyraźniej jQuery uznało pełną obsługę SVG poza zakresem rdzenia jQuery i lepiej nadaje się do wtyczek.
źródło
Jeśli masz klasy dynamiczne lub nie wiesz, które klasy można już zastosować, to ta metoda jest moim zdaniem najlepsza:
źródło
Na podstawie powyższych odpowiedzi stworzyłem następujący interfejs API
źródło
Po załadowaniu
jquery.svg.js
należy załadować ten plikhttp://keith-wood.name/js/jquery.svgdom.js
.Źródło: http://keith-wood.name/svg.html#dom
Przykład roboczy: http://jsfiddle.net/74RbC/99/
źródło
Wystarczy dodać brakujący konstruktor prototypów do wszystkich węzłów SVG:
Możesz następnie użyć go w ten sposób, nie wymagając jQuery:
Wszystkie zasługi należą się Toddowi Moto .
źródło
jQuery nie obsługuje klas elementów SVG. Możesz pobrać element bezpośrednio
$(el).get(0)
i użyćclassList
iadd / remove
. Jest w tym także pewna sztuczka polegająca na tym, że najwyższy element SVG jest w rzeczywistości normalnym obiektem DOM i może być używany jak każdy inny element w jQuery. W swoim projekcie stworzyłem to, aby zadbać o to, czego potrzebowałem, ale dokumentacja w sieci Mozilla Developer Network ma pewien podkład, który można wykorzystać jako alternatywę.przykład
Alternatywą jest jeszcze trudniejsze użycie zamiast tego silnika D3.js. Moje projekty mają wykresy, które są z nim zbudowane, więc jest to również w zakresie mojej aplikacji. D3 poprawnie modyfikuje atrybuty klasy waniliowych elementów DOM i elementów SVG. Chociaż dodanie D3 tylko dla tego przypadku byłoby prawdopodobnie przesadą.
źródło
jQuery 2.2 obsługuje manipulację klasami SVG
JQuery 2.2 i 1.12 Wydany po obejmuje następujący cytat:
Przykład użycia jQuery 2.2.0
Testuje:
Kliknięcie tego małego kwadratu spowoduje zmianę jego koloru, ponieważ
class
atrybut zostanie dodany / usunięty.źródło
Oto mój raczej nieelegancki, ale działający kod, który zajmuje się następującymi problemami (bez żadnych zależności):
classList
nie istnieje na<svg>
elementach w IEclassName
nie reprezentujeclass
atrybutu na<svg>
elementach w IEgetAttribute()
isetAttribute()
implementacjeUżywa
classList
tam, gdzie to możliwe.Kod:
Przykładowe użycie:
źródło
className
właściwości zamiast próbować ustawić atrybut. Powodem, dla którego „LTE IE7 wymaga, aby parametr strAttributeName był„ className ”podczas ustawiania, pobierania lub usuwania atrybutu CLASS”, jest taki, że przeglądarki te mają wadliwą implementacjęgetAttribute(x)
isetAttribute(x)
po prostu pobierają lub ustawiają właściwość z nazwąx
, dzięki czemu jest łatwiejsza i bardziej kompatybilna aby ustawić właściwość bezpośrednio.<svg>
element na stronie zaprojektowanej do pracy w IE 7. Za to, co jest warte, mój kod dodaje z powodzeniem atrybut klasy do<svg>
elementów w IE 7, ponieważ taki element zachowuje się jak każdy inny niestandardowy element.Używam Snap.svg, aby dodać klasę i SVG.
http://snapsvg.io/docs/#Element.addClass
źródło
Jednym z obejść może być dodanieClass do kontenera elementu svg:
źródło
Napisałem to w moim projekcie i działa ... prawdopodobnie;)
przykłady
źródło
Zainspirowany powyższymi odpowiedziami, zwłaszcza Sagar Gala, stworzyłem ten interfejs API . Możesz go użyć, jeśli nie chcesz lub nie możesz zaktualizować swojej wersji jquery.
źródło
Lub po prostu użyj old-schoolowych metod DOM, gdy JQ ma gdzieś pośrodku małpę.
Naucz się ludzi DOM. Nawet w 2016 roku-palooza pomaga dość regularnie. Ponadto, jeśli kiedykolwiek usłyszysz, że ktoś porównuje DOM do zestawu, wykop go dla mnie.
źródło