st: Operas document.write() platziert Elemente falsch

Hallo,

folgender Code:

<script type="text/javascript">
document.write('<div>');
document.write('<script type="text/javascript" src="beispiel.js"><' + '/script>');
document.write('<'+'/div>');
</script>

beispiel.js enthält seinerseits Code, um Elemente auszugeben:

document.write("<p>Ich bin ein Beispiel.</p>");

(Das mag hier in der Theorie etwas à la Von hinten durch die Brust ins Auge aussehen, muss aber in der Praxis leider so sein. Ich kann es nicht beeinflussen.)

Firefox erzeugt, wie von mir erwartet, dieses Bäumchen:

<div>
  <p>Ich bin ein Beispiel.</p>
</div>

Opera (und der IE) macht hingegen folgendes:

<div></div>
<p>Ich bin ein Beispiel.</p>

Letzteres ist doch falsch, oder irre ich mich und Firefox macht es verkehrt?

Schreibe ich den kapselnden <div>-Block außerhalb, nicht per Javascript, …

<div><script type="text/javascript">
document.write('<script type="text/javascript" src="beispiel.js"><' + '/script>');
</script>
</div>

… bekomme ich von Opera das erwartete, mit Firefox übereinstimmende Ergebnis - nur leider entspricht der Code nicht dem, was ich gerne hätte.

Liege ich mit meiner Einschätzung richtig und kann mir jemand eine Möglichkeit nennen, das Problem zu umschiffen? Danke.

  1. Letzteres ist doch falsch, oder irre ich mich und Firefox macht es verkehrt?

    Schwierig zu sagen, weil das bisher nicht wirklich definiert ist und erst in HTML 5 zu definieren versucht wird.

    http://www.whatwg.org/specs/web-apps/current-work/multipage/dom.html#document.write()
    http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html#parsing-main-incdata

    Das ist aber mal wieder so kompliziert, dass ich nicht verstehe, welches Verfahren nun korrekt ist. Vom Gefühl her würde ich sagen, dass Firefox es korrekt macht und es Sinn machen würde, dieses Verhalten zu standardisieren.

    kann mir jemand eine Möglichkeit nennen, das Problem zu umschiffen?

    Nein. Ich denke nicht, dass du mit document.write da weiterkommen wirst. Eher über das DOM:

    document.write('<div id="container"><script src="extern.js"></script></div>')

    extern.js:

    pE = document.createElement("p");  
    pE.innerHTML = 'Bla';  
    document.getElementById("container").appendChild(pE);  
    delete pE;
    

    Mathias