Problem: Ich habe einige Probleme herauszufinden, eine Möglichkeit, Elemente in meinem HTMLDocument auswählen, die unter einem bestimmten Punkt auf der Seite sind.Vergleichen Sie den Index von 2 Elementen in einer Sammlung
Im folgenden Codebeispiel, wie Sie in den Kommentaren sehen kann, wähle ich zuerst ein Teil von ihnen, die
IEDoc.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']")
In diesem Beispiel habe ich 10 Elemente in dieser Sammlung meine queryselector Kriterien einhalten. Jedes dieser Elemente ist in einer Tabelle enthalten, die im siebten Grad übergeordnet ist.
MsgBox TypeName(IEDoc.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']")(2).ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode) ' HTMLTable
Einige dieser Elemente befinden sich in derselben Tabelle.
Sie können hier das Formular sehen, das alle Tabellen enthält.
Jetzt ist die Sache, dass ich die innere HTML nur einiger dieser Elemente und nicht alle von ihnen auswählen möchte. Das Kriterium zu wissen, ob eines dieser 10 Elemente mich interessiert oder nicht, ist seine Position auf der Webseite. Ich möchte alle Elemente, die unter der Nachricht Teil Verwendung sind. Es gibt nur eine Tabelle, die den Text für den Text enthält, und so war meine Idee zu sehen, ob die Tabelle, in der jedes Element enthalten ist, einen höheren oder niedrigeren Index in der "Form" -Auflistung hat. Wenn der Index höher ist, will ich dieses Element, sonst verwerfe ich es.
Was ich dafür getan habe, ist der folgende Code:
ich die ID Bim alle Tabellen einer oder mehr aus den 10 Elementen enthalten.
For Each Element In IEDoc.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']") ' here for all of the 10 numbers found with the queryselectorall we'll find their respective table in the collection (form) and set its Class as "Bim". But since some of the numbers are in the same table, we won't have 10 tables with a classname "Bim" at the end of the process. We'll have only x tables with the classname "Bim" Element.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.ParentNode.Class = "Bim" Next
stellte ich die ID Stopp auf die Tabelle mit dem Text Teil Usage
For Each Element In IEDoc.getElementsByClassName("SectionHead") If Element.innerHTML = "Part Usage" Then 'MsgBox TypeName(Element.ParentNode.ParentNode.ParentNode)' HTMLTable Element.ParentNode.ParentNode.ParentNode.ID = "Stop" End If Next
ich überprüfen, welche Tabellen mit dem Klassennamen Bim sind unter (= höherer Index) die Tabelle mit der ID Stop. Für die Tabelle (es gibt eigentlich nur eine), die das Kriterium von Punkt 3 erfüllt, wende ich
IEDoc.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']")
in ihnen an, so dass ich alle Elemente in contains und insbesondere ihre innerHTML bekomme.For Each Element In IEDoc.getElementsByClassName("Bim") ' Here we check all the x tables which have the Classname "Bim" If Element.indexInTheWholeForm > IEDoc.getElementById("Stop").indexInTheWholeForm Then 'and compare somehow if their index in the (form) collection if higher than the table with the ID "Stop" (this is similar to checking if the element if lower on the webpage in thic case) (we only want the element which have a higher index aka under the Part Usage table) For Each Element2 In Element.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']") ' Now we are in the table which contains the part numbers and we'll look for all the part numbers it contains by applying the queryselectorall again, but this time only in this specific table array_parts2(iteration2) = Element.querySelectorAll("td[width='100'][class='ListMainCent'][rowSpan='1'][colSpan='1']")(iteration2).innerHTML ActiveWorkbook.Worksheets(1).Cells(iteration2 + 1, 19) = array_parts2(iteration2) iteration2 = iteration2 + 1 Next End If Next
natürlich, was nicht funktioniert, ist die indexInTheWholeForm Eigenschaft, die nicht existiert. Irgendwelche Ideen, wie man das macht?
danken, die Linie für das Erreichen :)
'getElementById' nur sollte ein Element zurückgeben, weil Id sollte einzigartig in der gesamten Seite sein: Wenn Sie dieselbe ID für mehrere Elemente festlegen, ist das keine gute Idee. –
Ja, natürlich hast du recht, ich habe diesen Fehler nicht bemerkt. Wenn ich stattdessen die gleiche Methode aber mit dem Namen verwende, hätten Sie dann eine Idee, wie Sie dieses Indexproblem beheben können? – Seb