Kai345: Link-Attribute aus Array hinzufügen ohne setAttribute

Grütze .. äh ... Grüße!

Ich erzeuge ein Objekt (hier Link) und befülle es dann dynamisch mit den
Attributen und Werten, die ich gerade benötige.
Die Daten liegen in einem Array und sind folgendermaßen angeordnet:

  
more_opts = [  
   {att : 'foo1', val : 'bar1'},  
   {att : 'foo2', val : 'bar2'},  
   {att : 'foo3', val : 'bar3'}  
];  

bisher mache ich das in etwa folgendermaßen:

  
function nLink(myhref,mytitle,more) {  
 if (arguments.length < 2) return null;  
   var dol = document.createElement("A");  
   dol.href = myhref;  
   dol.title = mytitle;  
   if (more != null) {  
      for (var i = 0; i < more.length; i++) {  
         dol.setAttribute(more[i].att,more[i].val);  
      }  
   }  
}  
  
nLink("#","Blabla",more_opts);  
  

Funktioniert einwandfrei, bis auf  .. you guessed it .. IE. Dort funktioniert ja
bekanntermaßen setAttribute() nicht Ich möchte aber gerne die zusätzliche (hier
nicht gepostete) Funktion nur für den IE sowie die Abfragen, ob IE oder nicht,
gerne einsparen.

Die richtige Syntax ist ja element.foo = bar, allerdings liegen die Daten im
Array als String vor. Wie bekomme ich nun

element.foo1 = bar1;
element.foo2 = bar2;
...

hin?

Ich probiere hier seit Stunden in vielen Kombinationen und an verschiedensten
Stellen mit und ohne eval, Stringverkettung, zusätzlichen Anführungszeichen und
verschiedenene Klammern herum, aber entweder wirft es einen Fehler (je nach dem was
ich gerade versucht habe) oder die Zuweisung wird entweder nicht übernommen oder
funktioniert nicht.

Ich bin im Moment einfach nicht mehr denkfähig (wer in einer ungedämmten
Dachwohnung wohnt, weiß was ich meine) und ganz kurz davor, die dicht neben mir
liegende Flex ausgiebig an meinem Computer auszuprobieren *grummel*

Aufgrund der vielen Stunden, die ich jetzt schon verzweifelt versuche, das Problem zu
lösen, vermute ich, daß es eine ganz triviale Lösung gibt ;) [passiert mir immer]

Brauche Input {und/oder Kühlung ;)}

Kai

  1. hi,

    Die richtige Syntax ist ja element.foo = bar, allerdings liegen die Daten im Array als String vor. Wie bekomme ich nun

    element.foo1 = bar1;
    element.foo2 = bar2;
    ...

    hin?

    element.foo == element["foo"]

    gruß,
    wahsaga

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

    Funktioniert einwandfrei, bis auf  .. you guessed it .. IE. Dort funktioniert ja bekanntermaßen setAttribute() nicht

    zumindest nicht zuverlässig. Dafür geht im IE aber

    element.foo1 = bar1;
    element.foo2 = bar2;

    ohne Probleme. Und natürlich auch die alternative Syntax:

    element['foo1'] = bar1;
       element['foo2'] = bar2;

    Also wo ist nun noch das Problem?  ;-)

    Ich probiere hier seit Stunden in vielen Kombinationen und an verschiedensten Stellen mit und ohne eval, Stringverkettung, zusätzlichen Anführungszeichen und verschiedenene Klammern herum, aber entweder wirft es einen Fehler (je nach dem was ich gerade versucht habe) oder die Zuweisung wird entweder nicht übernommen oder funktioniert nicht.

    Hmm. Dann hast du die obige Variante wohl beim Probieren noch nicht getroffen?

    Ich bin im Moment einfach nicht mehr denkfähig (wer in einer ungedämmten
    Dachwohnung wohnt, weiß was ich meine) ...

    Oh ja, allerdings. Die Temperatur in meinem Arbeitszimmer unterm Dach nähert sich gerade wieder der 30°C-Marke. Von oben! Momentan 30.4°C, Tendenz zum Glück fallend.

    und ganz kurz davor, die dicht neben mir liegende Flex ausgiebig an meinem Computer auszuprobieren *grummel*

    Tausch die Flex lieber gegen eine kleine mobile Klimaanlage ein. Ich möchte meine nicht mehr hergeben! Leider ist kürzlich der Abluftschlauch gerissen und ich habe noch keinen Ersatz. Also kann ich das Gerät momentan nicht wirklich nutzen - höchstens, um die Warmluft im Raum umzuwälzen. Das kann ein einfacher Ventilator allerdings ebensogut. Und mit weniger Strom. ;-)

    Aufgrund der vielen Stunden, die ich jetzt schon verzweifelt versuche, das Problem zu lösen, vermute ich, daß es eine ganz triviale Lösung gibt ;)

    Vermute ich auch.

    Brauche Input {und/oder Kühlung ;)}

    Oder beides!

    Schönen Abend noch,
     Martin

    --
    Zur Abwechslung mal keine Signatur.
    1. Grütze .. äh ... Grüße!

      Also wo ist nun noch das Problem?  ;-)

      Hier ist es: Hier stand bis vor kurzem eine sehr lange Antwort mit detaillierten Fehlerbeschreibungen und codeauszügen aus der Praxis, denn es klappt immer noch nicht so richtig. Aber dann aus Versehen "reload" im falschen Tab gemacht und alles war weg. Und ich bin deshalb gerade tierisch genervt (hatte schon über eine halbe Stunde am dem Posting gesessen, weil ich immer wieder etwas probiert habe und die Ergebnisse mit ins Posting genommen habe. Und hab jetzt irgendwie keinen Bock mehr,alles noch mal zu schreiben :( *grummel*

      Vielleicht morgen wieder.


      Kai

      1. ...weil ich immer wieder etwas probiert habe und die Ergebnisse mit ins Posting genommen habe. Und hab jetzt irgendwie keinen Bock mehr,alles noch mal zu schreiben :( *grummel*

        Vielleicht morgen wieder.

        Wie schon mehrmfach erwähnt die Schreibweise object[attribute] funktioniert.

        Struppi.

        1. Grütze .. äh ... Grüße!

          ...weil ich immer wieder etwas probiert habe und die Ergebnisse mit ins Posting genommen habe. Und hab jetzt irgendwie keinen Bock mehr,alles noch mal zu schreiben :( *grummel*

          Vielleicht morgen wieder.

          Wie schon mehrmfach erwähnt die Schreibweise object[attribute] funktioniert.

          Leider nicht vollständig, oder ich mache was falsch. Wie schon angedeutet, hat es _teilweise_ funktioniert, aber leider anscheinend nicht mit jedem Attribut. Wenn ich für einen Link mehrere Attribute im Array habe (onclick, name, id, rel), dann setzt FF nur name, rel und id, IE setzt nur rel, id und onclick (was aber nicht funktioniert, genau wie bei setAttribute) und Opera zeigt nur rel, id und name an, aber nicht onclick, aber die dem onclick-Attribut zugewiesene Funktion wird seltsamerweise ausgeführt.

          (IE6 mit Developer Toolbar, O9 mit DOM-Snapshot und Developer Console, FF2.0.0.4 mit DOM Inspector/Firebug)

          Alles in allem weiß ich einfach nie, welches Attribut nun gerade berücksichtigt wird und welches nicht.

          Da ist wohl noch ein Fehler in meinen Funktionen. Sowie ich wieder FTP-Zugriff habe (klappt gerade nicht) , werde ich die entsprechenden Dateien zur Verfügung stellen.


          Kai

          --
          What is the difference between Scientology and Microsoft? One is an
          evil cult bent on world domination and the other was begun by L. Ron
          Hubbard.
          1. Wie schon mehrmfach erwähnt die Schreibweise object[attribute] funktioniert.

            Leider nicht vollständig, oder ich mache was falsch.

            Mit Sicherheit.

            Wie schon angedeutet, hat es _teilweise_ funktioniert, aber leider anscheinend nicht mit jedem Attribut. Wenn ich für einen Link mehrere Attribute im Array habe (onclick, name, id, rel),

            Das können alle Browser ohne Probleme setzen.

            Alles in allem weiß ich einfach nie, welches Attribut nun gerade berücksichtigt wird und welches nicht.

            Alle.

            Struppi.

            1. Grütze .. äh ... Grüße!

              Wie schon mehrmfach erwähnt die Schreibweise object[attribute] funktioniert.

              Leider nicht vollständig, oder ich mache was falsch.

              Mit Sicherheit.

              Ok, hier nun der Test:
              http://www.kaichen.in/test/

              Es geht um die Funktion DElement im Script

              In der Navigation der Seite  erscheinen unter "Aussehen" vier Layout-Links, denen per
              Javascript die Attribute href title und onclick zugewiesen werden sollen.
              (etwas höher im Script, Funktion LayoutMenu)

              href und title werden auch gesetzt, onclick nicht. Auch nicht, wenn ich onlick
              einen einfacheren Wert zuweise, z.B. alert("hallo")
              Einzig und allein Opera macht genau das, was ich will, auch wenn das onclick-Attribut
              nicht im DOM-Snapshot erscheint.

              Aber wo ist nun mein Fehler? Schließlich werden einige der Attribute einwandfrei gesetzt, also kann es nicht *völlig* falsch sein ...

              So sieht das Script mit IE-Sonderbehandlung bisher aus


              Kai

              --
              What is the difference between Scientology and Microsoft? One is an
              evil cult bent on world domination and the other was begun by L. Ron
              Hubbard.
              ie:{ fl:( br:< va:) ls:? fo:| rl:? n4:° ss:{ de:] js:| ch:? mo:| zu:|
              1. Ok, hier nun der Test:
                http://www.kaichen.in/test/

                Es geht um die Funktion DElement im Script

                In der Navigation der Seite  erscheinen unter "Aussehen" vier Layout-Links, denen per
                Javascript die Attribute href title und onclick zugewiesen werden sollen.
                (etwas höher im Script, Funktion LayoutMenu)

                href und title werden auch gesetzt, onclick nicht. Auch nicht, wenn ich onlick
                einen einfacheren Wert zuweise, z.B. alert("hallo")
                Einzig und allein Opera macht genau das, was ich will, auch wenn das onclick-Attribut
                nicht im DOM-Snapshot erscheint.

                Dein Problem ist, dass dir nicht klar ist wie du eine Eventfunktion zuweisen musst, onevent benötigt eine Funktionsreferenz, keinen String.

                also z.b. so :
                {att: 'onclick', val: function() {..} }

                Ob das Allerdings geht bezweifle ich, da du den String zusammenbastelst. Du könntest auch new Function probieren oder den Ansatz komplett ändern, doch dazu müßtest du etwas mehr hinter solche Dinge steigen.

                Das geht z.b. auch nicht:
                resbut.onclick = "Formular.askReset();";

                Struppi.

                1. Grütze .. äh ... Grüße!

                  Dein Problem ist, dass dir nicht klar ist wie du eine Eventfunktion zuweisen musst, onevent benötigt eine Funktionsreferenz, keinen String.

                  also z.b. so :
                  {att: 'onclick', val: function() {..} }

                  Ob das Allerdings geht bezweifle ich, da du den String zusammenbastelst. Du könntest auch new Function probieren oder den Ansatz komplett ändern, doch dazu müßtest du etwas mehr hinter solche Dinge steigen.

                  Ich hab ja viel Zeit :( . Aber jetzt habe ich wenigstens Ansätze, von denen aus ich weitermachen kann.
                  Ich wußte bis vor ca. fünf Wochen noch gar nichts über Javascript, daher habe ich auch nicht erwartet, daß ich schon alle Probleme lösen kann. Aber hin und wieder ein kleiner Stoß in die richtige Richtung und das wird das schon ;)

                  Ich werde mich dann jetzt mal näher damit befassen. Erst einmal Danke.


                  Kai

                  --
                  What is the difference between Scientology and Microsoft? One is an
                  evil cult bent on world domination and the other was begun by L. Ron
                  Hubbard.
                  ie:{ fl:( br:< va:) ls:? fo:| rl:? n4:° ss:{ de:] js:| ch:? mo:| zu:|
                  1. Grütze .. äh ... Grüße!

                    Ich werde mich dann jetzt mal näher damit befassen. Erst einmal Danke.

                    Ein erster Test mit new Function hat es anscheinend gelöst:

                      
                    var onc = new Function("e",'Stylesheet.set_ss(\'D'+(i+1)+'\');return false;')  
                    var sublinkdata = [  
                       {att: 'href', val: "#"},  
                       {att: 'onclick', val: onc},  
                       {att: 'title', val: "Layoutvorschlag "+(i+1)}  
                    ];
                    

                    Bisher scheint es mit allen Browsern hier zu funktionieren (Test außer IE7, seit mein Notebook verstorben ist) zumindest mit IE5.5/6.0 sowie FF2, Op8/9, Netscape7


                    Kai

                    --
                    What is the difference between Scientology and Microsoft? One is an
                    evil cult bent on world domination and the other was begun by L. Ron
                    Hubbard.
                    ie:{ fl:( br:< va:) ls:? fo:| rl:? n4:° ss:{ de:] js:| ch:? mo:| zu:|
                    1. Ein erster Test mit new Function hat es anscheinend gelöst:

                      var onc = new Function("e",'Stylesheet.set_ss('D'+(i+1)+'');return false;')
                      var sublinkdata = [
                         {att: 'href', val: "#"},
                         {att: 'onclick', val: onc},
                         {att: 'title', val: "Layoutvorschlag "+(i+1)}
                      ];

                      
                      >   
                      > Bisher scheint es mit allen Browsern hier zu funktionieren (Test außer IE7, seit mein Notebook verstorben ist) zumindest mit IE5.5/6.0 sowie FF2, Op8/9, Netscape7  
                        
                      Müßte eigentlich funktioneren. Ich benutze selten new Function() allerdings dürfte es bei deinem Ansatz schwer sein es zu vermeiden (Womit ich nicht sagen möchte, dass er schlecht ist).  
                        
                      Ich bevorzuge eine Funktion die Events den Objekten hinzu fügt. Ähnlich wie [\[object](http://developer.mozilla.org/en/docs/DOM:element.addEventListener).addEventListener] des Mozillas, aber so geht's auch.  
                        
                      Struppi.
                      
                      1. Grütze .. äh ... Grüße!

                        Ich bevorzuge eine Funktion die Events den Objekten hinzu fügt. Ähnlich wie [object.addEventListener] des Mozillas, aber so geht's auch.

                        Ja ich weiß .. ich habe ohnehin irgendwann vor, die ganzen Eventhandler-Aufrufe aus dem HTML [eigentlich hab ich außer in dem Menü nur noch welche im Kontaktformular] rauszuschmeißen und im Script zu setzen, aber bisher ist mir das noch zu heikel. Wie gesagt .. ich mache erst seit fünf Wochen 'in Javascript'. Immer Eins nach dem Anderen ;)

                        Mein Problem ist ja auch nur aus meine tiefen Abneigung dem IE gegenüber geboren worden, ich gestehe dem Teil einfach keine eigene Routine zu ;)


                        Kai

                        --
                        What is the difference between Scientology and Microsoft? One is an
                        evil cult bent on world domination and the other was begun by L. Ron
                        Hubbard.
                        ie:{ fl:( br:< va:) ls:? fo:| rl:? n4:° ss:{ de:] js:| ch:? mo:| zu:|