Seltsames Verhalten von parentNode/innerHTML in einer Schleife
Dani82
- javascript
0 Encoder0 Dani82
0 Felix Riesterer
Hallo alle zusammen,
den folgenden Code verwende ich, um vor jeden Link, dessen Ziel "google" enthält, einen Text voranzustellen. Das direkte Bearbeiten eines innerHTML ist zwar nicht die sauberste Lösung, weil der Aufbau der parentNodes auf der Seite aber immer derselbe ist, geht das problemlos.
var newHTML;
var pos = -1;
var iMax = document.getElementsByTagName("a").length;
for(var i=0; i<iMax; i++) {
pos = document.getElementsByTagName("a")[i].href.indexOf('google');
if(pos>0) {
newHTML = "text" + document.getElementsByTagName("a")[i].parentNode.innerHTML;
document.getElementsByTagName("a")[i].parentNode.innerHTML = newHTML;
pos = -1;
}
}
Wenn ich nun aber nicht nur einen statischen Text voranstellen möchte, sondern den Inhalt des betroffenen Links selbst weiterverarbeite, dann funktioniert der Code nicht mehr:
newHTML = createHTML(document.getElementsByTagName("a")[i].href, "text", "text2") + document.getElementsByTagName("a")[i].parentNode.innerHTML;
Wo der ursprüngliche Code noch jeden parentNode sowohl beim Auslesen als auch beim Schreiben korrekt anspricht, bleibe ich bei der Modifizierung immer beim ersten verwendeten parentNode hängen und das obwohl der Index [i] weiterhin wie vorher korrekt weiterläuft.
Hat da jemand von euch eine Idee was ich falsch mache und wieso beim modifizierten Code immer nur der erste verwendete parentNode verwendet wird, beziehungsweise was ich nicht machen darf?
Liebe Grüße,
Daniel
Was macht createHTML? Ich hab das nicht als allgemein existierende Funktioni gefunden.
Vielleicht erzeugt das ein zusätliches a-Element, so dass die Suche nach getElementsByTagName dann immer eines mehr zurückgibt und du damit mit steigendem Index immer wieder auf dem gleichen Element landest?
Ich würde mir übrigens die öfter verwendeten Ausdrücke in einer Variable merken, wie document.getElementsByTagName("a"). Dann liest sich das gleich viel einfacher.
Was macht createHTML? Ich hab das nicht als allgemein existierende Funktion gefunden.
Vielleicht erzeugt das ein zusätliches a-Element, so dass die Suche nach getElementsByTagName dann immer eines mehr zurückgibt und du damit mit steigendem Index immer wieder auf dem gleichen Element landest?
Vielen Dank! Daran lag es schließlich auch, denn die von mir erstellte createHTML Funktion fügt abhängig von den Parametern HTML-Code mit bis zu zwei Links hinzu - ich musste also nur i sowie iMax um die Zahl der Links erhöhen und nun funktioniert es perfekt. Schließlich war es ein Denkfehler, weil ich mir nicht bewusst war, dass die Element-Suche per JS kreierte Tags sofort ins Suchergebnis hinzufügen würde würde.
Lieber Dani82,
newHTML = createHTML(document.getElementsByTagName("a")[i].href, "text", "text2") + document.getElementsByTagName("a")[i].parentNode.innerHTML;
was machst Du denn bei folgender Dokumentstruktur?
<p>Die Links zu <a href="google">Google</a> und zu <a href="google-maps">Google Maps</a> sind kaputt.</p>
Deine Programmlogik schnappt sich in beiden Fällen den Textabsatz und verändert ihn.
Bist Du Dir sicher, dass Dein eigentliches Ziel nicht auch mit CSS-Mitteln zu erreichen wäre? Zum Beispiel mit der :before-Eigenschaft in Kombination mit einem cleveren Selektor?
Liebe Grüße,
Felix Riesterer.