Pour des raisons de performances, j'essaie de trouver un moyen de sélectionner uniquement les nœuds frères du nœud sélectionné. Par exemple,
<div id="outer">
<div id="inner1"> </div>
<div id="inner2"> </div>
<div id="inner3"> </div>
<div id="inner4"> </div>
</div>
Si j'ai sélectionné le noeud inner1, puis-je accéder à ses frères et sœurs, inner2-4
nœuds?
Eh bien, bien sûr, il suffit de contacter le parent puis les enfants.
node.parentNode.childNodes[]
ou ... en utilisant jQuery:
$('#innerId').siblings()
Edit: Cletus, comme toujours, est inspirant. J’ai creusé plus loin. C’est ainsi que jQuery obtient essentiellement des frères et sœurs:
function getChildren(n, skipMe){
var r = [];
for ( ; n; n = n.nextSibling )
if ( n.nodeType == 1 && n != skipMe)
r.Push( n );
return r;
};
function getSiblings(n) {
return getChildren(n.parentNode.firstChild, n);
}
var sibling = node.nextSibling;
Cela retournera le frère immédiatement après ou aucun autre frère ne sera disponible. De même, vous pouvez utiliser previousSibling
.
[Edit] À la réflexion, cela ne donnera pas la prochaine balise div
, mais les espaces après le nœud. Mieux semble être
var sibling = node.nextElementSibling;
Il existe également un previousElementSibling
.
Rapide:
var siblings = n => [...n.parentElement.children].filter(c=>c!=n)
https://codepen.io/anon/pen/LLoyrP?editors=1011
Obtenez les enfants du parent sous forme de tableau, filtrez cet élément.
Modifier:
Et pour filtrer les nœuds de texte (Merci pmrotule ):
var siblings = n => [...n.parentElement.children].filter(c=>c.nodeType == 1 && c!=n)
avez-vous vérifié la méthode "Sibling" dans jQuery?
sibling: function( n, elem ) {
var r = [];
for ( ; n; n = n.nextSibling ) {
if ( n.nodeType === 1 && n !== elem ) {
r.Push( n );
}
}
return r;
}
le n.nodeType == 1 vérifie si l'élément est un nœud html et n! == exclut l'élément actuel.
Je pense que vous pouvez utiliser la même fonction, tout ce code semble être JavaScript javascript.
À partir de 2017:
réponse directe: element.nextElementSibling
pour obtenir le bon élément frère. aussi vous avez element.previousElementSibling
pour le précédent
à partir d'ici est assez simple pour obtenir tous les suivants sibiling
var n = element, ret = [];
while (n = n.nextElementSibling){
ret.Push(n)
}
return ret;
Il y a plusieurs façons de le faire.
L'un ou l'autre des éléments suivants devrait faire l'affaire.
// METHOD A (ARRAY.FILTER, STRING.INDEXOF)
var siblings = function(node, children) {
siblingList = children.filter(function(val) {
return [node].indexOf(val) != -1;
});
return siblingList;
}
// METHOD B (FOR LOOP, IF STATEMENT, ARRAY.Push)
var siblings = function(node, children) {
var siblingList = [];
for (var n = children.length - 1; n >= 0; n--) {
if (children[n] != node) {
siblingList.Push(children[n]);
}
}
return siblingList;
}
// METHOD C (STRING.INDEXOF, ARRAY.SPLICE)
var siblings = function(node, children) {
siblingList = children;
index = siblingList.indexOf(node);
if(index != -1) {
siblingList.splice(index, 1);
}
return siblingList;
}
Pour votre information, la base de code jQuery est une excellente ressource pour l’observation de Javascript de niveau A.
Voici un excellent outil qui révèle la base de code jQuery de manière très simple. http://james.padolsey.com/ jquery /
Voici comment vous pouvez obtenir le précédent, le suivant et tous les frères et soeurs (des deux côtés):
function prevSiblings(target) {
var siblings = [], n = target;
while(n = n.previousElementSibling) siblings.Push(n);
return siblings;
}
function nextSiblings(target) {
var siblings = [], n = target;
while(n = n.nextElementSibling) siblings.Push(n);
return siblings;
}
function siblings(target) {
var prev = prevSiblings(target) || [],
next = nexSiblings(target) || [];
return prev.concat(next);
}
Utilisez document.querySelectorAll () et Boucles et itérations
function sibblingOf(children,targetChild){
var children = document.querySelectorAll(children);
for(var i=0; i< children.length; i++){
children[i].addEventListener("click", function(){
for(var y=0; y<children.length;y++){children[y].classList.remove("target")}
this.classList.add("target")
}, false)
}
}
sibblingOf("#outer >div","#inner2");
#outer >div:not(.target){color:red}
<div id="outer">
<div id="inner1">Div 1 </div>
<div id="inner2">Div 2 </div>
<div id="inner3">Div 3 </div>
<div id="inner4">Div 4 </div>
</div>
var childNodeArray = document.getElementById('somethingOtherThanid').childNodes;
jQuery
$el.siblings();
Native - dernier, Edge13 +
[...el.parentNode.children].filter((child) =>
child !== el
);
Native (alternative) - dernière version, Edge13 +
Array.from(el.parentNode.children).filter((child) =>
child !== el
);
Natif - IE10 +
Array.prototype.filter.call(el.parentNode.children, (child) =>
child !== el
);
1) Ajouter la classe sélectionnée à l'élément cible
2) Trouver tous les enfants de l'élément parent à l'exclusion de l'élément cible
3) Supprimer la classe de l'élément cible
<div id = "outer">
<div class="item" id="inner1">Div 1 </div>
<div class="item" id="inner2">Div 2 </div>
<div class="item" id="inner3">Div 3 </div>
<div class="item" id="inner4">Div 4 </div>
</div>
function getSiblings(target) {
target.classList.add('selected');
let siblings = document.querySelecttorAll('#outer .item:not(.currentlySelected)')
target.classList.remove('selected');
return siblings
}