Vinzenz Mai: Unterschiede zwischen innerHTML und innerHTML

Beitrag lesen

Hallo Felix,

Aber was passiert bei variable = element.innerHTML? Es wird einer Variablen ein String zugewiesen! Und genau hier fängt mein Problem im IE an:

das stimmt :-)

Diesen String kann der IE mittels variable.replace() nicht korrekt ersetzen.

Sagen wir so: Die von Dir gewünschte Ersetzung kann nicht vorgenommen werden. Das ist ein Unterschied. Auf diesen Unterschied komme ich später zurück.

Es scheint, als ob der IE einfach den regulären Ausdruck nicht korrekt auf den String matchen kann (warum auch immer, denn andere Browser können das!!).

er kann es, das Ergebnis ist: Nichts gefunden. Andere Browser finden im exakt gleichen String ebenfalls nichts. Sie verhalten sich genauso wie der IE. Deine Behauptung, andere Browser könnten das, ist somit einfach falsch.

Und genau hierher rührt mein Vorwurf (Stichwort "Patzer") an die Macher dieses markenbenamsten Bugs!

Dein Vorwurf in dieser Form ist unberechtigt. Du wendest eine ungeeignete Methode an, weil Du in einem String etwas anderes erwartest als darin steht.

Wo ist nun das Problem, wie ist es zu lösen:

Das Problem steckt in der Zeichenfolge, die der IE als innerHTML zurückliefert. Wie Struppi schreibt, passiert mehr als man nach außen direkt sieht.

Ich habe mir den Inhalt Deiner Variablen HTML als Zeichennummern zeilenweise in einer Textarea ausgeben lassen. Dabei habe ich festgestellt, dass in der Zeichenfolge im IE wiederholt die Kombination 10 13 (\r\n) vorkommt, der typische Zeilenumbruch von Windows.

Wendest Du einen regulären Ausdruck auf eine Zeichenfolge an, der diese Kombination enthält, so wird dort aufgehört. Dieses Verhalten ist konsistent in Firefox und IE. Daraus ergibt sich unmittelbar die Lösung für Dein Problem: Du musst diese "Zeilenumbrüche" entfernen, z.B. über

  
    var HTML = platzhalter.parentNode.innerHTML;  
    var teile = HTML.split("\r\n");  
    HTML = teile.join("");  

Warum Du überflüssigerweise ein RegExp-Objekt erzeugst, hab' ich nicht verstanden. Ich bin der Empfehlung von SELFHTML gefolgt und habe die Ersetzung gleich wie folgt vorgenommen:

  
    var resultat = HTML.replace(/<div.*<\/div>/i, ersetzung);  

wobei ich Deinen regulären Ausdruck vereinfacht habe. Mir kamen die beliebig vielen Nicht-Größer-Zeichen, gefolgt von einem Größer-Zeichen überflüssig vor. Bei diesem einfachen Matching sicherlich Geschmacksache. Jedenfalls lieferte der so modifizierte Code sowohl in IE als auch im Firefox das von Dir gewünschte Ergebnis.

Freundliche Grüße

Vinzenz