Frederik: Ersatz für document.write() in XHTML

Hallo!

Sowohl Opera als auch Gecko führen document.write() in XHTML-Dokumenten (mit xhtml-mimetype) nicht aus. Deswegen suche ich einen praktikablen Ersatz dafür.

Das Problem ist, dass ich ein großes bestehendes Projekt habe, das ursprünglich in HTML geschrieben war, das ich nun aber als XHTML weiterverwenden möchte. Die Konvertierung ist auch kein Problem, bleibt nur das mit document.write(). Es ist kein Problem, die document.write() aufrufe über eine RegEx durch etwas anderes zu ersetzen, das einen string entgegennimmt. Ich kann aber nicht alle Skripte im Projekt auf DOM-Operationen umstellen.

Ein erster Ansatz war, insertAdjacentHTML zu nehmen, das funktioniert zumindest in Opera auch mit XHTML. Allerdings muss man dies auf ein Element anwenden. Daher müsste ich irgendwie das script-Element ermitteln, in dem die Funktion steht, um dann dahinter den HTML-String einzufügen. Gibt es dafür eine Möglichkeit?

Vielleicht gibt es aber auch noch eine bessere Möglichkeit, daher bin ich für Tipps sehr dankbar.

Liebe Grüße
Frederik

  1. Hi,

    Sowohl Opera als auch Gecko führen document.write() in XHTML-Dokumenten (mit xhtml-mimetype) nicht aus.

    Koennen sie ja auch gar nicht - Why document.write() doesn't work in XML

    Das Problem ist, dass ich ein großes bestehendes Projekt habe, das ursprünglich in HTML geschrieben war, das ich nun aber als XHTML weiterverwenden möchte. Die Konvertierung ist auch kein Problem, bleibt nur das mit document.write(). Es ist kein Problem, die document.write() aufrufe über eine RegEx durch etwas anderes zu ersetzen, das einen string entgegennimmt. Ich kann aber nicht alle Skripte im Projekt auf DOM-Operationen umstellen.

    Warum nicht?
    Du *willst* ein Projekt umstellen, die dahinter liegende Technik veraendern - sowas *ist* nun mal mit Aufwaenden verbunden.

    Ein erster Ansatz war, insertAdjacentHTML zu nehmen, das funktioniert zumindest in Opera auch mit XHTML. Allerdings muss man dies auf ein Element anwenden. Daher müsste ich irgendwie das script-Element ermitteln, in dem die Funktion steht, um dann dahinter den HTML-String einzufügen. Gibt es dafür eine Möglichkeit?

    Mir ist keine bekannt.

    MfG ChrisB

    1. Sowohl Opera als auch Gecko führen document.write() in XHTML-Dokumenten (mit xhtml-mimetype) nicht aus.

      Koennen sie ja auch gar nicht - Why document.write() doesn't work in XML

      Danke für den Link, ist eine ganz gute Erklärung. Wobei ich noch nicht ganz verstehe, warum document.write() ganz verboten wird, obwohl ich ja auch wohlgeformte XML-Stücke ausgeben könnte. Aber wichtig ist ja nur die Info, dass es nicht geht.

      Warum nicht?
      Du *willst* ein Projekt umstellen, die dahinter liegende Technik veraendern - sowas *ist* nun mal mit Aufwaenden verbunden.

      Es ist eher eine Spielerei, ich will rausfinden, wie weit man das bestehende Projekt aufbohren kann. Das rechtfertigt einfach nicht den Aufwand, die Mengen an JS umzuschreiben, die da im Spiel sind.

      Liebe Grüße
      Frederik

  2. Hallo,

    Sowohl Opera als auch Gecko führen document.write() in XHTML-Dokumenten (mit xhtml-mimetype) nicht aus. Deswegen suche ich einen praktikablen Ersatz dafür.

    Gibt es nicht!
    (Behaupte ich mal kühn.)

    Daher müsste ich irgendwie das script-Element ermitteln, in dem die Funktion steht, um dann dahinter den HTML-String einzufügen. Gibt es dafür eine Möglichkeit?

    Nicht wirklich. Du könntest annehmen, dass das Script-Element das letzte gerparste ist und der Elementbaum genau bis da schon zur Verfügung steht:

    document.xhtmlWrite = function (str) {  
     var nodelist = document.getElementsByTagName("*");  
     var script = nodelist.item(nodelist.length - 1);  
     var div = document.createElement("div");  
     div.innerHTML = str;  
     script.parentNode.insertBefore(div.firstChild, script);  
    };
    

    Vielleicht gibt es aber auch noch eine bessere Möglichkeit, daher bin ich für Tipps sehr dankbar.

    Bleib am besten bei XHTML als text/html. Ich würde nicht empfehlen, da herumzubasteln. Bastelei wird unzuverlässig. Ich würde obigen Code nicht live einsetzen. Er macht zuviele Annahmen. Gut, man könnte Abfragen einbauen - aber was hat man davon. Wenn sie scheitern, funktioniert die Site trotzdem nicht.

    Mathias

    1. Daher müsste ich irgendwie das script-Element ermitteln, in dem die Funktion steht, um dann dahinter den HTML-String einzufügen. Gibt es dafür eine Möglichkeit?

      Nicht wirklich. Du könntest annehmen, dass das Script-Element das letzte gerparste ist und der Elementbaum genau bis da schon zur Verfügung steht:

      document.xhtmlWrite = function (str) {

      var nodelist = document.getElementsByTagName("*");
      var script = nodelist.item(nodelist.length - 1);
      var div = document.createElement("div");
      div.innerHTML = str;
      script.parentNode.insertBefore(div.firstChild, script);
      };

        
      Ah, danke für den Ansatz! Das war der richtige Tipp!  
        
      Ich bin damit gut weitergekommen:  
        
      `var scripts = document.getElementsByTagName("script"); var script = scripts[scripts.length - 1]; script.insertAdjacentHTML("afterEnd",str)`{:.language-javascript}  
        
      Ich weiß, dass das unsauber ist und zudem nur in Opera funktioniert, aber für meinen Zweck reicht es erst einmal, wenn das bei mir läuft.  
        
      
      > > Vielleicht gibt es aber auch noch eine bessere Möglichkeit, daher bin ich für Tipps sehr dankbar.  
      >   
      > Bleib am besten bei XHTML als text/html. Ich würde nicht empfehlen, da herumzubasteln. Bastelei wird unzuverlässig. Ich würde obigen Code nicht live einsetzen. Er macht zuviele Annahmen. Gut, man könnte Abfragen einbauen - aber was hat man davon. Wenn sie scheitern, funktioniert die Site trotzdem nicht.  
        
      XHTML als text/html kann aber nicht mit SVG gemischt werden. Und genau damit will ich ein bisschen experimentieren. Dafür muss das Dokument aber als XML geparst werden.  
        
      Danke noch mal und liebe Grüße  
      Frederik