Estou usando o jQuery SVG. Não consigo adicionar ou remover uma classe para um objeto. Alguém conhece o meu erro?
O SVG:
<rect class="jimmy" id="p5" x="200" y="200" width="100" height="100" />
O jQuery que não adicionará a classe:
$(".jimmy").click(function() {
$(this).addClass("clicked");
});
Eu sei que o SVG e o jQuery estão funcionando bem, porque posso direcionar o objeto e disparar um alerta quando ele é clicado:
$(".jimmy").click(function() {
alert('Handler for .click() called.');
});
javascript
jquery
css
svg
jquery-svg
Don P
fonte
fonte
Respostas:
Editar 2016: leia as próximas duas respostas.
element.classList.add('newclass')
funciona em navegadores modernosJQuery (menor que 3) não pode adicionar uma classe a um SVG.
.attr()
funciona com SVG, portanto, se você quiser depender do jQuery:E se você não quiser depender do jQuery:
fonte
.attr("class", "oldclass")
(ou o mais complicado.setAttribute("class", "oldclass")
) não é realmente equivalente a removernewclass
!Há element.classList na API do DOM que funciona para elementos HTML e SVG. Não é necessário o plugin jQuery SVG ou mesmo o jQuery.
fonte
O jQuery 3 não tem esse problema
Uma das alterações listadas nas revisões do jQuery 3.0 é:
Uma solução para esse problema seria atualizar para o jQuery 3. Ele funciona muito bem:
O problema:
A razão pela qual as funções de manipulação da classe jQuery não funcionam com os elementos SVG é porque as versões do jQuery anteriores ao 3.0 usam a
className
propriedade para essas funções.Trecho do jQuery
attributes/classes.js
:Isso se comporta conforme o esperado para elementos HTML, mas para elementos SVG
className
é um pouco diferente. Para um elemento SVG,className
não é uma sequência, mas uma instância deSVGAnimatedString
.Considere o seguinte código:
Se você executar esse código, verá algo como o seguinte no console do desenvolvedor.
Se formos converter esse
SVGAnimatedString
objeto em uma string como o jQuery, teríamos[object SVGAnimatedString]
, e é aí que o jQuery falha.Como o plugin SVG jQuery lida com isso:
O plug-in jQuery SVG soluciona esse problema corrigindo as funções relevantes para adicionar suporte ao SVG.
Trecho do jQuery SVG
jquery.svgdom.js
:Essa função detectará se um elemento é um elemento SVG e, se for, usará a
baseVal
propriedade doSVGAnimatedString
objeto, se disponível, antes de recorrer aoclass
atributo.A posição histórica do jQuery sobre o assunto:
No momento, o jQuery lista esse problema na página Won't Fix . Aqui estão as partes relevantes.
Evidentemente, o jQuery considerou o suporte completo ao SVG fora do escopo do núcleo do jQuery e mais adequado para plug-ins.
fonte
Se você tem classes dinâmicas ou não sabe quais classes já podem ser aplicadas, acredito que este método seja a melhor abordagem:
fonte
Com base nas respostas acima, criei a seguinte API
fonte
Após o carregamento
jquery.svg.js
você deve carregar este arquivo:http://keith-wood.name/js/jquery.svgdom.js
.Fonte: http://keith-wood.name/svg.html#dom
Exemplo de trabalho: http://jsfiddle.net/74RbC/99/
fonte
Basta adicionar o construtor de protótipo ausente a todos os nós SVG:
Você pode usá-lo dessa maneira sem precisar do jQuery:
Todo o crédito é para Todd Moto .
fonte
O jQuery não suporta as classes de elementos SVG. Você pode obter o elemento diretamente
$(el).get(0)
e usarclassList
eadd / remove
. Há um truque com isso também, pois o elemento SVG mais alto é realmente um objeto DOM normal e pode ser usado como qualquer outro elemento no jQuery. No meu projeto, criei isso para cuidar do que eu precisava, mas a documentação fornecida na Mozilla Developer Network possui um calço que pode ser usado como uma alternativa.exemplo
Uma alternativa ainda mais difícil é usar o D3.js como mecanismo de seleção. Meus projetos têm gráficos criados com ele, portanto também estão no escopo do meu aplicativo. D3 modifica corretamente os atributos de classe dos elementos DOM baunilha e SVG. Embora adicionar D3 apenas para este caso provavelmente seria um exagero.
fonte
O jQuery 2.2 suporta manipulação de classe SVG
As publicações lançadas do jQuery 2.2 e 1.12 incluem a seguinte citação:
Exemplo usando o jQuery 2.2.0
Testa:
Se você clicar nesse pequeno quadrado, ele mudará de cor porque o
class
atributo foi adicionado / removido.fonte
Aqui está o meu código bastante deselegante, mas funcional, que lida com os seguintes problemas (sem nenhuma dependência):
classList
não existe em<svg>
elementos no IEclassName
não representando oclass
atributo em<svg>
elementos no IEgetAttribute()
esetAttribute()
implementaçõesUsa sempre
classList
que possível.Código:
Exemplo de uso:
fonte
className
propriedade em vez de tentar definir um atributo. O motivo pelo qual "LTE IE7 exige que strAttributeName seja" className "ao definir, obter ou remover um atributo CLASS" é que esses navegadores têm uma implementação interrompidagetAttribute(x)
esetAttribute(x)
que simplesmente obtêm ou definem a propriedade com o nomex
, tornando-o mais fácil e compatível para definir a propriedade diretamente.<svg>
elemento em uma página projetada para funcionar no IE 7. Quanto vale a pena, meu código adiciona com êxito um atributo de classe aos<svg>
elementos do IE 7, pois esse elemento se comporta como qualquer outro elemento personalizado.Eu uso o Snap.svg para adicionar uma classe ao SVG.
http://snapsvg.io/docs/#Element.addClass
fonte
Uma solução alternativa poderia ser addClass em um contêiner do elemento svg:
fonte
Eu escrevi isso no meu projeto, e funciona ... provavelmente;)
exemplos
fonte
Inspirado pelas respostas acima, especialmente por Sagar Gala, criei esta API . Você pode usá-lo se não quiser ou não puder atualizar sua versão do jquery.
fonte
Ou apenas use métodos DOM da velha escola quando o JQ tiver um macaco no meio em algum lugar.
Aprenda o pessoal do DOM. Mesmo no framework-palooza de 2016, ajuda bastante regularmente. Além disso, se você ouvir alguém comparar o DOM com a montagem, chute-o para mim.
fonte