Ist es möglich, den numerischen Index des Elements in seinem übergeordneten Knoten ohne Schleife abzurufen?

Lesezeit: 3 Minuten

Benutzer-Avatar
rsk82

Normalerweise mache ich das so:

for(i=0;i<elem.parentNode.length;i++) {
  if (elem.parentNode[i] == elem) //.... etc.. etc...
}

Benutzer-Avatar
kennebec

Sie könnten Geschwister zählen … Die childNodes-Liste enthält Text und Elementknoten-

function whichChild(elem){
    var  i= 0;
    while((elem=elem.previousSibling)!=null) ++i;
    return i;
}

  • für die meisten Knoten„Gibt es jemals eine Instanz, in der ein Element mehr als einen parentNode haben könnte?

    – Webdesigner

    4. April 2013 um 21:40 Uhr

  • Um das Zählen von Leerzeichen in der Kinderliste zu vermeiden, verwenden Sie stattdessen previousElementSibling

    – Reyraa

    7. Januar 2015 um 14:11 Uhr

  • genial! – eine sehr elegante Lösung

    – Michael Zelensky

    3. Mai 2019 um 8:55 Uhr

Es gibt keine Möglichkeit, den Index eines Knotens innerhalb seines übergeordneten Knotens abzurufen, ohne eine Schleife einzufügen etwas Weise, sei das a for-Schleife, ein Array Methode wie indexOf oder forEach, oder etwas anderes. Ein Betriebsindex im DOM ist eine lineare Zeit, keine konstante Zeit.

Allgemeiner gesagt, wenn Listenmutationen möglich sind (und das DOM sicherlich Mutationen unterstützt), ist es im Allgemeinen unmöglich, einen Index der Operation bereitzustellen, der in konstanter Zeit ausgeführt wird. Es gibt zwei gängige Implementierungstaktiken: verknüpfte Listen (normalerweise doppelt) und Arrays. Das Finden eines Index mithilfe einer verknüpften Liste erfordert einen Spaziergang. Um einen Index mithilfe eines Arrays zu finden, ist ein Scan erforderlich. Einige Engines cachen Indizes, um die für die Berechnung benötigte Zeit zu reduzieren node.childNodes[i], aber das hilft Ihnen nicht, wenn Sie nach einem Knoten suchen. Die Frage nicht zu stellen ist die beste Politik.

  • Schön und kurz, aber beachten Sie, dass es auf IE < 9 nicht funktioniert. Es wird im Allgemeinen davon abgeraten, sich zu bewerben Array.prototype Methoden an Host-Objekteseit der Spezifikation kann nicht garantieren, dass sie richtig funktionieren: “Ob die indexOf-Funktion erfolgreich auf ein Hostobjekt angewendet werden kann, ist implementierungsabhängig.”

    – Christian C. Salvado

    10. Januar 2011 um 18:03 Uhr


  • indexOf scannt das gesamte Array, so dass es die Frage technisch nicht wirklich beantwortet. Aber da indexOf eine eingebaute Funktion ist, läuft sie schneller als das Schreiben einer eigenen Schleife.

    – Juan Mendes

    10. Januar 2011 um 18:27 Uhr

  • Beachten Sie, dass parentNode.childNodes enthalten kann text Knoten, und Sie möchten möglicherweise nicht, dass sie berücksichtigt werden.

    – Tonix

    27. Juni 2016 um 21:52 Uhr

  • Sollte sein .children anstatt .childNodes.

    – Jonathan Potter

    23. Juni 2017 um 16:24 Uhr

  • @JonathanPotter Es ist nicht klar, was die Frage stellt, da der Code nicht funktioniert, ob er das n-te untergeordnete Element oder den n-ten untergeordneten Knoten haben möchte

    – gsnedders

    23. Juni 2017 um 16:53 Uhr

Benutzer-Avatar
Mattia Pontonio

Versuche dies:

let element = document.getElementById("your-element-id");
let indexInParent = Array.prototype.slice.call(element.parentNode.parentNode.children).indexOf(element.parentNode));

Benutzer-Avatar
Spitz

Ich denke du hast es, aber:

  • Stellen Sie sicher, dass die Variable “i” mit deklariert ist var
  • benutzen === anstatt == im Vergleich

Wenn Sie eine Sammlung von Eingabeelementen mit denselben haben Name (wie <textarea name="text_field[]"…) in Ihrem Formular und Sie möchten den genauen numerischen Index des Felds erhalten, das ein Ereignis ausgelöst hat:

function getElementIdxFromName(elem, parent) {
    var elms = parent[elem.name];
    var  i = 0;
    if (elms.length === undefined) // there is only one element with this name in the document
        return 0;
    while((elem!=elms[i])) i++;
    return i;
}

Abrufen der numerischen ID eines Elements aus einer Sammlung von Elementen mit demselben Klassenname:

function getElementIdxFromClass(elem, cl) {
    var elems = document.getElementsByClassName(cl);
    var  i = 0;
    if (elems.length > 0) {
        while((elem!=elems[i])) i++;
        return i;
    }
    return 0;
}

1009890cookie-checkIst es möglich, den numerischen Index des Elements in seinem übergeordneten Knoten ohne Schleife abzurufen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy