molily: DOM - ist das nicht furchtbar?

Beitrag lesen

Hallo,

Dein Kernproblem lässt sich anscheinend relativ einfach lokalisieren:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>...</title>
<script type="text/javascript">
var string1 = '<p><a href="javascript:alert('bla')">klick mich</a> - <a title="bla ' bla ' bla">title</a></p>';
string1 += "<p><a href='javascript:alert("bla")'>klick mich</a> - <a title='bla " bla " bla'>title</a></p>";
var string2 = "bla";

function schreiben () {
 inhalt.innerHTML += string1;
}
function hinzufuegen () {
 inhalt.innerHTML += string2;
}
window.onload = function () {
 inhalt = document.getElementById("inhalt");
 ausgabe = document.getElementById("ausgabe");
 schreiben();
}
function zeigeinnerhtml () {
 ausgabe.innerText = inhalt.innerHTML;
}
</script>
</head>

<body>

<div id="inhalt"></div>

<p><a href="javascript:hinzufuegen()">hinzufügen</a></p>
<p><a href="javascript:zeigeinnerhtml();">zeige innerHTML</a></p>

<p id="ausgabe"></p>

</body>
</html>

Nach dem Hinzufügen werden alle Attribute mit einfachen Anführungszeichen geschrottet. Das lässt sich dadurch erklären, dass beim Serialisieren immer einfache Anführungszeichen verwendet werden. Bei .innerHTML+= wird nicht einfach der Code angehängt, sondern erst der gesamte Knotenbaum serialisiert, der Codestring angehängt und der gesamte String neu eingeparst.

Das Ergebnis der Serialisierung ist etwa
<A HREF='javascript:alert('bla')'>klick mich</A>
Dies wird beim erneuten Parsen zu
<A HREF='javascript:alert('>klick mich</A>
weil nach dem zweiten »'« das Attribut zuende ist und das darauffolgende »bla')'« für den Parser nur Müll ist.

Das Problem kommt mir sogar bekannt vor, wahrscheinlich sogar aus diesem Forum. Es ist eben ein Opera-Bug, der in neueren Versionen bereits gefixt ist.

Mathias