J'utilise jQuery SVG. Je ne peux pas ajouter ou supprimer une classe à un objet. Quelqu'un connaît mon erreur?
Le SVG:
<rect class="jimmy" id="p5" x="200" y="200" width="100" height="100" />
Le jQuery qui n'ajoutera pas la classe:
$(".jimmy").click(function() {
$(this).addClass("clicked");
});
Je sais que le SVG et jQuery fonctionnent bien ensemble car je peux cibler l'objet et déclencher une alerte lorsqu'il est cliqué:
$(".jimmy").click(function() {
alert('Handler for .click() called.');
});
javascript
jquery
css
svg
jquery-svg
Don P
la source
la source
Réponses:
Edit 2016: lisez les deux réponses suivantes.
element.classList.add('newclass')
fonctionne dans les navigateurs modernesJQuery (moins de 3) ne peut pas ajouter une classe à un SVG.
.attr()
fonctionne avec SVG, donc si vous voulez dépendre de jQuery:Et si vous ne voulez pas dépendre de jQuery:
la source
.attr("class", "oldclass")
(ou le plus lourd.setAttribute("class", "oldclass")
) n'est vraiment pas équivalent à l'enlevernewclass
!Il y a element.classList dans l'API DOM qui fonctionne à la fois pour les éléments HTML et SVG. Pas besoin de plugin jQuery SVG ou même de jQuery.
la source
jQuery 3 n'a pas ce problème
L'une des modifications répertoriées dans les révisions de jQuery 3.0 est:
Une solution à ce problème serait de mettre à niveau vers jQuery 3. Cela fonctionne très bien:
Le problème:
La raison pour laquelle les fonctions de manipulation de classe jQuery ne fonctionnent pas avec les éléments SVG est que les versions jQuery antérieures à 3.0 utilisent la
className
propriété de ces fonctions.Extrait de jQuery
attributes/classes.js
:Cela se comporte comme prévu pour les éléments HTML, mais pour les éléments SVG,
className
c'est un peu différent. Pour un élément SVG,className
n'est pas une chaîne, mais une instance deSVGAnimatedString
.Considérez le code suivant:
Si vous exécutez ce code, vous verrez quelque chose comme le suivant dans votre console de développeur.
Si nous devions convertir cet
SVGAnimatedString
objet en chaîne comme le fait jQuery, nous l'aurions fait[object SVGAnimatedString]
, c'est là que jQuery échoue.Comment le plugin jQuery SVG gère cela:
Le plugin jQuery SVG contourne cela en corrigeant les fonctions pertinentes pour ajouter le support SVG.
Extrait de jQuery SVG
jquery.svgdom.js
:Cette fonction détectera si un élément est un élément SVG, et s'il l'est, il utilisera la
baseVal
propriété de l'SVGAnimatedString
objet si elle est disponible, avant de retomber sur l'class
attribut.Position historique de jQuery sur la question:
jQuery répertorie actuellement ce problème sur leur page Won't Fix . Voici les parties pertinentes.
Évidemment, jQuery considérait la prise en charge complète de SVG en dehors de la portée du noyau jQuery, et mieux adaptée aux plugins.
la source
Si vous avez des classes dynamiques ou ne savez pas quelles classes pourraient déjà être appliquées, cette méthode est, je crois, la meilleure approche:
la source
Sur la base des réponses ci-dessus, j'ai créé l'API suivante
la source
Après le chargement ,
jquery.svg.js
vous devez charger ce fichier:http://keith-wood.name/js/jquery.svgdom.js
.Source: http://keith-wood.name/svg.html#dom
Exemple de travail: http://jsfiddle.net/74RbC/99/
la source
Ajoutez simplement le constructeur prototype manquant à tous les nœuds SVG:
Vous pouvez ensuite l'utiliser de cette façon sans nécessiter jQuery:
Tout le mérite revient à Todd Moto .
la source
jQuery ne prend pas en charge les classes d'éléments SVG. Vous pouvez obtenir l'élément directement
$(el).get(0)
et utiliserclassList
etadd / remove
. Il y a aussi une astuce avec cela, car l'élément SVG le plus haut est en fait un objet DOM normal et peut être utilisé comme tous les autres éléments de jQuery. Dans mon projet, j'ai créé cela pour prendre soin de ce dont j'avais besoin, mais la documentation fournie sur le Mozilla Developer Network a une cale qui peut être utilisée comme alternative.exemple
Une alternative plus difficile consiste à utiliser D3.js comme moteur de sélection à la place. Mes projets ont des graphiques qui sont construits avec, donc c'est aussi dans la portée de mon application. D3 modifie correctement les attributs de classe des éléments DOM vanilla et des éléments SVG. Bien que l'ajout de D3 pour ce cas serait probablement exagéré.
la source
jQuery 2.2 prend en charge la manipulation de classe SVG
La publication de jQuery 2.2 et 1.12 comprend la citation suivante:
Exemple utilisant jQuery 2.2.0
Il teste:
Si vous cliquez sur ce petit carré, il changera de couleur car l'
class
attribut est ajouté / supprimé.la source
Voici mon code plutôt inélégant mais fonctionnel qui traite les problèmes suivants (sans aucune dépendance):
classList
n'existe pas sur les<svg>
éléments dans IEclassName
ne représentant pas l'class
attribut sur les<svg>
éléments dans IEgetAttribute()
etsetAttribute()
implémentationsIl utilise
classList
autant que possible.Code:
Exemple d'utilisation:
la source
className
propriété plutôt que d'essayer de définir un attribut. La raison pour laquelle "LTE IE7 requiert que strAttributeName soit" className "lors de la définition, de l'obtention ou de la suppression d'un attribut CLASS" est que ces navigateurs ont une implémentation rompue degetAttribute(x)
etsetAttribute(x)
qui obtiennent ou définissent simplement la propriété avec un nomx
, il est donc plus facile et plus compatible pour définir la propriété directement.<svg>
élément dans une page qui est conçue pour fonctionner dans IE 7. Pour ce que ça vaut, mon code ajoute un attribut de classe avec succès aux<svg>
éléments dans IE 7 car un tel élément se comporte comme n'importe quel autre élément personnalisé.J'utilise Snap.svg pour ajouter une classe à et SVG.
http://snapsvg.io/docs/#Element.addClass
la source
Une solution de contournement pourrait être d'ajouter addClass à un conteneur de l'élément svg:
la source
J'ai écrit ça dans mon projet, et ça marche ... probablement;)
exemples
la source
Inspiré par les réponses ci-dessus, en particulier par Sagar Gala, j'ai créé cette API . Vous pouvez l'utiliser si vous ne voulez pas ou ne pouvez pas mettre à jour votre version jquery.
la source
Ou utilisez simplement les méthodes DOM à l'ancienne lorsque JQ a un singe au milieu quelque part.
Apprenez les gens du DOM. Même dans le cadre-palooza de 2016, cela aide assez régulièrement. De plus, si vous entendez quelqu'un comparer le DOM à l'assemblage, donnez-lui un coup de pied.
la source