le problème est simple, document.getElementsByTagName ('*')
ne sélectionne pas la balise SVG et dans la console cela donne une erreur.
Mais si j'efface les étiquettes SVG, ça marche correctement.
Mon code:
<section class="classMaster"> <h1 class="title-1"><b>Title:</b> Anyone</h1> <h2 class="title-2">Title T2</h2> <p class="parrafe"><b>Strong:</b> Year 2019.<p/> <p class="parrafe"><b>Text:</b> Everybody.</p> <p><b>by: </b>StackOverflow</p> </section> <svg></svg> <svg className="any"></svg> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <path d="M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"/> <path d="M0 0h24v24H0z" fill="none"/> <path d="M12.5 7H11v6l5.25 3.15.75-1.23-4.5-2.67z"/> </svg>
var Master = document.getElementsByTagName('*'); /* NOT WORKING TOO var Master = document.getElementsByTagName('body')[0].getElementsByTagName('*'); var Master = document.querySelectorAll('*'); */ var Vector = []; for (var i=0; i < Master.length; i++){ Master[i].className = Master[i].className.trim(); console.log("Class > " + Master[i].className); if (Master[i].className != ""){ var chaps = Master[i].className.split(/\s+/); for (var j=0; j < chaps.length; j++){ Vector.push(chaps[j]); } } } //console.log(Vector);
Mon JsFiddle:
https: // jsfiddle. net / RenatoRamosPuma / Lbj14xg7 / 9 /
Quel est le problème avec la balise SVG?
3 Réponses :
Utilisez la balise à la place, cela fonctionne très bien pour moi.
Tout d'abord, document.getElementsByTagName (...)
, document.querySelector (...)
et document.querySelectorAll (...)
tous reconnaissent SVG.
L'erreur que vous obtenez de votre code n'est pas à cause de cela. Le problème est que vous utilisez .trim ()
sur un objet
au lieu de string
. Eh bien, je comprends la confusion.
Pour les éléments normaux, .className
renvoie une chaîne. Pour SVG, cependant, .className
renvoie un Objet SVGAnimatedString
.
<svg class="special"></svg>
var svg = document.querySelector('svg'); console.log('className of svg: ', svg.classList);
Pour obtenir le .className
de SVG, il y a 3 façons:
<svg class="special"></svg>
var svg = document.querySelector('svg'); console.log('className of svg: ', svg.getAttribute('class'));
<svg class="special"></svg>
var svg = document.querySelector('svg'); console.log('className of svg: ', svg.className.baseVal);
3: .classList
Veuillez noter que .classList
renvoie un objet, pas une chaîne.
<div class="normal"></div> <svg class="special"></svg>
var div = document.querySelector('div'); var svg = document.querySelector('svg'); console.log('className of div: ', div.className); console.log('className of svg: ', svg.className);
ou .classList
, qui devrait de toute façon être préféré même pour HTML
Merci les gars, je vais essayer d'implémenter la solution dans un for () {}.
ClassName de SVG
est une SVGAnimatedString
alors que ClassName
des éléments HTML
est une chaîne,
Alors quand vous essayez Object.trim ()
vous finissez par obtenir l'erreur que trim n'est pas une fonction
parce que la méthode de trim n'est pas disponible sur les objets
p>
<svg class="any"></svg> <div class='someclass'></div>
console.log('svg element',document.querySelector('svg').classList) console.log('HTML element',document.querySelector('div').classList)
Vous pouvez utiliser getAttribute et setAttribute Note MDN
<svg class="any"></svg> <div class='someclass'></div>
console.log('svg element',document.querySelector('svg').getAttribute('class')) console.log('svg element',document.querySelector('div').getAttribute('class'))
Vous pouvez utiliser classList
<svg id='svg' class="any"></svg> <div id='div' class='someclass'></div>
console.log('svg element',document.getElementById('svg').className) console.log('HTML element',document.getElementById('div').className)
ou .classList
, qui devrait de toute façon être préféré même pour HTML
@Kaiido ouais vrai,
Déplacez
console.log ("Class>" + Master [i] .className);
avant d'essayer de le découper. Verra mieux le problèmele problème est maintenant le console.log Is>: Master [i] .className = Master [i] .className.trim ();
Renato, @charlietfl vous apprend à déboguer.
astuce:
Master [i] .className
n'est pas toujours une chaîne - dans un SVG, c'est un objetpeut être utilisé getElementsByTagNameNS ? developer.mozilla.org/en-US/docs/Web/ API / Document /…
@RenatoRamosPuma à droite ... et lorsque vous vous connectez avant que les erreurs ne se produisent , vous voyez que ce n'est pas une chaîne que vous pouvez couper
Merci à tous pour votre aide. Je vais éditer mon jsfiddle