[JavaScript] IE stürzt ab, Firefox macht garnix

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [JavaScript] IE stürzt ab, Firefox macht garnix

    Hallo Zusammen,

    ich schreibe zur Zeit ein einem Projekt wo ich mit PHP und Mysql Daten erfassen will. Teile der Daten stehen schon in einer andern Datenbanktabelle so dass man sie über ein Pulldownmenü wählen kann. Nun soll man die Möglichkeit haben diesem Pulldownmenü neue Einträge hinzuzufügen und dies soll in einer neun Seite geschehen.

    Die neue Seite öffne ich mit diesem Skript:
    Code:
    <script language="JavaScript">
     <!--
       self.name="taskWin";	
       function openCategoryWindow()
       {
         var catWin = window.open("category.php", "categoryWindow",
             "width=750,height=130,scrollbars=no,resizable=no,location=no");
    
    	 
         catWin.document.form.description.value=this.document.taskform.description.value;
         catWin.document.form.due_day.value=this.document.taskform.due_day.value;
    	 catWin.document.form.due_month.value= this.document.taskform.due_month.value; 
    	 catWin.document.form.due_year.value=this.document.taskform.due_year.value; 
    	 catWin.document.form.cost.value=this.document.taskform.cost.value;
    	 catWin.document.form.start_day.value=this.document.taskform.start_day.value;
    	 catWin.document.form.start_month.value=this.document.taskform.start_month.value; 
    	 catWin.document.form.start_year.value=this.document.taskform.start_year.value;
    	 catWin.document.form.completion.value=this.document.taskform.completion.value;
    	 catWin.document.form.finished_day.value=this.document.taskform.finished_day.value;
    	 catWin.document.form.finished_month.value=this.document.taskform.finished_month.value;
    	 catWin.document.form.finished_year.value=this.document.taskform.finished_year.value; 
    	 catWin.document.form.priority.value=this.document.taskform.priority.value; 
    	 catWin.document.form.reminder_on.value.value=this.document.taskform.reminder_on.value;
    	 catWin.document.form.reminder_day.value=this.document.taskform.reminder_day.value;
    	 catWin.document.form.reminder_month.value=this.document.taskform.reminder_month.value;
    	 catWin.document.form.reminder_year.value=this.document.taskform.reminder_year.value; 
    	 catWin.document.form.reminder_time.value=this.document.taskform.reminder_time.value;
     	 catWin.document.form.responsibleURI.value=this.document.taskform.responsibleURI.value;
     	 catWin.document.form.notice.value=this.document.taskform.notice;
     	 catWin.document.form.private.value=this.document.taskform.private;			 
    
     	 catWin.focus();
     	
       }
    
      //-->
     </script>
    <a href="javascriptpenCategoryWindow();">neu</a>

    Die neue Seite wird Problemlos geöffnet. Füllt man auf der neuen Seite das dortige Formulars aus (ein Eingabefeld und für jeden übergebenen Wert ein hidden-Feld) und schickt es ab hängt sich das Hauptfenster auf. D.h. ich bekomme nur die alte Seite zu sehen und muss das Fenster mit dem Dialog Sofort beenden schließen da es ansonsten nicht mehr reagiert.

    Als ich testen wollte was Firefox mit dem Srcipt macht musste ich fest stellen, das sich dieser einfach weigert den link
    <a href="javascriptpenCategoryWindow();">neu</a>
    auszuführen.

    Kann mir irgentwer weiter helfen???

    Vieldank, schon mal im Vorraus
    Zuletzt geändert von Mr.Programe; 08.06.2005, 16:29.
    Wissen ist Macht
    Power is nothing without control

  • #2
    Morn morn,

    schonmal die Javascript Konsole von FF bemüht ? Was für Fehler werden dort angezeigt ?

    Gruss

    tobi
    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

    Kommentar


    • #3
      Re: [JavaScript] IE stürzt ab, Firefox macht garnix

      du solltest nicht augenblicklich nach dem öffnen des neuen fensters auf teile des darin liegenden dokumentes zugreifen - weil das nämlich idR. gar nicht so schnell geladen ist.
      hier muss also nach dem öffnen mal mindestens ein timeout rein. besser wäre es natürlich noch, wenn das neue fenster selber sich die werte vom öffnenden fenster holt.

      Als ich testen wollte was Firefox mit dem Srcipt macht musste ich fest stellen, das sich dieser einfach weigert den link
      <a href="javascriptpenCategoryWindow();">neu</a>
      auszuführen.
      *omfg*
      dass dies eine der besch...ensten arten ist, javascript aufzurufen, wurde hier schon dutzende male erwähnt. also mach es bitte vernünftig.
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        Erst mal danke für die Hilfe, die FF Javascript Konsole hat mir sehr geholfen (kannte ich vorher nicht) und auf die Idee mit dem Timeout wäre ich nie gekommen.

        Ich hab die Datenübergabe in das 2. Fenster verlegt so das mein Skript im ersten nun wiefolgt lautet:

        Code:
        <script language="JavaScript">
         <!--
           self.name='taskWin';	
           function openCategoryWindow()
           {
             var catWin = window.open("category.php", "categoryWindow",
                 "width=750,height=130,scrollbars=no,resizable=no,location=no");
        	 
             if(catWin.opener==null)
             {	catWin.opener=self;	}
             catWin.focus(); 	
           }
          //-->
         </script>
        Im 2. Fester rufe ich dann die Funktion getdata() mit onload im <body> auf

        Code:
        function getdata()
        {    
           setTimeout("",500);
            this.document.form.description.value=this.opener.document.taskform.description.value;
        ...
        }
        Nach der eingabe sollen die Daten dann wieder zurück zum ersten Fenster, dies Realisiere ich hiermit.

        Code:
        <form  action="task.php" name="form" target="taskWin" onsubmit="self.close()">
        (Wenn ich als Target "this.opener" angebe wird ein neues Fenster geöffnet. Ich hätte erwartet das taskWin und this.opener identisch wären?!)

        Beim IE läuft das Skript jetzt auch so wie es soll. Aber Firefox schließt nur das 2. Fenster und übergibt nicht die Daten ans Erste, wenn ich das Formular abschicke.
        Entferne ich nun das onsubmit="self.close()" übermittelt FF die Daten auch einbandfrei.
        Ich habe auch noch versucht vom Hauptfenster aus das 2. Fenster zu schließen.

        [code]catWin.close();[code]

        Dies Funktioniert aber nicht (FF Javakonsole sagt mir catWin sei nicht definiert).

        @wahsaga: ich hab mich mal im Forum umgeschaut und auch versucht über die Suchfunktion etwas zum Thema Javascript aufrufen mit href zufinden, hab aber immer nur meine Variante gesehen. Sie Funktioniert jetzt auch wo die Funktion keine Fehler mehr Produziert, aber wenn du mir einen link zu Threads postest würde ich mir das ganze gerne nochmal durch lesen.

        Nochmal Danke für eure Antworten ihr habt mir sehr geholfen
        Zuletzt geändert von Mr.Programe; 10.06.2005, 12:22.
        Wissen ist Macht
        Power is nothing without control

        Kommentar


        • #5
          Original geschrieben von Mr.Programe
          Code:
             setTimeout("",500);
          "warte 500 millisekunden, und mache dann nichts"?
          wirf das bitte raus, es ist absolut sinnfrei.

          (Wenn ich als Target "this.opener" angebe wird ein neues Fenster geöffnet. Ich hätte erwartet das taskWin und this.opener identisch wären?!)
          nein.
          das eine, taskWin, ist ein fenstername, mit dem HTML als inhalt von target etwas anzufangen weiß.
          this.opener hingegen ist eine javascript-objektinstanz - für die interessiert sich HTML natürlich kein bisschen.

          Beim IE läuft das Skript jetzt auch so wie es soll. Aber Firefox schließt nur das 2. Fenster und übergibt nicht die Daten ans Erste, wenn ich das Formular abschicke.
          ja, das war auch zu erwarten. die eventhandler werden immer aktiv, bevor die eigentliche "HTML-aktion" ausgeführt wird. also wird das fenster mit onSubmit im form geschlossen, bevor das formular überhaupt abgesendet wird.
          dass der IE es hier anders macht, ist mal wieder seine tierische inkonsequenz.

          Ich habe auch noch versucht vom Hauptfenster aus das 2. Fenster zu schließen.
          [code]catWin.close();[code]
          Dies Funktioniert aber nicht (FF Javakonsole sagt mir catWin sei nicht definiert).
          catWin ist bei dir eine lokale variable innerhalb der funktion openCategoryWindow() - außerhalb dieser existiert sie schlicht nicht mehr.

          informiere dich mal bei selfhtml über globale vs. lokale variablen:
          http://de.selfhtml.org/javascript/sp...htm#definieren
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            catWin ist bei dir eine lokale variable innerhalb der funktion openCategoryWindow() - außerhalb dieser existiert sie schlicht nicht mehr.
            Ok, ich hab das geändert
            Code:
            function openCategoryWindow()
               {
                     catWin = window.open("category.php", "categoryWindow",
                     "width=750,height=130,scrollbars=no,resizable=no,location=no");
            	 
                 if(catWin.opener==null)
                 {	catWin.opener=self;	}
                 
            	 catWin.focus();
               }
            aber wenn die Daten vom 2. Fenster zurück kommen, ist catWin wieder undefinert. Ich denke das liegt einfach daran daß die Seite neu Aufgebaut wird sobald ich die Daten wieder zum Hauptfenster zurück gebe.

            Ich hab weder einen Möglichkeit gefunden javascript Objekt (also das Fenster Objekt catWin) von einem Fenster zum andern zu übergeben, noch die Variable irgentwie dem Fenster Objekt (taskWin) zu übergeben damit sie nicht durch das neu laden gelöscht wird.
            Wissen ist Macht
            Power is nothing without control

            Kommentar


            • #7
              Original geschrieben von Mr.Programe
              Ich denke das liegt einfach daran daß die Seite neu Aufgebaut wird sobald ich die Daten wieder zum Hauptfenster zurück gebe.
              ja, das stimmt natürlich - dabei gehen die javascript-variablen natürlich verloren.


              aber auch dafür gibt's eine lösung:
              du machst auf der seite, die die formulardaten empfangen hat und das popup schließen soll, dass popup einfach noch mal auf, mit dem selben fensternamen - dadurch wird das schon bestehende fenster benutzt, und du hast jetzt wieder eine referenz auf es, mit dem du es schließen kannst:
              Code:
              window.open("about[i][/i]:blank", "[b]categoryWindow[/b]").close();
              Zuletzt geändert von wahsaga; 10.06.2005, 16:23.
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                Sehr schön, das tut's.

                Und nochmal Vielen dank, ohne deine Hilfe wäre ich wohl noch verzweifelt.
                Wissen ist Macht
                Power is nothing without control

                Kommentar


                • #9
                  Wie oben geschrieben läuft das ganz nun fast immer gut. Nur schmiert mir von Zeit zu Zeit der IE ab (keine Rückmeldung) und die Javascriptkonsole des FF bringt immer Fehlermeldungen.

                  Hier die Zeilen zu dennen die Fehlermeldungen scheinbar gehören (zumindest verschwinden sie wenn ich die Zeile lösche)
                  Code:
                     window.open("about:blank", "categoryWindow").close();
                     window.open("about:blank", "calendarWindow").close();
                  Code:
                  Fehler: uncaught exception: [Exception... "Component returned failure
                  code: 0x80004005 (NS_ERROR_FAILURE) 
                  [nsIObserverService.removeObserver]"  nsresult: "0x80004005 
                  (NS_ERROR_FAILURE)"  location: "JS frame :: 
                  chrome://mozapps/content/update/updates.xml :: onxbldestructor :: line 
                  20"  data: no]
                  
                  Fehler: uncaught exception: [Exception... "Component returned failure
                  code: 0x80004005 (NS_ERROR_FAILURE)
                  [nsIControllers.removeController]"  nsresult: "0x80004005 
                  (NS_ERROR_FAILURE)"  location: "JS frame ::
                  chrome://browser/content/search.xml :: onxbldestructor :: line 76"  data: 
                  no]
                  
                  Fehler: uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE)
                  [nsIObserverService.removeObserver]"  nsresult: "0x80004005 
                  (NS_ERROR_FAILURE)"  location: "JS frame ::
                  chrome://browser/content/browser.js :: Shutdown :: line 831"  data: no]
                  ich hoffe es kann mir wieder jemand weiter Helfen.
                  Zuletzt geändert von Mr.Programe; 16.06.2005, 10:27.
                  Wissen ist Macht
                  Power is nothing without control

                  Kommentar


                  • #10
                    Code:
                    window.open("about:blank", "categoryWindow").close();
                    vielleicht war der vorschlag, dieses konstrukt zu nutzen, doch nicht so optimal.

                    der firefox braucht einfach eine gewisse zeit, um das neu geöffnete fenster wirklich zu "erstellen". wenn man da jetzt sofort .close() drauf anwendet, ist die engine unter umständen noch gar nicht so weit, dass sie ein fensterobjekt zur verfügung stellen kann, welches man schließen könnte.


                    fenster erst öffnen, und mit window.setTimeout eine kleine verzögerung vor dem wieder schließen des fensters einzubauen, sollte idR. abhilfe schaffen.
                    I don't believe in rebirth. Actually, I never did in my whole lives.

                    Kommentar


                    • #11
                      Vielen Dank für die schnelle Antwort. Der Timeout ist die Lösung. Da mich aber die aufblitzenden Fenster gestört haben, hab ich das ganze mit PHP noch etwas verfeinert.

                      Code:
                      <?php if($catWin==true):?>
                         catWin=window.open("about:blank", "categoryWindow");
                         setTimeout("catWin.close()",100);
                       <?endif;?>
                       <?php if($calWin==true):?>   
                         calWin=window.open("about:blank", "calendarWindow");
                         setTimeout("calWin.close()",100);
                       <?php endif;?>
                      Die Variablen $catWin und $catWin über gebe ich von den Popups.

                      Nochmal vielen Dank.
                      Wissen ist Macht
                      Power is nothing without control

                      Kommentar


                      • #12
                        Mein Projekt ist ein gutes Stück weiter und nun bin ich wieder auf ein Problem gestoßen an dem ich hänge.

                        Ich habe immer noch die beiden (kleinen) Eingabefenster categoryWindow und calendarWindow. In meine Hauptfenster befinden sich ein Frameset mit den Frames left und taskWin.

                        Zusätzlich erstelle ich aber nun auch noch eine "copy" das Hauptfensters namens PrototypeWin (das eigentliche Hauptfenster ist unbenannt).

                        Rufe ich im PrototypeWin von taskWin calendarWindow auf werden die Werte über den Aufruf
                        Code:
                         self.opener.location="..."
                        einbandfrei an den Frame taskWin des Fensters PrototypeWin zurück gegeben.

                        Rufe ich aber im Fenster PrototypeWin von taskWin das categoryWindow auf werden die Werte von dem Formular
                        Code:
                        <form  action="task.php" name="form" target="self.opener">
                        an ein neues Fenster übergeben.

                        self.opener wird beim Öffnen das Fenster gesetzt. Wenn ich als target "taskWin" setze funktioniert es vom Hauptfenster aus, aber beim öffnen des categoryWindow von PrototypeWin aus werden die Werte dann auch zum Hauptfenster zurück gegeben.

                        Lasse ich mir per alert self.opener.parent.name geben erhalte ich richtig PrototypeWin bzw. nichts fürs Hauptfenster zurück, aber leider werden Ziele wie self.opener.parent.taskWin auch in ein neues Fenster geöffnent.

                        ich hoffe ihr könnt mir wieder so schnell und kompettent weiter helfen.
                        Wissen ist Macht
                        Power is nothing without control

                        Kommentar


                        • #13
                          self.opener ist kein gültiges target.
                          wieso nimmst du an, dass im target-attribut eines formular javascript ausgewertet würde?
                          da gehört ein einfacher string hinein, und sonst nichts.
                          wenn du den namen des zielfensters hast, dann setze das target des formulars dynamisch.
                          document.formularname.target = fenstername;
                          I don't believe in rebirth. Actually, I never did in my whole lives.

                          Kommentar


                          • #14
                            wieso nimmst du an, dass im target-attribut eines formular javascript ausgewertet würde?
                            hmm, warscheinlich war es Wunschdenken es wäre so schön einfach gewesen.

                            Wenn ich
                            Code:
                            document.form.target = self.opener.name;
                            benutze bin ich wieder bei target="taskWin", was bedeutet meine Daten werden wieder zu meinem taskWin im Hauptfenster geschickt und nicht zu taskWin in der Kopy des Hauptfenster (PrototypeWin).

                            Da ich bei HTML keine Möglichkeit sehe die Frames über ihre Parents zu identivizieren bleibt wohl nur die Möglichkeit die Beiden Fenster (mit javascript) unterschiedlich zu nennen, jenachdem ob sie im Hauptfenster sind oder im PrototypeWin. Dann hätte ich mit
                            self.opener.name;
                            einen eindeutigen Namen für das Ziel.
                            Wissen ist Macht
                            Power is nothing without control

                            Kommentar

                            Lädt...
                            X