ie addEventListener this Problem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • ie addEventListener this Problem

    Hi, eine kleine Erweiterung zu meinem letzten Post:
    ich will in einer Klasse zb. allen Links in einer Liste (Navigation) eine Funktion zuordnen, die dann per this-Zeiger auf den Link zugreifen kann.
    Dank Blackgreetz klappt das auch, aber IE macht natürlich wieder Mucken.
    Zum einen kennt IE (7) nicht addEventListener, so das ich mir eine Hilfsfunktion _addEventListener(element, event, handler) gesucht habe
    PHP-Code:
    // zuweisen einer Funktion innerhalb einer Methode
    var basisNode document.getElementById("navigation");
    var 
    links basisNode.getElementsByTagName("a");
                   for(
    i=0i<links.lengthi++){
                   
    _addEventHandler(links[i], "mouseover"foo);
                     
    //  links[i].addEventListener("mouseover", foo, false);    
                   

    Die Funktion _addEventListener(element, event, handler):
    PHP-Code:
    function _addEventHandler(elementeventhandler) {
      var 
    _tmp_onevent;
      if (!
    element || !event )
        return 
    false;
      if (
    element.addEventListener) {  // DOM-konform
        
    element.addEventListener(eventhandlerfalse);
      }else {
        
    _onevent 'on'+event;
        if (
    element.attachEvent){     // IE
          
    element.attachEvent(_oneventhandler);
        }
      }

    mein Problem:
    IE kommt mit this nicht zurecht:
    PHP-Code:
    function foo(){  alert('');} // IE ist brav
    function foo(){ this.style.backgroundColor="red"alert('');}
    // IE macht nicht das alert() und wirft auch keinen Fehler
    // Interessanter weise führt FF this.style aus 
    Korrekt wäre ja:
    PHP-Code:
    // zuweisen der funktion:
    var links basisNode.getElementsByTagName("a");
          for(
    i=0i<links.lengthi++){
               
    _addEventHandler(links[i], "mouseover",function(ev){foo(this);});
          
    //     links[i].addEventListener("mouseover", foo, false);    
          

    und foo dann:
    PHP-Code:
    function foo(obj){
              try{ 
                
    obj.style.backgroundColor="red"//IE meldet Object Error.
                
    alert('');
              }catch(
    e){alert(e);}} 
    macht FF tadellos, IE meldet Object Error....
    Kennt einer eine DOM entsprechende, auch im IE funktionierende Lösung....
    Will nicht auf <a href="#" Menu.foo(this) /> zurückfallen wollen...
    "I don't want to belong to any club that would accept me as a member."

    Groucho Marx

  • #2
    Hast du mal versucht Handler nicht zu übergeben sondern direkt bei attachEvent und addEventListener zu definieren?

    Könnte wetten, dass der IE erst foo ausführt und da this nicht definiert ist, gibts den Error.

    mfg

    Kommentar


    • #3
      Meinst du so:
      PHP-Code:
      }else if (links[i].attachEvent) {
                    
      links[i].attachEvent("onmouseover",
                                function(
      ev){
                                       
      foo(obj){// statt obj auch this probiert: Object Error
                                              
      obj.style.backgroundColor="red";
                                       };
                                }
                    );
                         

      ?
      "I don't want to belong to any club that would accept me as a member."

      Groucho Marx

      Kommentar


      • #4
        PHP-Code:
        }else if (links[i].attachEvent) {
                      
        links[i].attachEvent("onmouseover",
                                  function(
        ev){
                                         
        foo(this);
                                  }
                      );
                           

        Probier mal das. Ansonsten guck ich nachher dann mal richtig

        mfg
        ps: wenn du kannst, gib mal noch den html code teilweise.. dann kann ich selber testen

        Kommentar


        • #5
          ne, IE will einfach nicht....

          ps: wenn du kannst, gib mal noch den html code teilweise.
          Das wäre super - wie gesagt, bekäme es mit onclick="Menu.foo(this);" auch mit IE ins laufen, aber gerade wenn ich nur this übergeben will bietet sich das mit EventListener an....
          Und ich will wissen wie es geht...
          Link zur menu.js
          Zuletzt geändert von mcmurphy; 30.10.2008, 17:34.
          "I don't want to belong to any club that would accept me as a member."

          Groucho Marx

          Kommentar


          • #6
            Original geschrieben von mcmurphy
            ps: wenn du kannst, gib mal noch den html code teilweise.
            Das wäre super
            Super Kommentar - passend zum Zitat :P

            Problem liegt daran, dass bei this wohl irgendwas anderes übergeben wird, als das Objekt. Ich hab bis jetzt nicht wirklich rausgefunden, was this in dem Fall ist

            Fazit: Bastel ein Workaround

            und zwar folgender Maßen:

            Du gibst allen Links eine ID und diese übergibst du dann an die Funktions foo(). z.b. so:

            Code:
            }else if (links[i].attachEvent) {
                                   linkid= links[i].id;
                                   links[i].attachEvent("onmouseover", function(ev){ foo(linkid); } );
                               }
            Der Umweg über die Variable linkid ist nötig, weil man ansonsten nen Fehler bekommt (ich zumindest).

            Ich hoffe jetz mal für dich, dass deine Links keine andere ID haben.
            Ich guck zwar, wenn ich Zeit finde, nochmal, was da genau bei this übergeben wird, aber das Workaround passt zumindest

            Kommentar


            • #7
              Ups, das Zitat sollte das hier noch beinhalten:
              dann kann ich selber testen
              THX Blackgreetz und schönen Dank auch WinzigWeich
              Da versucht man besser zu werden / schöneren & DOM konformen Code zu schreiben und wer stellt uns ein Bein...

              Wollte id eigentlich vermeiden, aber wenn die Herren Gates & Balmer meinen ....
              "I don't want to belong to any club that would accept me as a member."

              Groucho Marx

              Kommentar


              • #8
                @Kommentar: Schon klar

                Mir fehlt ansich aber auch eine Funktion um rauszubekommen, was this jetzt genau ist.
                This stellt auch im IE ein Object da, aber ich weiß einfach nicht, welches.

                Was ich mir vorstellen könnte wäre ein <script>-Object, was ansich aber schwachsinnig wäre..

                Insofern ist das Workaround wohl atm de beste Lösung...

                ..aber was hast du gegen id?

                mfg

                Kommentar


                • #9
                  Da ergibt sich noch eine weitere Frage in diesem Zusammenhang:
                  Wenn ich einem (Html-) Objekt per EventListener <ergänzt>eine Funktion zuordne</ergänzt>, sehe ich (bisher) keine Möglichkeit weitere Parameter zu übergeben, welche nicht in Form von auslesbaren Attributen vorliegen.... oder habe ich was überlesen / sehen?

                  Müßte in solchen Fällen immer ein reguläres HTML-Attribut ala <div onclick="fooBar(einParameter, nochEiner [, etcPP]);"> verwenden?
                  Oder, wie gesagt, habe ich bei meiner Grundlagenforschung was übersehen?
                  Zuletzt geändert von mcmurphy; 31.10.2008, 11:57.
                  "I don't want to belong to any club that would accept me as a member."

                  Groucho Marx

                  Kommentar


                  • #10
                    aber was hast du gegen id?
                    fände es einfach eleganter ohne eine ID zu arbeiten.
                    Man kann sich vertun (doppelte id's) - und in meinem Fall werden wird es eine LinkListe mit zwei Ebenen geben also müßte ich sowas wie
                    mainNavLink01
                    mainNavLink02
                    subNavLink01
                    subNavLink02
                    mainNavLink03
                    machen....
                    brrrr....

                    oder durchnummerien - und wenn dann ein Punkt rausfliegt....
                    Dann schon fast lieber inline ala onclick="return foo(this);", dann brauche ich mir um die id Benamsung keenen Kopp zu machen....

                    Was ich mir vorstellen könnte wäre ein <script>-Object, was ansich aber schwachsinnig wäre..
                    ergo Microsoft Konform
                    Zuletzt geändert von mcmurphy; 31.10.2008, 11:45.
                    "I don't want to belong to any club that would accept me as a member."

                    Groucho Marx

                    Kommentar


                    • #11
                      Ja gut, dass mitder Nummerierung wäre aufwendig.
                      Anders könnte es laufen, wenn du das Menü gleich per Javascript||PHP ausgibst und dabei die Ids vergibst, da sollte dann theoretisch nichts passieren, weil du es ja alles hintereinander machst


                      Da ergibt sich noch eine weitere Frage in diesem Zusammenhang:
                      Alles in dem Post hab ich ehrlich gesagt nicht verstanden
                      z.b. im ersten Teil fehlt ein Verb und
                      "keine Möglichkeit weitere Parameter zu übergeben,"
                      < versteh ich nicht -g-

                      [quote]ergo Microsoft Konform [/qoute]

                      Immer diese Windows-Hasser !

                      Kommentar


                      • #12
                        Immer diese Windows-Hasser...
                        wieso, du schreibst doch dass das Verhalten des IE anscheinend schwa******ig ist

                        zu meiner Parameter frage:
                        wenn ich in einer Klasse per addEventListener einem Event eine Function zuweise, kann ich anscheindend nur Parameter übergeben, welche im Namensraum der Klasse bekannt sind (und den Zeiger this, wenn ich es mit einem Browser zu tun habe )

                        Bei parametern, welche sich zb. aus PHP ergeben verwende ich die inline Event Regstrierung.

                        Lese gerade hier zu dem Thema....
                        "I don't want to belong to any club that would accept me as a member."

                        Groucho Marx

                        Kommentar


                        • #13
                          wieso, du schreibst doch dass das Verhalten des IE anscheinend schwa******ig ist
                          Nö. Hab geschrieben, dass this als script-Object schwachsinnig wäre, aber ich habs noch nicht geschafft rauszufinden, was this wirklich ist

                          wenn ich in einer Klasse per addEventListener einem Event eine Function zuweise, kann ich anscheindend nur Parameter übergeben, welche im Namensraum der Klasse bekannt sind (und den Zeiger this, wenn ich es mit einem Browser zu tun habe )
                          Wenn du als Namensraum der Klasse in deinem Beispiel jetzt:
                          Code:
                          function CMenu(){
                          //Namensraum
                          }
                          verstehst, dann stimmt es so nicht:

                          Code:
                           objectT = "12345";
                          
                          function CMenu(){
                          
                              this.init = function(){  //gekürzt
                                            if (links[i].attachEvent) {
                                                 var testname = links[i].id;
                                                 links[i].attachEvent("onmouseover", function(ev){ foo(objectT); } );
                                             }
                              }
                          Funktioniert auch. Da objectT global ist müsste dein Namensraum "global" sein, womit die Frage doch irgendwie den Sinn verliert, oder?

                          Die verlinkte Seite kann ich nur befürworten, da dort einige Informationen zu dem Thema sind.

                          mfg

                          Kommentar


                          • #14
                            Blackgreetz für deine hilfreichen Posts
                            aber ich habs noch nicht geschafft rauszufinden, was this wirklich ist
                            wenn du was rausfindest laß es mich wissen
                            "I don't want to belong to any club that would accept me as a member."

                            Groucho Marx

                            Kommentar


                            • #15
                              Kein Problem.

                              Im Übrigends gibt es eine ASP.Net Ajax Erweiterung für Javascript, wo es auch wirklich sowas wie Namespaces gibt.

                              So genau hab ich mir das noch nicht angeschaut. Mehr Infos im Open Book von Google: (: Klick mich

                              Kommentar

                              Lädt...
                              X