Roland: Probleme mit addEventListener

hallo, ich bins nochmal.
ich habe mal ein neues thema eröffnet, weil meine frage an keinen der drei "antworten-stränge" richtig gepasst hätte.

also ich benutze jetzt folgende Funktion, die zumindest so ähnlich in einem forum gekannt wurde, zum registieren von events

function addEvent(object, type, listener)
{
    if (object.addEventListener)
    {
        object.addEventListener(type, listener, false);
    }
    else if (object.attachEvent)
    {
        object.attachEvent('on' + type, listener);
    }
}

bei "einem" event funktioniert das auch gut, bspw.
Code:

addEvent('window', 'load', irgendeineFunktion);

aber wenn ich die verschaltel, dann funktionier nichts mehr, bspw.

Code:

addEvent('window', 'load', addEvent(document.forms[0], 'submit', irgendeineFunktion));

wie ist das problem zu lösen?

  1. hi,

    ich habe mal ein neues thema eröffnet, weil meine frage an keinen der drei "antworten-stränge" richtig gepasst hätte.

    Doch hätte sie eigentlich ganz gut ...

    aber wenn ich die verschaltel, dann funktionier nichts mehr, bspw.

    addEvent('window', 'load', addEvent(document.forms[0], 'submit', irgendeineFunktion));

    Du übergibst hier keine Funktionsreferenz, sondern lediglich den Rückgabewert eines Funktionsaufrufes.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Du übergibst hier keine Funktionsreferenz, sondern lediglich den Rückgabewert eines Funktionsaufrufes.

      Und wie mache ich das?

      1. Nachtrag:

        Es funktioniert, wenn ichs so schreib

        function foo()
        {
            // JavaScript-Code
        }

        function bar()
        {
            addEvent(document.contact_form, 'submit', foo);
        }

        addEvent(window, 'load', bar);

        Geht das vielleicht auch in einer zeile?
        so wie es beiaddEvent('window', 'load', addEvent(document.forms[0], 'submit', irgendeineFunktion));
        gewesen wäre?

        1. hi,

          Es funktioniert, wenn ichs so schreib

          function foo()
          {
              // JavaScript-Code
          }

          function bar()
          {
              addEvent(document.contact_form, 'submit', foo);
          }

          addEvent(window, 'load', bar);

          Geht das vielleicht auch in einer zeile?

          So lange du die Syntaxregeln einhältst, ist es Javascript vollkommen egal, wie viel Code du in einer Zeile notierst.

          so wie es beiaddEvent('window', 'load', addEvent(document.forms[0], 'submit', irgendeineFunktion));
          gewesen wäre?

          function() { ... }
          würde man eine "anonyme Funktion" nennen. Auch der "Wert" dieses Ausdrucks in eine Funktionsreferenz.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. So lange du die Syntaxregeln einhältst, ist es Javascript vollkommen egal, wie viel Code du in einer Zeile notierst.

            Hey, danke! Es funktioniert!
            sry, aber ich komme von php und da ist das schon alles iwie anders.. ist ja auch keine objektbasierende sprache. naja, also jetzt gehts ja, vielen dank nochmals. ich glaub, ich denke zu oft einfach noch falsch.

            1. Nachtrag:

              Uwäh, ich werd doch noch nicht mit einem kleinen problem fertig.
              und zwar steht bei mir jetzt

              add_event_listener(window, 'load', function() { add_event_listener(document.contact_form, 'submit', validate_contact_form_data); });

              Das Problem ist, dass das entsprechende Formular abgeschcikt wird, selbst wenn validate_contact_form_data false zurückliefert. das ist natürlich nicht im sinne des erfinders!

              1. Das Problem ist, dass das entsprechende Formular abgeschcikt wird, selbst wenn validate_contact_form_data false zurückliefert. das ist natürlich nicht im sinne des erfinders!

                EDIT: Hm, also in allen IEs funktioniert es, nur der Fuchs schickt es immer ab...

                1. hi,

                  Das Problem ist, dass das entsprechende Formular abgeschcikt wird, selbst wenn validate_contact_form_data false zurückliefert. das ist natürlich nicht im sinne des erfinders!

                  EDIT: Hm, also in allen IEs funktioniert es, nur der Fuchs schickt es immer ab...

                  Dann hast du vielleicht vorher in der Funktion einen Fehler, der zum Abbruch führt - so dass es zum return false nicht mehr kommt.

                  gruß,
                  wahsaga

                  --
                  /voodoo.css:
                  #GeorgeWBush { position:absolute; bottom:-6ft; }
                  1. Dann hast du vielleicht vorher in der Funktion einen Fehler, der zum Abbruch führt - so dass es zum return false nicht mehr kommt.

                    Nein. Ich hab unmittelbar vor return false ein alert eingebaut, und das wird ausgegeben. außerdem würds dann ja auch nicht im ie funktionieren...

                    1. hi,

                      Nein. Ich hab unmittelbar vor return false ein alert eingebaut, und das wird ausgegeben.

                      Hm, ohne Beispieldatei kann ich dir da auch nicht mehr zu sagen.

                      außerdem würds dann ja auch nicht im ie funktionieren...

                      Das muss nicht unbedingt was heissen - es gibt ja genügend eigenwillige Syntax, die der IE proprietär unterstützt.

                      gruß,
                      wahsaga

                      --
                      /voodoo.css:
                      #GeorgeWBush { position:absolute; bottom:-6ft; }
                      1. Hm, ohne Beispieldatei kann ich dir da auch nicht mehr zu sagen.

                        function validate_contact_form_data()
                        {
                            var contact_form = document.contact_form;
                            var name = contact_form.name.value;
                            var error_message = '';

                        if (name.length == 0)
                            {
                                error_message += 'Bitte geben Sie Ihren Namen ein.\n';
                            }
                            else if (name.length < 3)
                            {
                                error_message += 'Der Name muss mindestens drei Zeichen lang sein.\n';
                            }

                        if (error_message.length = 0)
                            {
                                return true;
                            }
                            else
                            {
                                alert(error_message);
                                return false;
                            }
                        }

                        function add_event_listener(object, type, listener)
                        {
                            if (object.addEventListener)
                            {
                                object.addEventListener(type, listener, false);
                            }
                            else if (object.attachEvent)
                            {
                                object.attachEvent('on' + type, listener);
                            }
                        }

                        add_event_listener(window, 'load', function() { add_event_listener(document.contact_form, 'submit', validate_contact_form_data); });

                        1. function validate_contact_form_data()
                          {
                              var contact_form = document.contact_form;

                          Hier könntest du theoretisch einfach schreiben:
                          var contact_form = this;

                          .. aber der IE übergibt dem Event nicht this, deshalb ist attachEvent so nicht brauchbar. Deshalb ist es sinnvoller sich eionen eigenen Eventlistern zu bauen der in allen Browsern die Events kennen funktioniert und this übergibt.
                          http://javascript.jstruebig.de/js/add_event.js

                          Dann sieht der code so aus:

                          <script type="text/javascript" src="add_event.js"></script>  
                          <script type="text/javascript">  
                          function validate_contact_form_data()  
                          {  
                           var contact_form = this;  
                              var name = contact_form.name.value;  
                              var error_message = '';  
                            
                              if (name.length == 0)  
                              {  
                                  error_message += 'Bitte geben Sie Ihren Namen ein.\n';  
                              }  
                              else if (name.length < 3)  
                              {  
                                  error_message += 'Der Name muss mindestens drei Zeichen lang sein.\n';  
                              }  
                            
                              if (error_message.length == 0)  
                              {  
                                  return true;  
                              }  
                           return false;  
                          }  
                            
                          addEvent(window, 'load', function() { addEvent(document.contact_form, 'submit', validate_contact_form_data); });  
                          
                          

                          Struppi.

                          1. Naja, okay, aber das behebt leider nicht mein Problem, dass der Firefox das Forumlar immer absendet, selbst wenn validate_contact_form_data false liefert. Nur der Internet Explorer macht es richtig - dafür dann aber auch in allen Version. (5.5 / 6.0 / 7.0)

                            1. Naja, okay, aber das behebt leider nicht mein Problem, dass der Firefox das Forumlar immer absendet, selbst wenn validate_contact_form_data false liefert. Nur der Internet Explorer macht es richtig - dafür dann aber auch in allen Version. (5.5 / 6.0 / 7.0)

                              Mein FF (1.5) macht es richtig.

                              Struppi.