In DOM wurden Dokumenttraversalklassen definiert, die die sequenzielle Verarbeitung von Bauminhalten ermöglichen. Die TreeWalker- und NodeIterator-Klassen für perfekte Kandidaten dafür.
Zuerst erstellen wir eine TreeWalker-Instanz, die nacheinander durch <li>
Knoten iterieren kann.
var walker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_ELEMENT,
function(node) {
var hasNoElements = node.getElementsByTagName('*').length == 0;
return (node.nodeName == "LI" && hasNoElements) ?
NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
},
false
);
Als nächstes iterieren wir bis zum aktuellen Knoten in diesem TreeWalker. Nehmen wir an, wir hatten einen Verweis auf unseren aktuellen Knoten in myNode
. Wir werden diesen Walker durchlaufen, bis wir myNode
oder einen Nullwert erreichen.
while(walker.nextNode() != myNode && walker.currentNode);
Nachdem wir unseren Knoten in diesem TreeWalker erreicht haben, ist der vorherige Knoten ein Kinderspiel.
var previousNode = walker.previousNode();
Sie können versuchen, eine example here.
Hier ist eine generische Version eines rückwärts Baum Walker. Es ist ein kleiner Wrapper um die TreeWalker-Oberfläche.
function backwardsIterator(startingNode, nodeFilter) {
var walker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_ELEMENT,
function(node) {
return nodeFilter(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP
},
false
);
walker.currentNode = startingNode;
return walker;
}
Es braucht einen Startknoten und eine benutzerdefinierte Filterfunktion, um unerwünschte Elemente zu entfernen.Hier sehen Sie eine Beispielverwendung, die an einem bestimmten Knoten beginnt und nur Elemente des Typs li
enthält.
var startNode = document.getElementById("2.1.1");
// creates a backwards iterator with a given start node, and a function to filter out unwanted elements.
var iterator = backwardsIterator(startNode, function(node) {
var hasNoChildElements = node.childElementCount == 0;
var isListItemNode = node.nodeName == "LI";
return isListItemNode && hasNoChildElements;
});
// Call previousNode() on the iterator to walk backwards by one node.
// Can keep calling previousNode() to keep iterating backwards until the beginning.
iterator.previousNode()
Aktualisiert mit einem interactive example. Tippen Sie auf ein Listenelement, um das vorherige Listenelement zu markieren.
Wenn 3.2 ausgewählt ist, sollte der vorherige Knoten dann 3.1 sein? – Anurag
@Anurag genau – smartdirt