Fast jede Web-Anwendung bietet den Usern die Möglichkeit, die eigenen Daten auf einer Profilseite zu bearbeiten. Mit JavaScript und CSS kann man diesen Vorgang angenehmer gestalten, indem man das Eingabeformular durch Stil und Swoosh-Effekte aufhübscht.
Dabei sollte aber auch beachtet werden, dass JavaScript und CSS nicht immer aktiviert sind - das Formular sollte also auch funktionieren, wenn beides ausgeschaltet ist.
In dieser Tutorial-Reihe werden wir Schritt für Schritt ein User-Formular mithilfe der MooTools veredeln. Der sich daraus ergebende Code sollte möglichst wiederverwendbar sein. Den Anfang machen wir mit den Passwort-Feldern.
Passwörter sind für User sehr wichtig: sie schützen die eigenen Daten vor unbefugtem Zugriff. Bei der Bearbeitung der Daten wird das Passwort jedoch in den meisten Fällen nicht geändert - es hat also keinen Sinn, die entsprechenden Felder jedes Mal anzuzeigen. Stattdessen wollen wir das Formular so einrichten, dass die Felder erst auf Anfrage angezeigt werden; so wird das Formular schlanker und der User muss sich keine Gedanken darüber machen, ob er die Felder jetzt ausfüllen muss oder nicht.
Das fertige Ergebnis findet sich hier.
Wir werden mit dem folgenden Formular arbeiten:
Damit wir später per JavaScript auf die zu versteckenden Elemente zugreifen können, schließen wir sie in ein Container-Element ein (”password-container”). Damit sind die Vorbereitungen auf HTML-Seite bereits vollendet. Auch mit ausgeschaltetem JavaScript kann der User das Formular ohne Probleme verwenden.
Das dazugehörige CSS sieht folgendermaßen aus:
body {
margin: 2em auto;
width: 50em;
}
div.row {
margin-bottom: 1em;
clear: both;
}
label {
width: 12em;
display: block;
float: left;
text-align: right;
margin-right: 1em;
white-space: nowrap;
font-weight: bold;
}
Für die Verarbeitung der Passwort-Felder ergibt sich dieser Workflow:
Um die Wiederverwendbarkeit dieses Features zu gewährleisten, setzen wir die Funktion in einer konfigurierbaren Klasse um. Beim Instanziieren eines neuen Objekts wird ein Konfigurations-Objekt übergeben, das alle benötigten Informationen enthält, um dieses oder andere Formulare um die Möglichkeit bereichert, einen Bereich beim Aufruf der Seite auszublenden und ihn per Klick auf einen Link wieder einzublenden
In diesem Fall ist dies unser Konfigurationsobjekt:
Und hier ist endlich die Klasse, die es mit dem Konfigurationsobjekt aufnehmen wird:
/**
* Constructor, is called when a new instance is created
*/
initialize: function(config) {
this.config = config;
// Prepare the form
this.prepareUserForm();
},
/**
* Prepares the user form
*/
prepareUserForm: function() {
// Hide password container
var elFrm = $(this.config.frm);
var elPwdContainer = elFrm.getElements(this.config.passwordContainer)[0];
// Abort if elPwdContainer is not available
if (!elPwdContainer) {
return;
}
// Add the div that contains the “Change password” link
var aChangePasswordID = ‘a_change_password’;
var divChangePassword = new Element(’div’, {
‘class’: this.config.divChangePasswordClass,
‘html’: ‘
‘ + this.config.showPasswordLabel + ‘
‘
}
);
// Insert the div
divChangePassword.injectAfter(elPwdContainer);
// Hide the password container
var fxPwdContainer = new Fx.Slide(elPwdContainer);
fxPwdContainer.hide();
// Observe “Change password link”
var aChangePassword = $(aChangePasswordID);
aChangePassword.addEvent(’click’, function(e) {
var e = new Event(e);
e.stop(); // Prevents the link from being executed
// Create the slide effects
var fxPwdContainer = new Fx.Slide(elPwdContainer);
var fxPwdLink = new Fx.Slide(aChangePassword);
// Chain the effects: slide out the “Change password” link, then slide in the password container
fxPwdLink.slideOut().chain(function(){fxPwdContainer.slideIn()});
});
}
});
Zum Schluss führen wir noch alles zusammen, denn im Moment stehen die einzelnen Komponenten noch einzeln da und bewirken gar nichts. In den <head>-Bereich der HTML-Datei kommen nun die Aufrufe, um die Klasse nach dem Seitenaufruf auf das Formular anzuwenden:
Und so sieht das fertige Ergebnis aus.
Über Verbesserungsvorschläge und sonstige Rückmeldungen freue ich mich natürlich - die Kommentare stehen euch offen!