2016-07-07 6 views
0

Hier komme ich mit einem jQuery-Problem. Betrachten Sie dieses Zufallselement:jQuery: Anzahl der Geschwister desselben Tags

<div id="some_random_id"> 
    <b></b> 
    <div></div> 
    <b></b> 
    <div></div> 
    <div></div> 
</div> 

Alles, was wir haben, ist ein Zeiger auf ein untergeordnetes Element. Wir wissen nichts über das Elternelement. Wir müssen eine Funktion schreiben, die die Anzahl der Geschwister mit dem gleichen Tag-Namen ausgibt.

function n_siblings_same_tagname(this){}; 

Funktion hat 2 zurück, wenn unser Objekt den Namen DIV-Tages ist und 1, wenn der Tag-Name ist B. Wie wir das tun? Dank

+0

Die anderen divs innerhalb des div mit id = 'some_random_id' sind Kinder, nicht Geschwister. Könnten Sie bitte den Titel ändern, um das zu reflektieren? – DinoMyte

+0

Ja, stimmt. Und wir wissen nichts über das Elternelement. Alles, was wir wissen, ist ein Zeiger auf ein Child-Element und andere Child-Elemente sind Geschwister zu dem Element, das wir kennen – user3600124

+0

Wenn wir diese Zahlen zurückgeben, dann erhalten Sie nicht die Anzahl der Geschwister mit dem angegebenen Tag-Namen alle Kinder mit diesem Tag-Namen, Geschwister plus Original. Könnten Sie bitte Ihre Frage bearbeiten, um genau anzugeben, was Sie wollen? –

Antwort

3

Ich würde vorschlagen:

function n_siblings_same_tagname(node){ 

    // Retrieve the tagName of the passed-in 
    // DOM node: 
    var elType = node.tagName; 

    // Converting the children the passed-node's 
    // parent's element children into an Array, 
    // using Array.from(): 
    return Array.from(node.parentNode.children) 

    // filtering that array, using an Arrow 
    // which retains only those elements 
    // whose tagName is equal to the 
    // tagName of the passed-in elementary: 
     .filter(elem => elem.tagName == elType) 
    // finding the length of the filtered Array, and 
    // subtracting 1, as we want siblings not all 
    // elements of that type: 
     .length - 1; 
} 

Oder, wenn jQuery bevorzugt wird:

function n_siblings_same_tagname(element){ 

    // we may receive a jQuery object, or a DOM 
    // node; here we wrap the received element 
    // with jQuery: 
    var el = $(element); 

    // returning the length of the number of 
    // sibling elements matching the 
// supplied selector, here the tagName 
// of the passed in element, and 
    return el.siblings(el.prop('tagName')).length 
} 

Angesichts der Antwort des OP, in den Kommentaren unten, würde ich die Alternative bieten:

function n_siblings_same_tagname(element){ 

    // we may receive a jQuery object, or a DOM 
    // node; here we wrap the received element 
    // with jQuery: 
    var el = $(element); 

    // returning the length of the number of 
    // child elements matching the selector 
    // provided by the tagName property 
    // of the passed-in element: 
    return el.parent().children(el.prop('tagName')).length 
} 

Oder die geänderte JavaScript:

function n_siblings_same_tagname(node){ 

    // Retrieve the tagName of the passed-in 
    // DOM node: 
    var elType = node.tagName; 

    // Converting the children the passed-node's 
    // parent's element children into an Array, 
    // using Array.from(): 
    return Array.from(node.parentNode.children) 

    // filtering that array, using an Arrow 
    // which retains only those elements 
    // whose tagName is equal to the 
    // tagName of the passed-in elementary: 
     .filter(elem => elem.tagName == elType) 
    // finding the length of the filtered Array: 
     .length; 
} 
+0

Mein Fehler, was ich meinte, ist das Element selbst und alle seine Geschwister. In jedem Fall ändert sich die Logik der Antwort nicht viel. Danke für diese Antwort – user3600124

3

Dies sollte alle Kinder von Ihren Eltern mit dem gleichen Tag wählen:

function n_siblings_same_tagname(element){ 
    element = $(element); 
    return element.parent().children(element.prop("tagName")).length; 
};  
+0

Dies setzt voraus, dass 'dies' ein jQuery-Objekt ist nicht ein DOMElement, würde aber in diesem Fall funktionieren. Sie müssen nur die 'length'-Eigenschaft zurückgeben. –

+0

danke für den Kommentar, ich werde es wickeln! – Abaddon666

+0

Was ist die erste Zeile? – user3600124

Verwandte Themen