Hi,
Die Links sind da, wenn das Script ausgeführt wird. Während der Ausführung ändert aber das Script das aTags-Array (weil es ja a-Elemente löscht/ersetzt) und es kann dann nicht mehr auf alle Elemente zugreifen.
Achso, die Links ändern sich nicht irgendwie von außen, sondern dein Script ändert nur das Array wegen der Ersetzungen.
Das Array ist kein Array, sondern eine NodeList.
”NodeList and NamedNodeMap objects in the DOM are live; that is, changes to the underlying document structure are reflected in all relevant NodeList and NamedNodeMap objects. For example, if a DOM user gets a NodeList object containing the children of an Element, then subsequently adds more children to that element (or removes children, or modifies them), those changes are automatically reflected in the NodeList, without further action on the user's part.”
Kann mir nicht vorstellen, dass das ein Problem sein sollte. Wenn ein a-Element, das im Array referenziert wird, nach der Ersetzung nicht mehr existiert, sollte das doch nicht stören. Du bist ja dann fertig mit ihm. Das Array-Element selber sollte aber noch existieren (d.h.
aTags.length
müsste doch unverändert bleiben), wenn auch aTags[i] nach der Ersetzung vielleicht undefined oder null wird.
Eben nicht - weil es sich *nicht* um ein Array handelt.
Jedesmal das aTags-Array neu aufzubauen ist wohl nicht wirklich performant?
Nicht unbedingt. Aber ist ja auch ganz schön fies, wenn einem die Links unter der Hand willkürlich mutieren...
Nicht „willkürlich”, sondern wie in der Spezifikation festgelegt.
Das ist übrigens auch ein Problem, welches Ansätze wie „wenn getElementsByClassName nicht nativ implementiert ist, dann erweitere ich prototyp(e-)isch HTMLElement-Objekte eben um meine eigene Methode, die ein Array mit allen betreffenden Elementen zurückliefert” haben.
Das geht gut, so lange man diese nur so benutzt, dass die Eigenschaft echter NodeLists, „live” zu sein, gar nicht zum tragen kommt.
Wenn man sich aber auf dieses Feature verlässt - und es gibt genügend Anwendungsfälle, in denen das sinnvoll sein kann - dann fällt man mit der selbstgebastelten Methode schnell auf die Nase (insb. dann, wenn man in Browsern, die es nativ implementiert haben, das native nutzt); oder man muss sie eben wirklich bei jedem Zugriff erneut aufrufen, damit sie auch wirklich das aktuelle DOM „live” widerspiegelt, was dann in der Tat ziemlich schnell unperformant werden dürfte.
MfG ChrisB
“Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]