Ratfish: Hilfe - Meine Variable ist gefangen

Hallo zusammen,

ich fange gerade erst an mich mich JavaScript zu beschäftigen und schon wurde meine erste Variable gefangengenommen ;-)

ich möchte einen String, der von einem CMS-Plugin generiert wird, benutzen um eine if-Anweisung zu füttern. Die einzige Möglichkeit, die ich gefunden habe um den String auszulesen, ist ein iframe.

<?php  
	$iframe .= "<iframe id=\"upload_target\" name=\"upload_target\" src=\"/index.php?usw.\" style=\"border:0px solid #fff;\" onload=\"getIFrame()\"></iframe>";  
?>

Im iframe rufe ich die Funktion getIFrame() auf:

<script  type="text/javascript">  
	function getIFrame() {	  
		var IFrame = frames["upload_target"];  
		var IFrameHTML = IFrame.document.body.innerHTML;  
		//alert(IFrameHTML); //gibt den String aus  
		var msgAnfang = IFrameHTML.indexOf("msg");  
		msgAnfang = msgAnfang + 6;  
		//alert(msgAnfang);  
		var msgEnde = IFrameHTML.indexOf("mclass");  
		msgEnde = msgEnde - 3;  
		//alert(msgEnde);  
		  
		msgAusgabe = IFrameHTML.substring(msgAnfang, msgEnde);  
		alert("innerhalb der Funktion: " + msgAusgabe); //gibt den interessanten Teil des Stings aus  
	}

Jetzt führe ich den php-code von oben aus:

~~~html

var iframe = '<?php echo $iframe; ?>';
document.write(iframe);

	  
So weit so gut. Ich bekomme ein Pop-Up mit dem erwarteten Ergebnis  
  
Jetzt möchte ich aber auch außerhalb der Funktion auf "msgAusgabe" zugreifen  
  
	`alert ("außerhalb der Funktion" + msgAusgabe);`{:.language-html}  
	  
	bzw.  
	  
	~~~html
if (msgAusgabe == "meinString") {  
		document.write(mehrHTML)  
	}

Ich habe gelesen, dass variblen die ohne "var" definiert wurden auch außerhalb von Funktionen verfügbar sind aber ich kann nicht darauf zugreifen. Warum?

  1. Lieber Ratfish,

    eine Variable ohne "var" zu definieren ist dasselbe, wie wenn man window eine neue Eigenschaft mit diesem Namen gibt. Vergleiche:

    function meins () {  
        var _lokal = true;  
        _global = true;  
    }  
      
    meins();  
    alert("Lokal? '" + _lokal + "'");  
    alert("Global? '" + _global + "'");  
    alert("window._global? '" + window._global + "'");
    

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hallo Felix,

      vielen Dank für Deine Antwort. Ich glaube ich stehe noch immer auf dem Schlauch.

      -----------------------------
      »»function meins () {

      var _lokal = true;
          _global = true;
      }

      ...
      -----------------------------

      alert("Lokal? '" + _lokal + "'");

      funktioniert nicht, weil _lokal mit "var" definiert wurde - klar.

      alert("Global? '" + _global + "'");

      funktioniert, weil _global auch außerhalb der function zur Verfügung steht - klar.

      alert("window._global? '" + window._global + "'");

      funktioniert auch, aus dem selben Grund wie oben, oder?

      Ich habe dann mal noch folgendes probiert:
      alert("window._lokal? '" + window._lokal + "'");
      das funktioniert nicht, trotz "window."

      In meinem Problem habe ich die Variable "msgAusgabe" ohne "var" definiert, also müsste sie außerhalb der function zur Verfügung stehen, oder? Tut sie aber nicht.

      Wo ist mein Denkfehler?

      1. Lieber Ratfish,

        alert("Global? '" + _global + "'");
        funktioniert, weil _global auch außerhalb der function zur Verfügung steht - klar.

        alert("window._global? '" + window._global + "'");
        funktioniert auch, aus dem selben Grund wie oben, oder?

        window._global ist dasselbe(!) wie window._global und "funktioniert" deshalb immer.

        Ich habe dann mal noch folgendes probiert:
        alert("window._lokal? '" + window._lokal + "'");
        das funktioniert nicht, trotz "window."

        Eine lokale Variable ist eben nicht an das window-Objekt gekoppelt und kann daher auch nicht über window._lokal "erreicht" werden.

        In meinem Problem habe ich die Variable "msgAusgabe" ohne "var" definiert, also müsste sie außerhalb der function zur Verfügung stehen, oder?

        Ja.

        Tut sie aber nicht.

        Dann kann es an einem Timingproblem liegen. Das soll heißen, Du fragst das Vorhandensein dieser Variable ab, bevor sie definiert wurde.

        Wo ist mein Denkfehler?

        Wahrscheinlich darin, dass Du die Funktion, welche diese globale Variable überhaupt erst definiert, erst dann aufrufst, wenn Du das Vorhandensein der globalen Variable bereits erfolglos erwartet hast.

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. window._global ist dasselbe(!) wie window._global

          Logisch... ich meinte natürlich "window._global" ist dasselbe(!) wie _global".

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
          1. Hallo Felix,

            korrigiere mich, wenn ich mich irre, aber Du meintest wahrscheinlich nicht:
            "window._global" ist dasselbe(!) wie _global".
            sondern
            "window._lokal" ist dasselbe(!) wie _global".

            Das löst aber mein Problem nicht. Ich habe die Variable ja global definiert, kann aber trotzdem nicht darauf zugreifen. Ich vermute, weil der String aus dem iFrame ausgelesen wird.

            1. Hi,

              korrigiere mich, wenn ich mich irre,

              Fühle dich korrigiert:

              aber Du meintest wahrscheinlich nicht:
              "window._global" ist dasselbe(!) wie _global".
              sondern
              "window._lokal" ist dasselbe(!) wie _global".

              Nein, eben ganz genau nicht.

              Eine global angelegte Element ist eine Eigenschaft des window-Objektes - also ist _global === window._global

              window._lokal gibt es aber *nicht* - *weil* _lokal nicht als globale Variable Eigenschaft angelegt wurde, und damit auch nicht als Eigenschaft von window. Sondern als Eigenschaft des Objektes (also der Funktion) innerhalb desessn es durch voransetzen des dort eben genau so wirkenden Keywords var als lokal deklariert wurde.

              Das löst aber mein Problem nicht.

              So lange du es nicht verstehst, nicht.

              MfG ChrisB

              --
              “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
              1. Hi,

                Eine global angelegte Element ist eine Eigenschaft des window-Objektes - also ist _global === window._global

                Das sollte „eine globale angelegte Variable ...“ heissen.

                MfG ChrisB

                --
                “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
                1. O.K. Ich bin einen Schritt weitergekommen und ich glaub's jetzt ;-)
                          _global = window._global

                  In meinem Beispiel habe ich "msgAusgabe" ohne "var" definiert. Also:
                          msgAusgabe = window.msgAusgabe

                  Damit müsste "msgAusgabe" außerhalb der function mit
                         "alert(window.msgAusgabe);"
                  aufrufbar sein, oder nicht?

                  Im Gegesatz zu meinem ersten Versuch bekomme ich damit immerhin ein alert-Pop-Up, allerdings mit der Meldung "undefined".

                  @Struppi

                  Sorry, ich habe Dein Posting einfach übersehen. Ich weiß nicht so genau wie ich mein Problem näher beschreiben soll. In welche Richtung geht denn Deine Vermutung? Welche Info brauchst Du?

                  Tut mir leid, aber ich bin wie gesagt Neuling in JavaScript und mir fehlt ganz eindeutig der Blick für's Große Ganze :-(

                  1. Tut mir leid, aber ich bin wie gesagt Neuling in JavaScript und mir fehlt ganz eindeutig der Blick für's Große Ganze :-(

                    Das du auf einen wert zugreifen willst, der noch nicht existiert. Und deshalb undefined ist. Wie gesagt, es wäre sinnvoller du würdest dein Problem konkreter beschreiben, weil dein Problem nicht an dem liegt was du vermutest.

                    Struppi.

                    1. Hallo Struppi,

                      na dann hol' ich mal ein bisschen weiter aus.
                      Ich benutze ein Plugin (VirtueUpload) in einem CMS (Joomla), mit dem ich über ein Formular Dateien auf meine Seite hochladen kann. Ich habe es nicht geschafft aus dem Plugin selbst irgendwelche Variablen auszulesen, aber das Plugin gibt eine Meldung aus und schreibt in einen anderen Teil der Seite - offensichtlich per iframe - eine Upload-ID.
                      Ich kenne die URL des iframes und kann den iframe in php auch ausgeben.

                      <?php
                              $iframe .= "<iframe id="upload_target"    [...]   onload="getIFrame()"></iframe>";
                      ?>

                      das php/html lade ich mit

                      var iframe = '<?php echo $iframe; ?>';
                              document.write(iframe);

                      dadurch wird die fuction getIFrame() aufgerufen

                      function getIFrame() {
                      var IFrame = frames["upload_target"];
                      [...]
                      msgAusgabe = [Teil des Strings in] IFrame;
                      alert("innerhalb der Funktion: " + msgAusgabe);
                      }

                      Bis hier ist alles klar, der String wird im iframe-Fenster angezeigt, msg_Ausgabe wird korrekt im alert-Pop-Up ausgegeben. Also scheint die Variable msgAusgabe einen Wert zu haben. Wenn ich allerdings

                      alert(window.msgAusgabe);

                      außerhalb der function schreibe, ist die Variable undifined.

                      1. außerhalb der function schreibe, ist die Variable undifined.

                        Das ist doch völlig logisch, du rfst die Funktion im onload Event auf und erst dann wird der Wert der Variabel gesetzt, vorher ist sie undefiniert.

                        Was hast du erwartetet?

                        Struppi.

                        1. Lieber Struppi,

                          Das ist doch völlig logisch, du rfst die Funktion im onload Event auf und erst dann wird der Wert der Variabel gesetzt, vorher ist sie undefiniert.

                          das hatte ich ja auch schon vermutet:

                          Wo ist mein Denkfehler?

                          Wahrscheinlich darin, dass Du die Funktion, welche diese globale Variable überhaupt erst definiert, erst dann aufrufst, wenn Du das Vorhandensein der globalen Variable bereits erfolglos erwartet hast.

                          Liebe Grüße,

                          Felix Riesterer.

                          --
                          ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. Ich habe gelesen, dass variblen die ohne "var" definiert wurden auch außerhalb von Funktionen verfügbar sind aber ich kann nicht darauf zugreifen. Warum?

    Weil sie lokal sind.
    Könntest du dein Problem genauer beschreiben, weil ich vermute es geht gar nicht (nur) um lokal oder global.

    Struppi.