Christian: Problem mit dynamischen Events

Hallo,

habe folgendes Problem, ich lasse mir mit Javascript dynamisch ne Navi aufbauen, das klappt auch alles soweit bestens im Firefox. Das Problem hierbei war jedoch, dass der IE nicht setAttribut kennt. Daher hab ich alles soweit auf IE tauglichkeit umgebaut. Jetzt bleibt noch ein letztes Problem:

Im Firefox konnte ich dynamisch die Ereignisse wie "onmouseover" über setAttribute adden. Im IE hab ich dies zwar über folgende Methode probiert, hierbei ist jedoch das Problem, dass ich innerhalb meiner Schleife nicht dynamisch Events hinzufügen kann, dass heist ich müsste in diese Funktion eigentlich etwas mit übergeben, ist dies möglich?
      newMenueMain.onmouseover = function()
{
     nurmalso(selectedDiv);
}

Vielen Dank
Christian

  1. habe folgendes Problem, ich lasse mir mit Javascript dynamisch ne Navi aufbauen, das klappt auch alles soweit bestens im Firefox. Das Problem hierbei war jedoch, dass der IE nicht setAttribut kennt. Daher hab ich alles soweit auf IE tauglichkeit umgebaut. Jetzt bleibt noch ein letztes Problem:

    setAttribute ist auch eine relativ überflüssige Funktion, es sei denn du benutzt selbstdefinierte Eigenschaften in Elementen, ansonsten funktioniert immer und überall objekt['eigenschaft'] = wert

    newMenueMain.onmouseover = function()
    {
         nurmalso(selectedDiv);
    }

    die Methode geht auch im Firefox, nur hat der FF ein anderes Event modell als der IE

    newMenueMain.onmouseover = function(e)
    {
          if(!e) e= window.event;
          nurmalso(selectedDiv);
    }

    Die Frage ist, was selectedDiv ist.

    Struppi.

    --
    Javascript ist toll (Perl auch!)
  2. Hallo,

    Im IE hab ich dies zwar über folgende Methode probiert, hierbei ist jedoch das Problem, dass ich innerhalb meiner Schleife nicht dynamisch Events hinzufügen kann, dass heist ich müsste in diese Funktion eigentlich etwas mit übergeben, ist dies möglich?
          newMenueMain.onmouseover = function()
    {
         nurmalso(selectedDiv);
    }

    Bis auf http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#eval@title=eval() fällt mir hier beim besten Willen nichts ein. Die Notlösung sieht also so aus:

    newMenueMain.onmouseover = eval("function(){  
     nurmalso(" + beliebige_variable + ");  
    }");
    

    Das müsste dann auch im IE funktionieren.

    mfg. Daniel

    1. Bis auf http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#eval@title=eval() fällt mir hier beim besten Willen nichts ein. Die Notlösung sieht also so aus:

      newMenueMain.onmouseover = eval("function(){

      nurmalso(" + beliebige_variable + ");
      }");

      
      >   
      > Das müsste dann auch im IE funktionieren.  
        
      Wozu das?  
        
      Struppi.
      
      -- 
      [Javascript ist toll](http://javascript.jstruebig.de/) (Perl auch!)
      
      1. Hallo,

        Bis auf http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#eval@title=eval() fällt mir hier beim besten Willen nichts ein. Die Notlösung sieht also so aus:

        newMenueMain.onmouseover = eval("function(){

        nurmalso(" + beliebige_variable + ");
        }");

        
        > >   
        > > Das müsste dann auch im IE funktionieren.  
        >   
        > Wozu das?  
          
        Stimmt eigentlich. Wozu muss es im IE funktionieren? ;-)  
          
        Ne stimmt, du hast Recht. Aber woher willst du wissen, das Christian mit event-Handling <http://de.selfhtml.org/dhtml/modelle/anzeige/domevents.htm@title=sowas> meint. Oder geht deine Methode auch in normalen Schleifen.  
          
        Ich hatte selbst vor kurzen das gleiche Problem. Da die Seite aber nur für mich war, hatte ich mich für setAttribute() entschieden.  
          
        mfg. Daniel
        
        -- 
        [Experten raten von der Verwendung des Internet Explorers ab!](http://web.oesterchat.com/internet-explorer/)  
        [Mein SELF-stylesheet](http://danielrichter.da.funpic.de/SELFForumsCSS.html) | [Darum Firefox!](http://www.firefox-love.de/)  
        [Selfcode](http://forum.de.selfhtml.org/cgi-bin/selfcode.pl): [ie:{ fl:( br:> va:) ls:& fo:) rl:( n4:# ss:| de:> js:) mo:} zu:}](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%28+br%3A%3E+va%3A%29+ls%3A%26+fo%3A%29+rl%3A%28+n4%3A%23+ss%3A%7C+de%3A%3E+js%3A%29+mo%3A%7D+zu%3A%7D)
        
        1. Hallo,

          Bis auf http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#eval@title=eval() fällt mir hier beim besten Willen nichts ein. Die Notlösung sieht also so aus:

          newMenueMain.onmouseover = eval("function(){

          nurmalso(" + beliebige_variable + ");
          }");

          
          > > >   
          > > > Das müsste dann auch im IE funktionieren.  
          > >   
          > > Wozu das?  
          >   
          > Stimmt eigentlich. Wozu muss es im IE funktionieren? ;-)  
            
          Wieso, dass funktioniert in allen Browsern:  
          ~~~javascript
            
          newMenueMain.onmouseover = function(e)  
          {  
           nurmalso( beliebige_variable );  
          }  
          );  
          
          

          nur musst du evtl. die beliebige_variable kopieren.

          Ne stimmt, du hast Recht. Aber woher willst du wissen, das Christian mit event-Handling http://de.selfhtml.org/dhtml/modelle/anzeige/domevents.htm@title=sowas meint. Oder geht deine Methode auch in normalen Schleifen.

          ja.

          Ich hatte selbst vor kurzen das gleiche Problem. Da die Seite aber nur für mich war, hatte ich mich für setAttribute() entschieden.

          wie gesagt ich halte die Funktion nur für notwendig wenn du auf selbdefinierte Attribute zugreifen musst.

          Struppi.

          --
          Javascript ist toll (Perl auch!)
          1. hi,

            Ich hatte selbst vor kurzen das gleiche Problem. Da die Seite aber nur für mich war, hatte ich mich für setAttribute() entschieden.

            wie gesagt ich halte die Funktion nur für notwendig wenn du auf selbdefinierte Attribute zugreifen musst.

            Auch da sehe ich nicht, wo ich die brauchen sollte.

            Wenn es sich um ein Javascript-Objekt, welches einen DOM-Node repräsentiert handelt, kann ich mit objekt.attributName doch auf selbstdefinierte Attribute genauso zugreifen, wie auf "per Default" vorhandene.
            Mir ist noch kein Fall untergekommen, wo das nicht gegangen wäre - hast du ein konkretes Beispiel, wo das in irgendeinem Browser definitiv "nicht funzt"?

            Oder beziehst du dich auf einen OO-Kontext mit nicht "öffentlichen" Attributen (public)?

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. wie gesagt ich halte die Funktion nur für notwendig wenn du auf selbdefinierte Attribute zugreifen musst.

              Auch da sehe ich nicht, wo ich die brauchen sollte.

              Wenn es sich um ein Javascript-Objekt, welches einen DOM-Node repräsentiert handelt, kann ich mit objekt.attributName doch auf selbstdefinierte Attribute genauso zugreifen, wie auf "per Default" vorhandene.
              Mir ist noch kein Fall untergekommen, wo das nicht gegangen wäre - hast du ein konkretes Beispiel, wo das in irgendeinem Browser definitiv "nicht funzt"?

              <div meineVar=1>
              meineVar läßt sich nicht in jedem Browser auslesen (soweit ich das in Erinnerung habe)

              Struppi.

              --
              Javascript ist toll (Perl auch!)
              1. Hallo Struppi und wahsaga,

                ich habe noch nie mit setAttribut() gearbeitet. Ich setze sowohl vorgegebene als auch selbstdefinierte Attribute so:

                  
                t=document.getElement...  
                  
                   t.nr=i;  
                   t.style.cursor="pointer";  
                   t.thisObj = this;  
                   t.onclick = function() { this.thisObj.sort(this.nr); }  
                   t.title='Die Tabelle nach "'+t.firstChild.data+'" sortieren.';  
                
                

                Gruß, Jürgen

                1. ich habe noch nie mit setAttribut() gearbeitet. Ich setze sowohl vorgegebene als auch selbstdefinierte Attribute so:

                  Hallo?
                  selbstdefiniert in einem Tag.

                  Struppi.

                  --
                  Javascript ist toll (Perl auch!)
                  1. Hallo Struppi,

                    Hallo?
                    selbstdefiniert in einem Tag.

                    ja. Das "t" in meinem Beispiel zeigt auf ein <td>.

                    Gruß, Jürgen

                    1. selbstdefiniert in einem Tag.

                      ja. Das "t" in meinem Beispiel zeigt auf ein <td>.

                      Es ist ein JS Objekt, dem kannst du Attribute zufügen wie du lustig bist, das weiß ich, aber wenn du <td meinAttribut=1> in den Quelltext schreibst, kommst du nur an meinAttribut über getAttribute().
                      OK?

                      zugegeben es ist dann nicht mehr valide

                      Struppi.

                      --
                      Javascript ist toll (Perl auch!)
              2. hi,

                <div meineVar=1>
                meineVar läßt sich nicht in jedem Browser auslesen (soweit ich das in Erinnerung habe)

                Gut, auf korrektes HTML wollte ich die Frage natürlich schon bezogen wissen :-)

                gruß,
                wahsaga

                --
                /voodoo.css:
                #GeorgeWBush { position:absolute; bottom:-6ft; }
                1. <div meineVar=1>
                  meineVar läßt sich nicht in jedem Browser auslesen (soweit ich das in Erinnerung habe)

                  Gut, auf korrektes HTML wollte ich die Frage natürlich schon bezogen wissen :-)

                  dann hast du recht.

                  Struppi.

                  --
                  Javascript ist toll (Perl auch!)
          2. Hallo,

            Ne stimmt, du hast Recht. Aber woher willst du wissen, das Christian mit event-Handling http://de.selfhtml.org/dhtml/modelle/anzeige/domevents.htm@title=sowas meint. Oder geht deine Methode auch in normalen Schleifen.

            ja.

            Ich hab's gearade mal ausprobiert. Allerdings liefert er mit immer undefined. Was mache ich falsch?

            mfg. Daniel

            1. hi,

              Ich hab's gearade mal ausprobiert. Allerdings liefert er mit immer undefined. Was mache ich falsch?

              i hat nach dem Durchlauf deiner Schleife den Wert 3 - und dein Wörter-Array enthält aber kein Element mit diesem Index mehr.

              Wenn das "aktuelle" i aus der Schleife später in dem Kontext, in dem der onclick-Event ausgeführt wird, noch vorhanden sein soll, dann musst du entweder closures nutzen (zusammen mit molily als Author ein dankbare Stichwort für die Archivsuche), oder das aktuelle i irgendwie anders "sichern", so dass es nachher noch verfügbar ist - bspw., in dem du es an das Element als Attribut anhängst:

              for (var i = 0; i < Buttons.length; i++){  
               alert("onclick für Button Nummer "+(i+1)+" wird eingefügt");  
               Buttons[i].onclick = function(){  
                alert(Woerter[this.i]);  
               }  
               Buttons[i].i = i;  
              }
              

              this zeigt ja innerhalb der Funktion auf das Element, auf dem der Event auslöst, und damit this.i auf das Attribut, dass wir dem Button in der Schleife anhängen.

              gruß,
              wahsaga

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

                i hat nach dem Durchlauf deiner Schleife den Wert 3

                Davon bin ich ja eigentlich auch ausgegangen, aber Struppi hat geschrieben, dass man auf diese Weise eben dynamische Parameter auch in einer Schleife setzen kann.
                Mit setAttribute(), oder eben eval() könnte man das Problem ja auf einfache Weise umgehen…

                Wenn das "aktuelle" i aus der Schleife später in dem Kontext, in dem der onclick-Event ausgeführt wird, noch vorhanden sein soll, dann musst du entweder closures nutzen (zusammen mit molily als Author ein dankbare Stichwort für die Archivsuche), oder das aktuelle i irgendwie anders "sichern", so dass es nachher noch verfügbar ist - bspw., in dem du es an das Element als Attribut anhängst

                Das ist natürlich auch 'ne Lösung. Werde ich mir merken. Danke.

                mfg. Daniel

                1. hi,

                  i hat nach dem Durchlauf deiner Schleife den Wert 3

                  Davon bin ich ja eigentlich auch ausgegangen, aber Struppi hat geschrieben, dass man auf diese Weise eben dynamische Parameter auch in einer Schleife setzen kann.
                  Mit setAttribute(), oder eben eval() könnte man das Problem ja auf einfache Weise umgehen…

                  Nein, da wirfst du Dinge in einen Topf, die nichts miteinander zu tun haben.

                  Dein i ist eine globale Variable, und die hat nach Ablauf der Schleife den Wert 3.
                  Die Funktion, die du für onclick zuweist, wird erst später ausgeführt.
                  Sie trifft dabei auf eine Variable i, die im aktuellen Scope - dem des Objektes - nicht vorhanden ist. Also wird "weiter oben" nachgeschaut, und schliesslich im globalen Scope (window) ein i einmal gefunden - das jetzt aber dummerweise bereits den Wert 3 hat.

                  closures wären eine Möglichkeit, einen lokalen Gültigkeitsbereich zu erzeugen, in dem das _dortige_ i (oder auch eine Variable anderen Namens) den Wert des "aktuellen" i zugewiesen bekommt, und auch über die Laufzeit der For-Schleife hinaus behält.

                  Eine "ganz fiese" alternative Möglichkeit wäre noch, gar nicht eine Variable an die Funktion zu übergeben - sondern ein Textliteral, dass den _Wert_ von i enthält - der dann nach einem entsprechenden Casting zurück in einen nummerischen Wert dort wieder als solcher verwendet wird.
                  Dabei dürften (oder sollten) sich aber jedem, der sich ein bssichen mit sauberer Scripterstellung unter Javascript beschäftigt hat, die Fussnägel hochrollen :-)

                  gruß,
                  wahsaga

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