Daniel (unregistriert): 2 kleine JavaScript Probleme

Guten Abend,
erst mal Entschuldigung für den nicht gerade aussagekräftigen Titel, habe leider nichts kurzes für meine beiden Problemchen gefunden.

Zum Problem:
Ich habe mir mit JavaScript eine Funktion zum Anzeigen von Bildern in einem Popup geschrieben.

Zur Funktion:

  • Sie hat die Parameter bild,w,h (Bilddatei, Breite des Bilds, Höhe des Bilds)
  • Bei ihrem Aufruf prüft die Funktion, ob das Objekt „fenster“ bereits existiert (=bereits ein Bild angezeigt wird/ein Fenster geöffnet ist).
     a)Ist dies der Fall, wird das Fenster geschlossen und anschließend ein neues mit dem als  Parameter übergebenen Inhalt geöffnet. Der Inhalt wird dynamisch erzeugt.
    (das Fenster wird erst geschlossen, um unnötig viele Fenster beim Anwender zu vermeiden und vor allem das Bild/Fenster gleich in den Vordergrund zu bekommen, wer kennt nicht das Problem – man klickt etwas an, hat bereits ein JavaScript Fenster offen und sucht dann erst mal!)
     b)Ist dies nicht der Fall, wird natürlich erst recht ein Fenster mit Inhalt geöffnet

Also eigentlich ne ganz simple Sache, den (kommentierten) Code findet ihr unter
http://user4893.piranho.com/selfhtml/sample.txt
Ein Beispiel unter
http://user4893.piranho.com/selfhtml/

Folgende Probleme treten auf:

  1. Aktualisiert man das per JavaScript geöffnete Fenster mit dynamischen Inhalt, ändert sich der Inhalt bzw. das Bild wird plötzlich nicht mehr angezeigt. Dies ist beim Firefox als auch bei Opera der Fall, nicht aber beim IE – warum auch immer.
    Der Firefox spuckt in der Error Console folgende Meldung aus:
    Security Error: Content at wyciwyg://0/file:///C:/sample/index.htm may not load or link to file:///C:/sample/index.htm.
    Wirklich weiter hilft mir das aber nicht ):

  2. Nur Opera:
    Klickt den Link einmal an, schließt dann das Fenster. Klickt den Link nun noch einmal an – im Opera funktioniert die Funktion nun plötzlich nicht mehr, es wird kein weiteres Popup mehr geöffnet. Auch hier weiß ich nicht wirklich woran dies liegen könnte, ein Fehlerlog konnte ich im Opera nicht finden?

Vielen Dank schonmal für eure Hilfe :-)

  1. Hallo Daniel (unregistriert),

    du muß das Fenster nicht immerzu schließen. Wenn Du prüfst, ob es vorhanden ist und der Wert true ist, dann gib den Fenster einfach erneut den Focus. Sollte sich die Größe auch verändern, da sich die Bildmaße ändern, sollte ein resizeTo() abhilfe schaffen.

    Oper 9 bemängelt (zu recht?) Deine Prüffunktion:

      
    isDefined = function(variable){  
    return this[variable] === undefined ? false : true;  
    };  
      
     if(isDefined("fenster"))  
    {  
    alert(  isDefined("fenster")  );  
    fenster.close();  
    }
    

    ist das Fenster geschlossen, so wirft die Methode trotzdem true zurück. Daraufhin versuchst Du das Fenster dann zu schließen - es existiert aber nicht.

    Mit freundlichem Gruß
    Micha

    --
    LeagueEditor JavaScript kostenlose Ligaverwaltung || richtig Messen will gelernt sein
    1. Danke für deine Antwort.
      Wusste nicht das fenster.focus() das Popup Fenster auch zwangsweise maximiert.

      Mein Problem ist also wohl zur Zeit zu überprüfen, ob das Fenster bereits geöffnet ist oder nicht - wie kann ich das denn zuverlässig machen?

      An das resizen habe ich garnicht gedacht (war bisher ein netter Nebeneffekt bzw. nicht nötig), mit dem neu öffnen des Fensters würde ich aber viele Punkte auf einmal erledigen:

      • resizen
      • focus
      • vermeiden unnötig vieler Fenster

      Insofern würde ich gerne an diesem Weg festhalten - sofern möglich!?

      Alternativ zum Überprüfen ob das Fenster offen ist, könnte man ja bei jedem öffnen eines Fensters/Aufruf der Funktion eine Variable z.b. geoeffnetefenster um 1 erhöhen und die Namen dynamisch mit fenster_"+geoeffnetefenster+" festlegen und bei jedem Aufruf das vorherige Fenster schließen - also fenster_"+geoeffnetefenster+", danach erhöht man geoeffnetefenster um 1. Aber das wäre nur meine Alternatividee.

      1. Hallo Daniel (unregistriert),

        Wusste nicht das fenster.focus() das Popup Fenster auch zwangsweise maximiert.

        Das tut es sicher nicht!

        Mein Problem ist also wohl zur Zeit zu überprüfen, ob das Fenster bereits geöffnet ist oder nicht - wie kann ich das denn zuverlässig machen?

        Eben, da Du es nicht kannst - zumindest stellt sich mein Opera da Quer - lass es doch einfach. Wenn ein Fenster offen ist und Du erneut versuchst, ein Fenster mit dem selben Namen zu öffnen, dann nimmt der Browser das bereits offene - wozu schließen und erneut öffnen? Sollte es nicht offen sein, öffnet er es. Um es in den Vordergrund zu holen, nutzt Du bei jedem aufruf f.focus();

        viele Punkte auf einmal erledigen:

        • resizen
        • focus
        • vermeiden unnötig vieler Fenster

        Nö, die Abfrage, die Du jetzt hast, funktioniert nicht, somit gibt es keine "vielen" Pluspunkte aber einen entscheidenen Minuspunkt ;)

        Insofern würde ich gerne an diesem Weg festhalten - sofern möglich!?

        Dann lebe damit.

        Mit freundlichem Gruß
        Micha

        --
        LeagueEditor JavaScript kostenlose Ligaverwaltung || richtig Messen will gelernt sein
        1. Wusste nicht das fenster.focus() das Popup Fenster auch zwangsweise maximiert.

          Das tut es sicher nicht!
          Meinte natürlich in den Vordergrund holt, dachte das "blinkt" dann nur (unten in der Taskleiste, unter XP) bzw. Hotkeys etc beziehen sich dann auf dieses Fenster.

          Fenster wieder nutzen und focus ist wohl wirklich das Beste, irgendwie bin ich drauf net gekommen, obwohls so einfach ist, danke!
          Alternativ hab ichs auch hinbekommen zu prüfen ob das Fenster offen ist - und zwar unter allen Browsern:
          function geoffnet(variable)
          {
          if(this[variable]=="[object Window]" || this[variable]=="[object]")
          {
          return true;
          }
          return false;
          }

          true: Fenster geöffnet, false: geschlossen (bzw technisch genauer nur ob Variable vom Typ "[object Window]" ist)