Christian: Eventhandling, mehrere Funktionen an ein Event hängen

Hallo,

ich möchte in JavaScript an ein Event mehrere Funktionen dranhängen.
Solange es nur eine Funktion ist, ist es kein Problem:

z.B.:
window.onresize = funktion1;

in C# lassen sich weitere Events durch += dranhängen (allerdings mit Hilfe eines EventHandlers).

Gibt es so etwas auch in JS??

zB: window.onresize += funktion2; (funzt nit, nur beispiel);

einzige Lösung des Problems sehe ich darin das ich eine Funktion schreibe, die alle weiteren aufruft und nur diese eine Funktion ans Event gehangen wird:

function test()
{
funktion1();
funktion2();
}
window.onresize = test;

Damit möchte ich mich allerdings nicht ganz zufrieden geben.
Gibt es noch eine andere Möglichkeit?!

Christian

  1. Hallo,

    Gibt es noch eine andere Möglichkeit?!

    Die DOM-Methode addEventListener() bietet sich an, wobei das AFAIK nur unter Mozilla-Derivaten (sowie auch im SVG-Kontext) funktioniert.

    Testbeispiel (beim resize-Event wird erst der Hintergrund zufaellig gefaerbt und dann erscheint eine alert-Box):

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>Test by TM 02/03</title>
    <script language="JavaScript" type="text/javascript">
    <!--

    function Init()
    {
      if(window.addEventListener)
      {
        window.addEventListener("resize",newBackColor,false);
        window.addEventListener("resize",handleResize,false);
      }
      else alert("Klappt leider nicht ...");
    }

    function handleResize()
    {
      alert("resize-Event fired");
    }

    function newBackColor()
    {
      document.getElementsByTagName("body")[0].style.backgroundColor="rgb("+Math.round(Math.random()*255)+","+Math.round(Math.random()*255)+","+Math.round(Math.random()*255)+")";
    }

    //-->
    </script>
    </head>
    <body onload="Init()">
    <p>Klappt unter Mozilla</p>
    </body>
    </html>

    MfG, Thomas

    1. Hi!

      Die DOM-Methode addEventListener() bietet sich an, wobei das AFAIK nur unter Mozilla-Derivaten (sowie auch im SVG-Kontext) funktioniert.

      Scottandrews hat eine kleine Crossbrowserfunktion geschrieben, die sich addEventListener und attachEvent widmet: http://scottandrew.com/weblog/articles/cbs-events

      Möglicherweise beherrschen auch Konqueror und Opera7 addEventListener, aber das hab ich noch nicht probiert.

      Gruß Herbalizer

  2. Moin Moin !

    Auch nicht schön, und vor allem ungetestet:

    var onClickFunctions=new Array();
    onClickFunctions.push(new Function('function code'));
    onClickFunctions.push(new Function('function code'));
    onClickFunctions.push(new Function('function code'));
    onClickFunctions.push(new Function('function code'));
    onClickFunctions.push(new Function('function code'));

    function onClickHandler()
    {
      var i;
      var rv=true;
      for (i=0; i<onClickFunctions.length; i=i+1) {
        rv=onClickFunctions[i].call(onClickHandler.arguments);
        if (!rv) break;
      }
      return rv;
    }

    (Ich weiß, das onClickHandler keine benannten Parameter hat. Sie kommen trotzdem in onClickHandler.arguments an. Ist zwar praktisch, aber häßlich! Die Parameterliste ist -- wenn man von der Deklaration und Zuweisung der Parameter-Variablen absieht -- kaum mehr als eine Aufrufempfehlung.)

    Alternative:

    <head>
    <script ...>
    var onLoadScript='';
    </script>
    </head>
    <body onload="if (onLoadScript!='') eval(onLoadScript);">
    <script ...>
    onLoadScript=onLoadScript+'alert("Hallo Welt");';
    </script>
    ...
    <script ...>
    onLoadScript=onLoadScript+'alert("Bin da, wer noch?");';
    </script>
    </body>

    Das setze ich momentan in einer komplexen, CGI-basierten Anwendung ein, die HTML aus Templates und Funktionsergebnissen zusammenstückelt.

    Alexander

    --
    Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
    Für eine bessere Übersichtsdarstellung des Forums: http://cforum.teamone.de/phpbt/bug.php?op=show&bugid=103&pos=2