J'essaie d'obtenir l'envergure d'enfant qui a une classe = 4. Voici un exemple d'élément:
<div id="test">
<span class="one"></span>
<span class="two"></span>
<span class="three"></span>
<span class="four"></span>
</div>
Les outils disponibles sont JS et YUI2. Je peux faire quelque chose comme ça:
doc = document.getElementById('test');
notes = doc.getElementsByClassName('four');
//or
doc = YAHOO.util.Dom.get('#test');
notes = doc.getElementsByClassName('four');
Ceux-ci ne fonctionnent pas dans IE. Je reçois le message erroné que l'objet (doc) ne prend pas en charge cette méthode ou cette propriété (getElementsByClassName). J'ai essayé quelques exemples d'implémentations multi-navigateurs de getElementsByClassName mais je ne pouvais pas les faire fonctionner et j'ai toujours cette erreur.
Je pense que ce dont j'ai besoin, c'est d'un navigateur croisé, getElementsByClassName, ou j'ai besoin d'utiliser doc.getElementsByTagName ('span') et de le parcourir jusqu'à ce que je trouve la classe 4. Je ne sais pas comment faire cela.
Utilisez doc.childNodes
pour parcourir chaque span
, puis filtrez celui dont className
est égal à 4
:
var doc = document.getElementById("test");
var notes = null;
for (var i = 0; i < doc.childNodes.length; i++) {
if (doc.childNodes[i].className == "4") {
notes = doc.childNodes[i];
break;
}
}
Un séjour sans faille
Utiliser querySelector et querySelectorAll
var testContainer = document.querySelector('#test');
var fourChildNode = testContainer.querySelector('.four');
IE9 et supérieur
;)
La réponse acceptée ne contrôle que les enfants immédiats. Souvent, nous recherchons des descendants avec ce nom de classe.
De plus, nous voulons parfois que tout enfant contienne un className.
Par exemple: <div class="img square"></div>
devrait correspondre à une recherche sur className "img", même si c'est exact className n'est pas "img".
Voici une solution pour ces deux problèmes:
Trouvez la première instance d'un élément descendant avec la classe className
function findFirstChildByClass(element, className) {
var foundElement = null, found;
function recurse(element, className, found) {
for (var i = 0; i < element.childNodes.length && !found; i++) {
var el = element.childNodes[i];
var classes = el.className != undefined? el.className.split(" ") : [];
for (var j = 0, jl = classes.length; j < jl; j++) {
if (classes[j] == className) {
found = true;
foundElement = element.childNodes[i];
break;
}
}
if(found)
break;
recurse(element.childNodes[i], className, found);
}
}
recurse(element, className, false);
return foundElement;
}
Pour moi, il semble que vous souhaitiez la quatrième durée. Si oui, vous pouvez simplement faire ceci:
document.getElementById("test").childNodes[3]
ou
document.getElementById("test").getElementsByTagName("span")[3]
Ce dernier assure qu'il n'y a pas de nœuds cachés qui pourraient le gâcher.
Tu pourrais essayer:
notes = doc.querySelectorAll('.4');
ou
notes = doc.getElementsByTagName('*');
for (var i = 0; i < notes.length; i++) {
if (notes[i].getAttribute('class') == '4') {
}
}
Mais sachez que les anciens navigateurs ne supportent pas getElementsByClassName
.
Ensuite, vous pouvez faire
function getElementsByClassName(c,el){
if(typeof el=='string'){el=document.getElementById(el);}
if(!el){el=document;}
if(el.getElementsByClassName){return el.getElementsByClassName(c);}
var arr=[],
allEls=el.getElementsByTagName('*');
for(var i=0;i<allEls.length;i++){
if(allEls[i].className.split(' ').indexOf(c)>-1){arr.Push(allEls[i])}
}
return arr;
}
getElementsByClassName('4','test')[0];
Il semble que cela fonctionne, mais sachez qu'une classe HTML
Utilisez le nom de l'ID avec le signe getElementById
, pas de #
avant celui-ci. Ensuite, vous pouvez obtenir les nœuds enfants span
à l'aide de getElementsByTagName
et les parcourir en boucle pour trouver celui avec la bonne classe:
var doc = document.getElementById('test');
var c = doc.getElementsByTagName('span');
var e = null;
for (var i = 0; i < c.length; i++) {
if (c[i].className == '4') {
e = c[i];
break;
}
}
if (e != null) {
alert(e.innerHTML);
}
À mon avis, chaque fois que vous le pouvez, vous devriez utiliser Array et ses méthodes. Ils sont beaucoup, beaucoup plus rapides que de faire une boucle sur tout le DOM/wrapper, ou de pousser des choses dans un tableau vide. La majorité des solutions présentées ici peuvent être appelées Naive comme décrit ici (très bel article d'ailleurs):
https://medium.com/@chuckdries/traversing-the-dom-with-filter-map-and-arrow-functions-1417d326d2bc
Ma solution : (aperçu en direct sur Codepen: https://codepen.io/Nikolaus91/pen/wEGEYe )
const wrapper = document.getElementById('test') // take a wrapper by ID -> fastest
const itemsArray = Array.from(wrapper.children) // make Array from his children
const pickOne = itemsArray.map(item => { // loop over his children using .map() --> see MDN for more
if(item.classList.contains('four')) // we place a test where we determine our choice
item.classList.add('the-chosen-one') // your code here
})
Utilisez element.querySelector (). Supposons que 'myElement' est l'élément parent que vous avez déjà. "sonClassName" est la classe de l'enfant que vous recherchez.
let child = myElement.querySelector('.sonClassName');
Pour plus d'informations, visitez: https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelector
Voici une solution récursive relativement simple. Je pense qu'une première recherche en profondeur est appropriée ici. Cela retournera le premier élément correspondant à la classe trouvée.
function getDescendantWithClass(element, clName) {
var children = element.childNodes;
for (var i = 0; i < children.length; i++) {
if (children[i].className &&
children[i].className.split(' ').indexOf(clName) >= 0) {
return children[i];
}
}
for (var i = 0; i < children.length; i++) {
var match = getDescendantWithClass(children[i], clName);
if (match !== null) {
return match;
}
}
return null;
}
Mise à jour de juin 2018 vers ES6
const doc = document.getElementById('test');
let notes = null;
for (const value of doc) {
if (value.className === '4') {
notes = value;
break;
}
}
La façon dont je vais faire cela en utilisant jquery est quelque chose comme ça ..
var targetchild = $ ("# test"). children (). find ("span.four");