lalilu: Neues Fenster - Eigenschaften zuweisen

Hallo!

Ausgehend von einem Hauptfenster öffne ich mit einer JS-Funktion ein neues Fenster und möchte diesem sofort  z.b. einen Titel und einer Ebene einen Inhalt zuweisen.

Keine Probleme beim IE (5.5). Bei Netscape 7.1 kommt es jedoch zur Fehlermeldung "Blatt.document.getElementById("monat_t") has no properties" und auch der Titel wird nicht übernommen (jedoch keine extra Fehlermeldung). Genauso verhalten sich auch Mozilla Firefox und Opera.

Wenn ich die Funktion nach dem "open" unterbreche (z.B. mit alert) oder ein zweites Mal starte und das Fenster "Blatt" vorher nicht wieder schließe, dann tritt der Fehler nicht auf und alles läuft wunschgemäß.

Ich schließe daraus: Der IE wartet, bis das Fenster komplett fertig ist und arbeitet dann erst mit dem nächsten Befehl weiter. Die anderen Browser starten das Fenster und warten nicht.

Wie kann ich feststellen, ob das Fenster vollständig(!) aufgebaut ist. (Die Möglichkeit im neu geöffneten Fenster mit "onload" weiterzuarbeiten scheidet aus diversen Gründen aus)

Hier die Funktion:

function test(){
  Blatt = window.open(document.F.template.value,"Blatt");
  //alert("Hallo");
  Blatt.document.title="Test";
  Blatt.document.getElementById("monat_t").innerHTML="Huhu";
  }

Viele Grüße

  1. Hallo,

    Ich schließe daraus: Der IE wartet, bis das Fenster komplett fertig ist und arbeitet dann erst mit dem nächsten Befehl weiter. Die anderen Browser starten das Fenster und warten nicht.

    Wie kann ich feststellen, ob das Fenster vollständig(!) aufgebaut ist. (Die Möglichkeit im neu geöffneten Fenster mit "onload" weiterzuarbeiten scheidet aus diversen Gründen aus)

    Wieso scheidet onload aus? Anders wird es jedenfalls nicht zuverlässig gehen, davon abgesehen, dass du das Fenster komplett dynamisch mit document.open(), document.write() und document.close() beschreiben könntest, was du sicherlich nicht möchtest.

    function test(){
      Blatt = window.open(document.F.template.value,"Blatt");
      //alert("Hallo");
      Blatt.document.title="Test";
      Blatt.document.getElementById("monat_t").innerHTML="Huhu";
      }

    Schematisch:

    function test() {
      Blatt = window.open(document.F.template.value,"Blatt");
      Blatt.onload=function () {
        Blatt.document.title="Test";
        Blatt.document.getElementById("monat_t").innerHTML="Huhu";
      }
    }

    Was ist daran nicht möglich?

    Mathias

    1. Deine Darstellung ist stark schematisch - zumindestens ist der Gebrauch von onload etwas eigenwillig und funktioniert so bei mir auch nicht.

      Das Problem warum ich nicht mit <body onload="test()"> im neu geöffneten Fenster weiterarbeiten kann, liegt diesmal bei einem "Sicherheitsfeature" des IE. Auf meiner Hauptseite kann der User in einem Formular eine Bilddatei in einem seiner Laufwerke auswählen ( <input type="file" ....>). Dieses Bild soll dann auf der neu aufgebauten Seite angezeigt werden (läuft ohne upload nur auf dem Rechner des Users). Wenn ich dies von der Hauptseite aus zuweise (ziel.getElementById("bild_q").src ="///"+ quelle.F.bild_datei.value;) dann geht das ohne Probleme (bei Mozilla, Opera mit obigem Problem). Wenn sich die neue Seite jedoch diesen Dateinamen ausliest und dann versucht die Datei anzuzeigen, dann meldet der IE "Zugriff wurde verweigert". Übrigens alle anderen getesteten Browser machen hier kein Problem (oder sehen es lockerer).

      1. Hallo,

        Das Problem warum ich nicht mit <body onload="test()"> im neu geöffneten Fenster weiterarbeiten kann, liegt diesmal bei einem "Sicherheitsfeature" des IE. Auf meiner Hauptseite kann der User in einem Formular eine Bilddatei in einem seiner Laufwerke auswählen ( <input type="file" ....>). Dieses Bild soll dann auf der neu aufgebauten Seite angezeigt werden (läuft ohne upload nur auf dem Rechner des Users). Wenn ich dies von der Hauptseite aus zuweise (ziel.getElementById("bild_q").src ="///"+ quelle.F.bild_datei.value;) dann geht das ohne Probleme (bei Mozilla, Opera mit obigem Problem). Wenn sich die neue Seite jedoch diesen Dateinamen ausliest und dann versucht die Datei anzuzeigen, dann meldet der IE "Zugriff wurde verweigert". Übrigens alle anderen getesteten Browser machen hier kein Problem (oder sehen es lockerer).

        Ich sehe das Problem dabei nicht, aber vielleicht missverstehe ich dich auch. Wenn beide die HTML-Dokumente auf demselben Rechner liegen bzw. über das lokale Netzwerk geöffnet werden, funktioniert es bei mir.

        a.html:

        <html>
        <head>
        <title>a</title>
        <script type="text/javascript">
        function oeffnefenster () {
         fenster=window.open('b.html', 'fenster', 'location=yes,status=yes,resizable=yes');
         return false;
        }
        function init () {
         document.forms['formular'].onsubmit=oeffnefenster;
        }
        window.onload=init;
        </script>
        </head>
        <body>
        <form action="a.html" name="formular">
        <p><input type="file" name="feld"></p>
        <p><input type="submit" name="submit" value="zeige"></p>
        </form>
        </body>
        </html>

        b.html:

        <html>
        <head>
        <title>b</title>
        <script type="text/javascript">
        window.onload=function () {
         document.images['bild'].src='///'+opener.document.forms['formular'].elements['feld'].value;
        }
        </script>
        </head>
        <body>
        <p><img src="blind.png" id="bild" alt="" /></p>
        </body>
        </html>

        Sobald zusätzliche Rechtezonen ins Spiel kommen, gibt es freilich kleine bzw. große Schwierigkeiten (angefangen bei den Adressschemata), aber solange Bilder aus derselben Zone geöffnet werden, in der die HTML-Dokumente liegen,  und kein Cross-Domain-Scripting stattfindet, funktioniert es in meinen Tests im MSIE 6 (vollgepatcht, Windows 98), Opera 7.5 und Firefox 0.9.

        Außerdem ließe sich das Ausgangsproblem auch direkter lösen, falls der Code in b.html bei dir die besagte Sicherheitswarnung auslöst. Soweit ich dich verstanden habe, funktioniert deinen Tests zufolge das Ändern des Bildes im MSIE von a aus, nicht von b wie in meinem obigen Beispiel. Dafür lässt sich sofort nach window.open() auf das Fenster zugreifen. Damit ließe sich eine entsprechende Abfrage einbauen, nach der das Bild entweder vom Ausgangsfenster oder vom neuen Fenster aus geändert wird:

        function oeffnefenster () {
         fenster=window.open('b.html', 'fenster', 'location=yes,status=yes,resizable=yes');
         if (fenster.document.images['bild']) { // falls direkt auf das Bild zugegriffen werden kann
          fenster.loadimage=false;
          fenster.document.title='neuer fenstertitel';
          fenster.document.images['bild'].src='///'+document.forms['formular'].elements['feld'].value;
         } else {
          fenster.loadimage=true; // falls nicht, dann setze eine Variable
         }
         return false;
        }

        In b.html:
        window.onload=function () {
         if (typeof(loadimage)!='undefined' && loadimage) { // führe nur dann aus, wenn das Bild nicht schon von a.html aus geändert wurde
          document.title='neuer fenstertitel';
          document.images['bild'].src='///'+opener.document.forms['formular'].elements['feld'].value;
         }
        }

        Vielleicht ließen sich damit die verschiedenen Browser zufriedenstellen. MSIE führt in meinen Tests die Bildänderung von a.html aus, Opera und Firefox von b.html aus.

        Mathias

  2. Keine Probleme beim IE (5.5). Bei Netscape 7.1 kommt es jedoch zur Fehlermeldung "Blatt.document.getElementById("monat_t") has no properties" und auch der Titel wird nicht übernommen (jedoch keine extra Fehlermeldung). Genauso verhalten sich auch Mozilla Firefox und Opera.

    Das Problem hatte ich auch schon mal. Da ich aber die HTML Seiten mit PHP aufgebaut habe, habe ich es anders gelöst. Also falls Du PHP, Perl, jsp oder asp verwendest, könntest Du die Werte beispielsweise der URL mitgeben (mit einem Post und hidden fields eines nicht sichtbaren Formulars, oder wenn Du Deine Seite per Link aufrufst, dann in den Link URL). Und diese Parameter/Wert Paare kannst Du dann in der nächsten Seite auslesen und dort in die entsprechenden Tags einbinden, z.B. <title>$meinuebergebenerTitle</title>

    Da JavaScript so Browserabhängig ist, gehe ich oft solche Wege.

    Wie kann ich feststellen, ob das Fenster vollständig(!) aufgebaut ist.

    Diese Frage kann ich Dir leider nicht beantworten.

    Eva