Piere: DOM Node in leeres popup-fenster hängen

Hallo,

ich verzweifle. Wie geht das:

// Das popup-fenster:
  var popup = window.open( 'about:blank', 'MeinPopup');
  // Das element das in das popup soll:
  var div = document.createElement( 'div');
  ///////////////////////////////////////////////
  // Hänge nun das element in das fenster:
  // Version 1:
  popup.document.appendChild( div); // fehler
  //// geht grunsätzlich nicht, warum auch immer
  ///////////////////////////////////////////////
  // Version 2:
  popup.document.open( );
  popup.document.write( '<body/>');
  popup.document.close( );
  popup.document.getElementsByName( 'body')[0].appendChild( div);
  //// geht auch nicht, fehler mit IE6, MOZ hingegen wunderbar
  ///////////////////////////////////////////////

??? Ich habe keine Idee mehr wie ich das machen soll.
Bitte helft mir!

  1. hi,

    Ich habe keine Idee mehr wie ich das machen soll.

    Hm, gute Frage, die du da aufwirfst - hatte so einen Fall bisher noch nicht, weiß also spontan auch keine Lösung.

    Ob in einem leeren "Fenster" bereits document.documentElement existiert, so dass man darin Knoten einhängen könnte? Ich weiß es nicht, ggf. ausprobieren.

    Andernfalls wäre mein erster Vorschlag für ein simpler Workaround: Nicht about:blank öffnen lassen, sondern ein Minimal-Dokument, welches html und ggf. body bereits enthält, und dann nach dem Laden dessen diese Elemente manipulieren ...

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo wahsaga.

      Ob in einem leeren "Fenster" bereits document.documentElement existiert, so dass man darin Knoten einhängen könnte? Ich weiß es nicht, ggf. ausprobieren.

      Das geht recht fix;

      1. Neuer Tab geöffnet

      2. In Adresszeile: „javascript:alert(typeof(document.documentElement));“

      3. In Adresszeile: „javascript:alert(typeof(document.body));“

      Letzteres ergibt im Opera, Firefox und IE zwei mal „object“.
      Konqueror unterstützt das Pseudoprotokoll „javascript“ leider nicht.

      Einen schönen Samstag noch.

      Gruß, Ashura

      --
      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
      mathbr:del.icio.us/ mathbr:w00t/
      1. Hallo,

        und danke erstmal fürs antworten :)

        Letzteres ergibt im Opera, Firefox und IE zwei mal „object“.
        Konqueror unterstützt das Pseudoprotokoll „javascript“ leider nicht.

        IE6 gibt mir hier diesen Fehler: Schnittstelle nicht unterstützt.

        Das ist bei allen bisherigen Tests der Fall gewesen. Und glaubt mir, ich habe es mit jedem Object probiert, das auch nur annähnernd danach aussah dafür geeignet zu sein.

        Andernfalls wäre mein erster Vorschlag für ein simpler Workaround: Nicht about:blank öffnen lassen, sondern ein Minimal-Dokument, welches html und ggf. body bereits enthält, und dann nach dem Laden dessen diese Elemente manipulieren ...

        Den Workaround habe ich auch schon versucht; Wobei das nur aus interresse, da das keine option für das ist, woran ich atm arbeite (eine lib die sich an standarts hält; zero tollerance 4 workarounds) Der gleiche Fehler.

        Wenn also keiner hier noch ne idee hat, bzw mir einen Standardweg zeigen kann, muss ich wohl IE6 von der kompatibilitylist streichen...

        Anyone? Muss doch gehen, ist doch DOM... oder sind die da so doof?

        Oder kann es sein dass _ich_ den IE6 zu stark in den Sicherheitsrichtlinien eingeschränkt habe? Würde mich ja stark wundern.

        Bin jedenfalls für Vorschläge offen, einen halben Tag an diesem ****** zu verplempern ist... nah, genug aufgeregt, vllt hat ja doch noch wer ne idee?

        Einen schönen abend noch,
        Piere.

        1. Hallo Piere.

          IE6 gibt mir hier diesen Fehler: Schnittstelle nicht unterstützt.

          Da kann etwas nicht normal sein; selbst mein IE 5.0 und IE 5.5 geben mir exakt dasselbe aus, wie mein IE 6.0.

          Oder kann es sein dass _ich_ den IE6 zu stark in den Sicherheitsrichtlinien eingeschränkt habe? Würde mich ja stark wundern.

          Würde ich aber in Betracht ziehen.

          Einen schönen Samstag noch.

          Gruß, Ashura

          --
          sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
          mathbr:del.icio.us/ mathbr:w00t/
          1. Hallo Piere.

            »»

            IE6 gibt mir hier diesen Fehler: Schnittstelle nicht unterstützt.

            »»

            Da kann etwas nicht normal sein; selbst mein IE 5.0 und IE 5.5 geben mir exakt dasselbe aus, wie mein IE 6.0.

            Also ich meinte, dass bei

            popup.document.body.appendChild( div);

            der Fehler beim IE6 auftritt. und das bei documentElements, head, div, usw...

            Zum testen hier der Code:

            http://dvdscout.blogspot.com/2006/02/dom-javascript-und-ie6.html

            Funktioniert überall nur nicht im IE6. Oder nur bei mir nicht?

            Der Code hier nochmal:

            var div = document.createElement( 'div');
              div.appendChild( document.createTextNode( 'foo'));
              var popup = window.open( '', 'bar', '');
              popup.document.body.appendChild( div);

            Was ist der standart für die letzte Zeile? body ja wohl nicht, oder?

            Oder kann es sein dass _ich_ den IE6 zu stark in den Sicherheitsrichtlinien eingeschränkt habe? Würde mich ja stark wundern.

            »»

            Würde ich aber in Betracht ziehen.

            Habe ich eben, runtergedreht, alles angemacht, alles alles alles und trotzdem: Schnittstelle nicht unterstützt.

            ???

            Bitte schreibt, wie sich der IE bei euch verhält und ob event. doch 'foo' im popup erscheint.

            Danke,
            Piere.

            1. Hallo Piere

              Der Code hier nochmal:

              var div = document.createElement( 'div');
                div.appendChild( document.createTextNode( 'foo'));
                var popup = window.open( '', 'bar', '');
                popup.document.body.appendChild( div);

              Warum nicht so:

                   var popup = window.open( '', 'bar', '');  
                   var div = popup.document.createElement( 'div');  
                   div.appendChild( popup.document.createTextNode( 'foo'));  
                   popup.document.body.appendChild( div);  
              
              

              Auf Wiederlesen
              Detlef

              --
              - Wissen ist gut
              - Können ist besser
              - aber das Beste und Interessanteste ist der Weg dahin!
              1. Warum nicht so:

                var popup = window.open( '', 'bar', '');

                var div = popup.document.createElement( 'div');
                     div.appendChild( popup.document.createTextNode( 'foo'));
                     popup.document.body.appendChild( div);

                  
                Weil es keinen Unterschied macht woher das Object kommt. Auch das habe ich probiert und wie erwartet: Es macht keinen Unterschied, IE spinnt rum.  
                  
                oder?  
                  
                Gruss, Piere.
                
                1. Hallo Piere

                  Weil es keinen Unterschied macht woher das Object kommt. Auch das habe ich probiert und wie erwartet: Es macht keinen Unterschied, IE spinnt rum.

                  OK, wenn du meinst, du brauchst es ja nicht zu probieren.

                  Mein IE6 bring bei deinem Script ein leeres Popup und die Fehlermeldung:
                  "Schnittstelle nicht unterstützt"

                  Bei meiner Version allerdings erfolgt keine Fehlermeldung und ich bekomme ein
                  Popup mit "foo" darin.

                  Auf Wiederlesen
                  Detlef

                  --
                  - Wissen ist gut
                  - Können ist besser
                  - aber das Beste und Interessanteste ist der Weg dahin!
                  1. Guten Morgen,

                    OK, wenn du meinst, du brauchst es ja nicht zu probieren.

                    Hab ich aber probiert ;)

                    Bei meiner Version allerdings erfolgt keine Fehlermeldung und ich bekomme ein
                    Popup mit "foo" darin.

                    Okay, dann wird das wohl der IE hier sein. Komisch.

                    Anyway, ich frage mich allerdings noch immer, was nun die standart-methode dafür sein soll... werd wohl nen neuen thread aufmachen.

                    gruss, piere.

                    Und danke an Detlef, Ashura, lbnl: wahsaga.

                    1. Bei meiner Version allerdings erfolgt keine Fehlermeldung und ich bekomme ein
                      Popup mit "foo" darin.

                      Okay, dann wird das wohl der IE hier sein. Komisch.

                      Auch hier geht die Version von Detlef problemlos mit dem IE. Evtl. hast du sie nicht richtig umgesetzt.

                      Anyway, ich frage mich allerdings noch immer, was nun die standart-methode dafür sein soll... werd wohl nen neuen thread aufmachen.

                      (Es heißt Standard!!! eine Standarte ist etwas anderes)

                      Eigentlich ist es logisch, dass du nur Elemente in ein Fenster einfügen kannst, die auch dort erzeugt wurden. Ansonsten hieße die Funktion auch nicht document.createElement sondern eher window.createChild()

                      Struppi.

                      1. Hallo Struppi,

                        ein Missverständniss:

                        Auch hier geht die Version von Detlef problemlos mit dem IE. Evtl. hast du sie nicht richtig umgesetzt.

                        Beides geht, es macht keinen Unterschied. Und wenn du den link aus meinem Post angeklickt hast, dann ist das meine Version. Meine ganz alleine ;)

                        Aber wie gesagt es macht keinen Unterschied.

                        (Es heißt Standard!!! eine Standarte ist etwas anderes)

                        I know, i know. Sagen wir, dass ich die ARD nicht mag ;)

                        Eigentlich ist es logisch, dass du nur Elemente in ein Fenster einfügen kannst, die auch dort erzeugt wurden. Ansonsten hieße die Funktion auch nicht document.createElement sondern eher window.createChild()

                        Warum? Nur weil es logisch erscheint, muss es nicht logisch sein ;)

                        Es ist eher so, dass document.createElement immer ein und dieselbe funktion ist, egal von wo aus diese aufgerufen wird. Ist sowas wie eine statische methode. Dass die funktion createElement nur in document zu finden ist, hat Namensraumgründe.

                        Desweiteren: Sobald ein NodeObject mit document.createElement erzeugt wird, steht dieses Element für sich selbst. Es hat keinen parentNode und auch sonst keine Informationen von wo aus das NodeElement erzeugt wurde. Erst wenn man es per appendChild an einen anderen Node hängt ist es mit einem anderen element verbunden. Aber selbst dann steht es immer noch für sich selbst und ist nicht abhängig vom documentobject oder sonst einem. Es ist ein komplett neues Objekt.

                        Gruss, piere.

                        ps: Vorhandene und gefundene Rechschreib- und Grammatikfehler können behalten werden ;)

  2. Hallo Piere

    var div = document.createElement( 'div');

    Du hast also ein Element im aktuellen Dokument erzeugt.

    popup.document.appendChild( div); // fehler

    Hier versuchst du ein Element des openers ins Dom von popup zu hängen.

    Vielleicht solltest du mal
    var div = popup.document.createElement( 'div');
    versuchen.

    // Version 2:
      popup.document.open( );
      popup.document.write( '<body/>');
      popup.document.close( );
      popup.document.getElementsByName( 'body')[0].appendChild( div);

    Wann hast du das Element erzeugt, dass du einhängen willst?

    Auf Wiederlesen
    Detlef

    --
    - Wissen ist gut
    - Können ist besser
    - aber das Beste und Interessanteste ist der Weg dahin!
  3. Hallo,

    habe mich nochmals ungesehen und hier nun die Standard(t)Lösung:

    var div = document.createElement( 'div');
      div.appendChild( document.createTextNode( 'foo'));
      var popup = window.open( '', 'bar', '');
      popup.document.documentElement.appendChild( div);

    Wichtig ist hierbei die letzte Zeile. Laut:
    http://www.w3.org/TR/DOM-Level-2-Core/core.html#i-Document

    ist "documentElement" immer ein attribut von "document".

    Thats it, thanx for the replays and
    Einen schönen Sonntag noch,
    Piere.

    1. Hallo Piere

      var div = document.createElement( 'div');
        div.appendChild( document.createTextNode( 'foo'));
        var popup = window.open( '', 'bar', '');
        popup.document.documentElement.appendChild( div);

      IE 6.0.2800.1106 - leeres Popup und Javascript-Fehlermeldung: "Schnittstelle nicht unterstützt"
      Opera 8.51 - leeres Popup (allerdings bei allen Varianten)
      Firefox 1.5.0.1 - Popup mit "foo", kein Fehler

      Auf Wiederlesen
      Detlef

      --
      - Wissen ist gut
      - Können ist besser
      - aber das Beste und Interessanteste ist der Weg dahin!
  4. Hallo,

    ich habe nun weitestgehend alle Browservarianten überprüfen können (dank an Detlef) und so siehts aus:

    https://forum.selfhtml.org/?t=124535&m=802512