david: selbstaufruf einer funktion mit timeout ?

Grüße,

ich möchte verhindern, das bei einer funktion in meinem cms von ungeduldigen mitarbeitern einfach mehrmals ein submit-button gedrückt wird.

also möchte ich den button über ein timeout temporär durch einen deaktivierten button ersetzen.

das ersetzen funktioniert einmal, doch nach dem timeout kommter nicht zurück, weil angeblich beide variablen (show und hide) nicht gesetzt wären.

Wo liegt mein Fehler?

function button_switch (show, hide, stop_reset)
      {
        document.getElementById(show).style.display = "";
 document.getElementById(hide).style.display = "none";
 if(stop_reset == 0) window.setTimeout("button_switch(hide, show, 1)", 1000);
      }

Vielen dank für die Mühe des lesens und vllt. antwortens.

mfg david

  1. Hi,

    Wo liegt mein Fehler?

    window.setTimeout läuft in einem eigenen Thread, also nicht im Scope Deiner Funktion. Die Variablen existieren tatsächlich nicht mehr, sofern Du sie nicht global deklariert hast.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. HM,

      window.setTimeout läuft in einem eigenen Thread, also nicht im Scope Deiner Funktion. Die Variablen existieren tatsächlich nicht mehr, sofern Du sie nicht global deklariert hast.

      Wenn ich nach selfhtml die variablen innerhalb der funktion nochmal global definiere, also nicht "var" vorsetze:

      function button_switch (show, hide, stop_reset)       {         document.getElementById(show).style.display = "";  document.getElementById(hide).style.display = "none";  if(stop_reset == 0) {    hide_reset = hide;    show_Reset = show;    this.setTimeout("button_switch(hide_reset, show_reset, 1)", 1000);  }       }

      dann gibt er mir genau den gleichen fehler wieder.

      david

      1. Hi,

        Wenn ich nach selfhtml die variablen innerhalb der funktion nochmal global definiere,

        deklariere, nicht definiere. Die Definition von Variablen kannst Du z.B. im Informatik-Duden nachlesen.

        also nicht "var" vorsetze:

        Das solltest Du nie tun - zu Recht geben viele Browser hierbei eine Warnung aus. Entweder hast Du die Variablen tatsächlich im globalen Scope mit var deklariert, oder Du suchst Dir einen anderen Weg. Da die betreffenden Variablen bei Dir augenscheinlich Strings enthalten, fällt mir hierzu ein sehr leichter ein.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Nochma ich...

          Das solltest Du nie tun - zu Recht geben viele Browser hierbei eine Warnung aus. Entweder hast Du die Variablen tatsächlich im globalen Scope mit var deklariert, oder Du suchst Dir einen anderen Weg. Da die betreffenden Variablen bei Dir augenscheinlich Strings enthalten, fällt mir hierzu ein sehr leichter ein.

          und der wäre?

          1. Hi,

            Da die betreffenden Variablen bei Dir augenscheinlich Strings enthalten, fällt mir hierzu ein sehr leichter ein.
            und der wäre?

            übergib den String, nicht die Variable.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. Hi,

              übergib den String, nicht die Variable.

              und wie soll das dann aussehen?

              Ich hab es versucht per "+ bla +" zusammenzuhängen, aber da gibts auch fehler.

              Bitte zeig es mir als beispiel mit meinem quelltext.

              danke, david

              1. hi,

                Ich hab es versucht per "+ bla +" zusammenzuhängen, aber da gibts auch fehler.

                *seufz*
                </faq/#Q-07b>, </faq/#Q-07c>

                Bitte zeig es mir als beispiel mit meinem quelltext.

                nein, bitte zeig du uns deinen.

                gruß,
                wahsaga

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

                  *seufz*
                  </faq/#Q-07b>, </faq/#Q-07c>

                  Bitte zeig es mir als beispiel mit meinem quelltext.

                  nein, bitte zeig du uns deinen.

                  Ich habe ihn im ersten post angegeben.

                  Da, bitte, nochmal:

                  function button_switch (show, hide, stop_reset)
                    {
                      document.getElementById(show).style.display = "";
                      document.getElementById(hide).style.display = "none";
                      if(stop_reset == 0) window.setTimeout("button_switch(***hide***, ***show***, 1)", 1000);
                    }

                  Das Problem liegt bei "***"
                  Wie übergebei ich denn da direkt den String?

                  1. Tag david.

                    window.setTimeout("button_switch(***hide***, ***show***, 1)", 1000)
                    Das Problem liegt bei "***"
                    Wie übergebei ich denn da direkt den String?

                    Indem du andere Anführungszeichen verwendest. Also entweder "funktion('meinString')" oder 'funktion("meinString")'. Wo das allerdings in Selfhtml steht, konnte ich nicht herausfinden.

                    Siechfred

                  2. function button_switch (show, hide, stop_reset)
                      {
                        document.getElementById(show).style.display = "";
                        document.getElementById(hide).style.display = "none";
                        if(stop_reset == 0) window.setTimeout("button_switch(***hide***, ***show***, 1)", 1000);
                      }

                    Das Problem liegt bei "***"
                    Wie übergebei ich denn da direkt den String?

                    Du musst dir klar machen, wie der erste Parameter von setTimout bei dir aussieht du willst erreichen das dort steht (angenommen show = 'id1' hide = 'id2'):

                    window.setTimeout("button_switch('id1', 'id2')", 1000);

                    Jetzt muss du nur den String ensprechend zusammenfügen

                    Struppi.

                  3. hi,

                    Ich habe ihn im ersten post angegeben.

                    Da, bitte, nochmal:

                    Den meinte ich natürlich nicht, sondern den zu deiner Aussage

                    Ich hab es versucht per "+ bla +" zusammenzuhängen, aber da gibts auch fehler

                    gehörenden.

                    gruß,
                    wahsaga

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

    function button_switch (show, hide, stop_reset)
          {
            document.getElementById(show).style.display = "";
    document.getElementById(hide).style.display = "none";
    if(stop_reset == 0) window.setTimeout("button_switch(hide, show, 1)", 1000);
          }

    Es wundert mich, dass es noch nicht genannt wurde:
    Seit JavaScript 1.2 kann der erste Parameter von setTimeout ein Funktionsobjekt sein. In der Funktion button_switch() kann man also eine Funktion notieren, die man dann setTimeout() übergibt.
    Der Clou ist, dass beim Notieren einer neuen Funktion alle Variablen des gegenwärtigen Scopes (Variablen-Geltungsbereichs) auch im Scope der neuen Funktion zur Verfügung stehen (hatten wir erst letztens, </archiv/2005/8/t113836/#m723740> ff.).

    function button_switch (show, hide, stop_reset) {  
        document.getElementById(show).style.display = "inline";  
        document.getElementById(hide).style.display = "none";  
        function containerfunktion () {  
            button_switch(hide, show, 1);  
        }  
        if (stop_reset == 0)  
            window.setTimeout(containerfunktion, 1000);  
        }  
    }
    

    containerfunktion() hat also Zugriff auf hide, show sowie stop_reset und kann damit button_switch() erneut aufrufen. So kann man sich den Umstand des Einbettens der Variablenwerte in einen String sparen. Bei zwei einfachen String-Parametern ist das zwar nicht sonderlich schwer, aber bei mehreren, komplexeren Objekten wird es unschön bis unmöglich.
    (Das Ganze kann man auch anders und kürzer notieren, ja.)

    Mathias