« Konfiguration von Apache für viele Subdomains bei WordPress MU Adapter Pattern als Antipattern »

Eventhandler im JavaScript mit dem HTML Dokument verknüpfen

17. April 2009 Roland

Dieser Artikel ist Teil 25 von 26 der Artikelserie Programmieren

Als ich mit JavaScript angefangen habe, wäre ich beinahe an der Variablengültigkeit verzweifelt.
Folgende Problemstellungen wollte ich lösen:

Im Source-HTML kein JavaScript

Ich wollte, dass meine JavaScript Befehle im HTML nicht eingetragen werden müssen.
Das bedeutet, dass keine onblur, onkeypressed oder sonst was für Attribute in den HTML Elementen hart reingeschrieben werden sollten.
Also las ich die Grundlagenbücher und Grundlagenbeschreibungen im Internet und erkannte, dass ich beim Laden der HTML-Seiten meine JavaScript Trigger ins HTML Dokument einschreiben kann.
Meine lieben Webdesigner bekommen ihr geliebtes HTML und müssen sich dann nur noch an unsere Namenskonventionen für IDs halten.
Beide Personengruppen (Hacker und Designer) sind voneinander getrennt und glücklich.
Ich konnte meine Events also als nachträglich reinfummeln.
Beispiel:

/**
  1.  * Erstellt im HTML-Dokument die nötigen Eventhandler und initialisiert den Controller dieser Webappliaktion.
  2.  */
  3. function onload(){
  4.     controller = new PrototypController(this.document);
  5. }
  6.  
  7. /**
  8.  * Der Controller, der die Aktivitäten innerhalb unserer Webapplikation steuert.
  9.  * Im Konstruktor werden die Eingabefelder des HTML Dokuments mit den notwendigen onblur-Events ausgestattet.
  10.  */
  11. function PrototypController(document){
  12.     this.document = document;
  13.     var inputName = document.getElementById("name");
  14.     inputName.onblur = this.onBlurHandlerName;
  15.     // Beim Event wird das betroffene HTML-Element übergeben. Dieses HTML Element muss eine Referenz auf
  16.     // unseren Controller erhalten. Ans onsten können wir keine Verknüpfung zwischen der Oberfläche und dem Modell erreichen.
  17.     inputName.controller = this;
  18.  
  19.     var inputFirstName = document.getElementById("firstname");
  20.     inputFirstName.onblur = this.onBlurHandlerFirstName;
  21.     inputFirstName.controller = this;
  22. }
  23.  
  24. /**
  25.  * Implementation der benötigten EventHandler.
  26.  */
  27. PrototypController.prototype={
  28.     onBlurHandlerName:function(){
  29.         // Von der Referenz auf den Controller das Dokument und das Personenobjekt laden.
  30.         var document = this.controller.document;
  31.         var value = (this.value) ? this.value : "Kein Name";
  32.         message = document.getElementById("message_name");
  33.         message.innerHTML = value;
  34.     },
  35.     onBlurHandlerFirstName:function(){
  36.         var value = (this.value) ? this.value : "Kein Name";
  37.         var document = this.controller.document;
  38.         message = document.getElementById("message_firstname");
  39.         message.innerHTML = value;
  40.     }
  41. }

Im HTML Dokument lade ich diese JavaScript Datei und rufe die onload() Funktion auf.
Diese Funktion erstellt mir ein Controller Objekt. Der Controller (PrototypController) füllt in die input-Felder name und firstname die onblur Attribute ein. Weiterhin wird dem jeweiligen Eingabefeld die Referenz auf den PrototypController mitgegeben.
Das ist sehr wichtig.
Wenn der onblur (also das Verlassen des Feldes Event) aufgerufen wird, wird eine der Methoden des PrototypController aufgerufen.
Zum Zeitpunkt des Aufrufes stehen wir jedoch im Input-Feld. Somit ist “this” auch das Input Feld.
Wenn wir nun auf andere Element im Dokument verweisen wollen, benötigen wir eine Referenz darauf.
Das habe ich mit dem Verweis auf den Controller erledigt. Dieser beinhaltet einen Link auf das Dokument und kann somit die message-Elemente liefern.
Mich hat das Stunden gekostet, bis ich endlich begriff wo mein Aufruf eigentlich herkommt.
Die onBlurHandlerXXX Methoden sind Callback Funktionen. Das bedeutet, dass beim Aufruf nicht aus dem window oder document oder sonst wo her aufgerufen wird, sondern aus dem jeweiligen Input Element.
Überlege dir bitte wirklich genau, von wo dein Aufruf in deinem JavaScript- HTML DOM Konstrukt erfolgt. Ansonsten hast du plötzlich “undefined” Objekte und keine Ahnung warum das so ist.

Seriennavigation«Auch bei JavaScript immer die Variablen sauber deklarieren Objekte in JavaScript mit JSON deklarieren»
Merken und weiterempfehlen Diese Icons verlinken auf Bookmark Dienste bei denen Nutzer neue Inhalte finden und mit anderen teilen können.
  • Technorati
  • Wikio DE
  • Webnews
  • MisterWong
  • Y!GG
  • Digg
  • del.icio.us

Artikel mit ähnlichen Schlagwörtern

Der Beitrag wurde am Freitag, den 17. April 2009 um 07:53 Uhr veröffentlicht und wurde unter Programmieren abgelegt.

Dir gefiel der Artikel? Dann abonniere doch den RSS Feedrss

Du kannst die Kommentare zu diesem Eintrag durch den RSS 2.0 Feed verfolgen. Du kannst einen Kommentar schreiben, oder einen Trackback auf deiner Seite einrichten.

...deine Chance den ersten Kommentar zu schreiben... ;-)

Schreibe mir

Kommentare abonnieren ohne selbst zu kommentieren

zum Seitenanfang