piet: aus einer setIntervall Funktion dynamisch andere Funktionen star

Hallo,

ich habe in meiner Lib eine Funktion (blinker) die von setIntervall alle 500ms aufgerufen wird. In dieser Funktion "blinker" wird immer ein global definiertes Bit(Var) negiert.

1 -> 0 -> 1 usw.

Nun möchte ich andere Funktionen (z.B. Hintergrund wechsle rot/grün) von dieser Funktion "blinker" aufrufen, jedoch nicht das ich die Funktion "blinker" verändere (Aufruf des Funktionsnames in der Funktion blinker) sondern irgenwie meine Funktion "changeBackground(fc,bc)" dynamisch an das event "setIntervall" oder an den Aufruf "blinker" binde.

Wie und ob sowas überhaupt geht.... keine Ahnung.
Ich möchte einfach auf meinen Webseiten Funktionen aufrufen, die automatisch von der "lib" Funktion "blinker" aufgerufen werden.

Ich hoffe es ist einigermaßen klar erklärt.

Gruß
       piet

  1. Hallo,

    ich habe in meiner Lib eine Funktion (blinker) die von setIntervall alle 500ms aufgerufen wird.

    Mach aus dieser Funktion ein Objekt, erstelle von diesem Objekt eine Instanz und ruf dann alle 500ms eine entsprechende Methode dieser Instanz auf, die als Inhalt den bisherigen Code einer blinker-Funktion hat.

    Das würde erstmal syntaktisch nichts ändern. Aber...

    Nun möchte ich andere Funktionen (z.B. Hintergrund wechsle rot/grün) von dieser Funktion "blinker" aufrufen, jedoch nicht das ich die Funktion "blinker" verändere (Aufruf des Funktionsnames in der Funktion blinker) sondern irgenwie meine Funktion "changeBackground(fc,bc)" dynamisch an das event "setIntervall" oder an den Aufruf "blinker" binde.

    ...du kannst nun folgendes tun: du lässt dein blinker-Objekt zusätzlich noch ein Array speichern und gibst dem blinker-Objekt eine Methode, mit der sich ein anderes Objekt in diesem Array speichern kann ("registrierung").

    Und dann modifizierst du deine blinkermethode so, dass sie bei jedem Aufruf das Array durchgeht und von jedem im Array gespeicherten Objekt eine entsprechende Methode aufruft. Diese Methode (die immer gleich lautet) musst du natürlich in deinen anderen Objekten entsprechend implementierung und dort dafür sorgen, dass dann die gewünschte Funktionalität ausgeführt wird.

    Siehe: http://de.wikipedia.org/wiki/Besuchermuster

    Wie und ob sowas überhaupt geht.... keine Ahnung.

    Falls du nicht objektorientiert programmierst, wirst du dies allerdings zunächst lernen müssen. Aber glaub mir, das lohnt sich durchaus.

    Ich möchte einfach auf meinen Webseiten Funktionen aufrufen, die automatisch von der "lib" Funktion "blinker" aufgerufen werden.

    Genau das kannst du dann tun. Und du kannst neue Funktionen hinzufügen, ohne jemals irgendetwas am "blinker" zu ändern.

    Ich hoffe es ist einigermaßen klar erklärt.

    Ich hoffe meins auch. ;)

    1. Hallo,

      Ich hoffe meins auch. ;)

      ??????? up's :-)

      Das war ein bißchen viel.

      Falls du nicht objektorientiert programmierst, wirst du dies allerdings zunächst lernen müssen. Aber glaub mir, das lohnt sich durchaus.

      das sehe ich genau so.

      Ich sage es nun mal mit meinen Worten.

      In meiner lib starte ich beim Aufruf meine Funktion "blinker" mit "setInterval".
      In dieser Funktion "blinker" frage ich ein Array über eine Schleife ab in dem ich meine funktion "changeBackground" "registriere" (entweder Code oder einfach das Array beim Webseitenaufruf per Liste definieren).
      Somit werden alle Funktionen in diesem Array alle 500ms abgefragt.

      Natürlich muss ich beim verlassen der jeweiligen Webseite auch wieder meine Funktion "changeBackground" aus dem Array löschen, da ja die lib (mit der Funktion "blinker") eventuell auch bei anderen Webseiten benutzt wird.
      Dies könnte ich auch automatisieren, in dem ich beim abfragen des Array alle "nicht aufrufbaren" Funktionen sofort lösche (natürlich bei einem Fehler such ich mich schwarz).
      Oder ist es so, das beim Wechsel der Webseite, mit gleicher lib, jeweils eine neue Instanz der lib gestarte wird... dann müsste ich das Array nicht löschen/ändern ??

      Das denke ich, übersteigt etwas meine Fähigkeiten... hat jemand schon mal so etwas gemacht und ein paar Codezeilen parat ??

      Danke
                    piet

      1. Hallo,

        Ich hoffe meins auch. ;)

        ??????? up's :-)

        Das war ein bißchen viel.
        (...)
        Das denke ich, übersteigt etwas meine Fähigkeiten... hat jemand schon mal so etwas gemacht und ein paar Codezeilen parat ??

        Du musst erstmal OOP lernen. Sonst wird das nix. Dazu musst du aufhören in Funktionen zu denken, sondern in Objekten zu denken. Such dir dazu am besten ein entsprechendes Tutorial, wo man allgemein Objektorientiertes Denken lernt. Danach dann ein spezielles Tutorial für Javascript, weil Javascript in dieser Hinsicht ein wenig... verwirrend sein kann.

        1. Hallo,

          ich bin dabei, immerhin schon 0,1%, zu verstehen. Anbei das was ich schon habe.

          in meiner lib

          function Pblink()  
          {  
            this.blinkbit=0;  
            this.functionlist = new Array();  
            this.func = function()  
          			{  
          				if (this.blinkbit==0)  
          				{this.blinkbit=1;}  
          				else  
          				{this.blinkbit=0;}  
            
          				for (var i=0; i < this.functionlist.length; i++)  
          				{  
          					eval(this.functionlist[i]);  
          				}  
          			}  
          }  
          function txtblink(id,freigabebit,bgcolor0,bgcolor1,blinkerbit)  
          {  
          .....  
          }  
          
          

          Der Aufruf auf meiner Webseite

            
          <script language="JavaScript">  
            
          var blink_500ms = new Pblink;  
          setInterval("blink_500ms.func()",500);  
            
          //#######################################################################  
          function init_blink()  
          {  
          blink_500ms.functionlist.push("txtblink('m1_laeuft',1,'red','green',blink_500ms.blinkbit)");  
          }  
          
          

          Die Funktion "init_blink()" wird von "onload" aufgerufen.
          Bin ich hier auf dem richtigen Weg ?
          Und... "eval" gefällt mir nicht.... kann ich das anders lösen, oder hätte jemand sowieso anders gedacht ?

          Gruß
                 piet

          1. Hallo,

            ich bin dabei, immerhin schon 0,1%, zu verstehen. Anbei das was ich schon habe.

            in meiner lib

            function Pblink()

            {
              this.blinkbit=0;
              this.functionlist = new Array();
              this.func = function()
              {
            if (this.blinkbit==0)
            {this.blinkbit=1;}
            else
            {this.blinkbit=0;}

              for (var i=0; i < this.functionlist.length; i++)  
              {  
              	eval(this.functionlist[i]);  
              }  
            

            }
            }

            Das ist doch soweit bis auf das eval schonmal ganz gut!
            In deiner functionlist stehen ja dann momentan Strings wie "funktion(x,y)". Das ist natürlich schlecht.
            In der "functionlist" (eigentlich ist der Name etwas unpassend) solltest du Referenzen auf Objekte speichern.

            Nehmen wir mal an, du hast ein Objekt Auto

            [code lang=javascript]
            function Auto()
            {
               this.blinkaktion = function()
               {
                  this.hupen();
               }

            this.hupen = function()
               {
                   alert("tuuuut!");
               }
            }

              
            Dieses \_muss\_ die Methode blinkaktion implementieren.  
            Wenn du nun möchtest, dass das Auto alle 500ms durch den Blinker zum Hupen gebracht wird (oder was auch immer du willst), musst du nur dafür sorgen, dass der Blinker vom Auto die Methode blinkaktion aufruft.  
            Dafür muss natürlich der Blinker das Auto in seiner Liste (bei dir functionlist genannt) speichern.  
            Also musst du das Auto in diese Liste speichern (oder das Auto muss sich selsbt darin speichern).  
            Am besten brauchst du also im Blinker eine Methode speichereObjekt(objekt), welches das Objekt (also z.B. ein Auto) in die Liste einträgt.  
              
            Dann sieht der Code so aus: meinPlink.speichereObjekt(meinAuto);  
            Ab meinPlink (was eine Instanz von deiner Plink Klasse ist) speichert also das Auto in der Liste. Ab diesem Zeitpunkt wird alle 500ms von jedem Objekt in der Liste nicht das "eval" durchgeführt wie du es jetzt hast, sondern es wird von jedem Objekt die Funktion blinkaktion() aufgerufen. Das bedeutet natürlich, dass jedes Objekt in dieser Liste auch so eine Methode haben muss, sonst gibts ne Fehlermeldung.  
              
            Der Vorteil ist jetzt, dass du z.B. auch bei deiner Hund-Klasse (oder was auch immer) eine Methode "blinkaktion()" implementieren kannst und dann ganz viele Hunde in der Liste speichern kannst.  
            Und natürlich solltest du auch eine Methode zum Löschen aus der Liste schreiben.  
            Dadurch brauchst du kein eval mehr, denn eval ist evil.
            
            1. Morgen,

              Das ist doch soweit bis auf das eval schonmal ganz gut!

              geht runter wie Öl :-)

              Ich muss aber alle Funktionen die ich in die "functionlist" eintrage mit Parameter übergeben, und jedes Programm (Funktion) kann andere, sowie unterschiedlich viele Parameter haben.

              So wie es aussieht, denke ich, brauche ich nur eine saubere Alternative zu "eval".
              Wie ich den Code noch optimieren kann... wird die Zeit zeigen.

              function init_blink()
              {
              blink_500ms.functionlist.push("txtblink('m1_laeuft',1,'red','green',blink_500ms.blinkbit)");

              »»}

              Eine Sache noch, ich muss dem Programm beim Eintrag, das "blinkbit" (blink_500ms.blinkbit) mitgeben. Kann ich das anders lösen.... normalerweise nicht weil ich nicht weiß welche neue Instanz von "Pblink" erzeugt wurde.

              Was mir an deiner Idee sehr gut gefällt, ich kann auch verschiedene Instanzen mit unterschiedlichen Zeiten erstellen, z.B. 450ms,500ms,550ms somit blinkt auf der Webseite nicht alles im selben Rythmus.

              Danke
                    piet

              1. Morgen,

                Das ist doch soweit bis auf das eval schonmal ganz gut!

                geht runter wie Öl :-)

                Ich muss aber alle Funktionen die ich in die "functionlist" eintrage mit Parameter übergeben, und jedes Programm (Funktion) kann andere, sowie unterschiedlich viele Parameter haben.

                Das macht nichts. Du implementierst in jedem Objekt (es dürfen natürlich keine einzelnen Funktionen sein, sondern Objekte) die Methode "blinkaktion" (oder wie auch immer du sie nennst). Und diese Methode kann dann ja in jedem Objekt wiederum eine andere Funktion aufrufen, die dann auch Parameter übergeben bekommt.

                So wie es aussieht, denke ich, brauche ich nur eine saubere Alternative zu "eval".
                Wie ich den Code noch optimieren kann... wird die Zeit zeigen.

                function init_blink()
                {
                blink_500ms.functionlist.push("txtblink('m1_laeuft',1,'red','green',blink_500ms.blinkbit)");
                »»}

                Eine Sache noch, ich muss dem Programm beim Eintrag, das "blinkbit" (blink_500ms.blinkbit) mitgeben. Kann ich das anders lösen.... normalerweise nicht weil ich nicht weiß welche neue Instanz von "Pblink" erzeugt wurde.

                Sorry das verstehe ich nicht. Wieso musst du dem Programm das blinkbit mitgeben, bzw. warum kannst du dir nicht merken, welche Instanz du erzeugt hast? Wieso brauchst du überhaupt mehrere Instanzen?

              2. Was mir an deiner Idee sehr gut gefällt, ich kann auch verschiedene Instanzen mit unterschiedlichen Zeiten erstellen, z.B. 450ms,500ms,550ms somit blinkt auf der Webseite nicht alles im selben Rythmus.

                Wow, cool!
                Endlich mal eine richtig blinkende Website.
                Bin schon ganz gaga nur vom Lesen und der Vostellung, wie das dann ungefähr aussieht...

                SNCR, Don P