tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
816
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von DataFox
    DataFox DataFox ist offline Mitglied Brokat
    Registriert seit
    Nov 2007
    Beiträge
    267
    Guten Abend liebe Experten,

    ich habe auf einer Seite mehrere Formulare wo SELECT-Tags vorkommen. Sobald sich irgend etwas in dem Formular tut, soll eine Funktion aufgerufen werden.

    Momentan kriege ich es nicht hin, das mir der Browser (MSIE 6.0 / Firefox) bei einem onchange-Event einen Alert ausspuckt:

    window.document.onchange = function() {
    alert('etwas wurde geändert!');
    }
    eigentlich müsste das doch so laufen. Denn das hier funktioniert auch:

    window.document.onmouseover = function() {
    alert('die maus ist drauf!');
    }
    welche anderen "schlauen Wege" gibt es, um global auf einen Event zu lauschen? Ich möchte nicht jedem Element im HTML-Code einen riesigen Rattenschwanz aus "onChange=..." mitgeben.

    Danke
    Laura
     

  2. #2
    Quaese Quaese ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Feb 2004
    Beiträge
    3.440
    Hi,

    den onchange-Event gibt es für das document-Objekt nicht (siehe Mozilla, MSDN).

    Eine andere Möglichkeit ist, im onload-Event alle Selectelemente zu durchlaufen und einen onchange-Handler zu registrieren.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    <html>
    <head>
    <title>www.tutorials.de</title>
    <meta name="author" content="Quaese">
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
     
    <script type="text/javascript">
    <!--
    function derAlert(strMsg){
      alert(strMsg);
    }
     
    window.onload = function(){
      // Select-Array mit allen Selectelementen erstellen
      var arrSel = document.getElementsByTagName("select");
     
      // Select-Array durchlaufen
      for(var i=0; i<arrSel.length; i++){
        // onchange-Event eine Funktion zuweisen
        arrSel[i].onchange = function(){ derAlert(this.id);}
      }
    }
    //-->
    </script>
    </head>
    <body>
    <select id="selID1">
      <option>fünf</option>
      <option>sechs</option>
    </select>
    <select id="selID2">
      <option>eins</option>
      <option>zwei</option>
    </select>
    <select id="selID3">
      <option>drei</option>
      <option>vier</option>
    </select>
    </body>
    </html>
    Ciao
    Quaese
     
    Vielleicht muss man manchmal vom Weg abkommen, um nicht auf der Strecke zu bleiben!
    ----
    Der "Fortsetzungsroman" auf www.leuteforum.de

    New kind to realize large scalable projects with jQuery: jQuery SDK

  3. #3
    Avatar von DataFox
    DataFox DataFox ist offline Mitglied Brokat
    Registriert seit
    Nov 2007
    Beiträge
    267
    Danke Dir für die Hilfe! Was mache ich, wenn per Ajax nachträglich ein Select in den Content geladen wird?

    Wenn ich den Code richtig verstehe, würde dieses neu hinzugeladene Element dann nicht erkannt bzw. es hätte den Eventhandler nicht. Oder?

    Kannste mir nen Tipp geben was man in so einem Fall tun müsste? Stehe gerade auf dem Schlauch. Glaube, eine Funktion welche alle 2 Sekunden aufgerufen wird und allen SELECT's den Eventhandler verpasst wäre unschlau, weil die anderen den Handler immer öfter bekommen. Oder?

    Danke
    Laura
     

  4. #4
    Quaese Quaese ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Feb 2004
    Beiträge
    3.440
    Hi,

    du kannst ja beim Durchlaufen der Selectfelder prüfen, ob sich im onchange-Handler bereits eine Funktion befindet. Nur wenn der Event noch nicht behandelt wird, weist du eine Routine zu.

    Hier der angepasste JS-Teil:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    function derAlert(objSel){
      alert(typeof objSel.onchange);
    }
     
    function setHandler(){
      // Select-Array mit allen Selectelementen erstellen
      var arrSel = document.getElementsByTagName("select");
     
      // Select-Array durchlaufen
      for(var i=0; i<arrSel.length; i++){
        if(typeof arrSel[i].onchange != "function"){
          // onchange-Event eine Funktion zuweisen
          arrSel[i].onchange = function(){ derAlert(this);}
        }
      }
    }
     
    window.onload = function(){
      setHandler();
    }
    Die Funktion setHandler kann jetzt auch aus der Ajax-Routine heraus aufgerufen werden, nachdem die neue Selectgruppe ins Dokument eingefügt wurde.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    // ... 
    xmlHttp.onreadystatechange = function () {
      if(xmlHttp.readyState == 4){
        if(xmlHttp.status == 200){
          // Neue Selectbox in ein Element mit der ID "newSel_01" einfügen
          document.getElementById("newSel_01").innerHTML = unescape(xmlHttp.responseText);
          setHandler();
        }
      }
    };
    // ...
    Vielleicht hilft dir das weiter.

    Ciao
    Quaese
     
    Vielleicht muss man manchmal vom Weg abkommen, um nicht auf der Strecke zu bleiben!
    ----
    Der "Fortsetzungsroman" auf www.leuteforum.de

    New kind to realize large scalable projects with jQuery: jQuery SDK

  5. #5
    Avatar von DataFox
    DataFox DataFox ist offline Mitglied Brokat
    Registriert seit
    Nov 2007
    Beiträge
    267
    Wow, danke!

    Wie ist das denn, wenn vorher schon eine onchange-Funktion durch ein andere Script oder inline notiert wurde?

    Kann man irgendwie abfragen welche Funktionen an einem Event hängen oder ausgelöst werden würden? Klingt etwas konfus...

    Danke
    Laura
     

  6. #6
    Quaese Quaese ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Feb 2004
    Beiträge
    3.440
    Hi,

    ist schon ein onchange-Handler notiert, würde das Selectelement nicht bearbeitet werden. Willst du eine schon vorhandene Funktion beibehalten, musst du sie "zwischenspeichern" und bei Bedarf zusätzlich aufrufen.

    Das könnte in Anlehnung an obiges Beispiel folgendermassen aussehen:
    Code :
    1
    2
    3
    4
    5
    
    arrSel[i].onchange_old = arrSel[i].onchange;
    arrSel[i].onchange = function(){
      this.onchange_old();
      derAlert(this);
    }
    Allerdings wird es zu Problemen kommen, wenn du diese Vorgehensweise häufiger in einem Element benutzt, da onchange_old später wieder auf onchange_old zugreifen will - das ist jedoch bereits überschrieben worden.

    Auf den Inhalt von Eventhandlern kannst du über ihren Namen und auf den enthaltenen String mit Hilfe der Methode toString zugreifen.
    Code :
    1
    
    alert(objSel.onchange.toString());
    Den String könntest du mit regulären Ausdrücken überprüfen, ob bekannte Funktionsaufrufe enthalten sind. Ich bin aber skeptisch, ob das jedoch zuverlässig arbeitet, da Funktiosaufrufe auch implizit ausgeführt werden können.

    Ciao
    Quaese
     
    Vielleicht muss man manchmal vom Weg abkommen, um nicht auf der Strecke zu bleiben!
    ----
    Der "Fortsetzungsroman" auf www.leuteforum.de

    New kind to realize large scalable projects with jQuery: jQuery SDK

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 19.04.10, 10:12
  2. Antworten: 2
    Letzter Beitrag: 12.10.09, 16:31
  3. Antworten: 2
    Letzter Beitrag: 25.06.08, 14:17
  4. Antworten: 2
    Letzter Beitrag: 13.11.04, 19:19
  5. "Anker" bei onChange-Event übergeben
    Von loddarmattheus im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 05.02.04, 17:51