okNotify - kleine Nachrichtenfenster mit jQuery

Nachdem ein Kollege auf der Arbeit ein Projekt mit "pNotify" veredelt hatte, war ich auch für Yogalehrer-Online an solch einer schicken Möglichkeit der Nachrichtenübermittlung an den User interessiert.
Ein "Notifier" ersetzt im Prinzip die Standard Javascript alert()-Funktion. Der Alert ist unglaublich praktisch zu programmieren (ein klassischer Einzeiler), sieht hässlich aus und man muss ihn erst anklicken, bevor man weitermachen kann. Er stört. Außerdem sieht er je nach Browser anders aus, ein Grauen für Webdesigner.
Deshalb hatte ich bei Yogalehrer-Online bisher die Meldungen als Extra-Div an der Stelle, an der sie auftraten, in die Seite geschrieben. Das hat den Vorteil, dass niemand warten oder irgendwo draufklicken muss. Es hat den Nachteil, dass die Seite für immer mit der Nachricht verhunzt ist. Na ja, ich hatte eine jQuery-onclick-Funktion draufgelegt, aber wer kommt schon auf die Idee, so eine Meldung wegzuklickern? Außerdem wurde aufgrund der manchmal recht langen Seiten die Meldung ganz oben ausgegeben, aber nach dem Neu-Laden der Seite (z.B. nach dem Speichern) wurde per #hash ganz nach unten gesprungen - die Meldung wurde gar nicht bemerkt.
Die diversen Benachrichtigungs-PlugIns für jQuery beheben das Problem in gefälliger Weise:
- Sie lassen unterschiedlich gestylte Nachrichten zu. (einige)
- Die Nachrichten gehen nach einer einstellbaren Zeit von selber weg.
- Die Nachrichten stören den Bildaufbau der Seite nicht. (meistens)
- Sie holen den User da ab, wo er steht, erscheinen also im Sichtbereich des Fensters.
Also machte ich mich auf die Suche und fand ein kleines, schickes Teil: Den Notifier. Nach der Anpassung des Javascripts auf Yogalehrer-Online (lila Basismeldung und ein paar andere Sachen) war ich sehr zufrieden. Ich stellte alles online und war zwei Tage lang von mir begeistert. Bis ich die Seite im IE aufrief: Kein Notifier. Nichts. Nur das kleine, gelbe Warndreieck unten links in der Ecke: Javascript kaputt. Der Versuch der Reparatur klappte soweit, dass irgendwann das Warndreieck weg war und im IE einer von drei erwarteten Notifys oben links (anstatt oben rechts) in der Ecke angezeigt wurde. Er wurde allerdings nur halb angezeigt, horizontal in der Mitte war er abgeschnitten. Das reichte.
Mir war klar, dass der Fehler bei mir lag: Ich hatte alles mit dem Firefox getestet und entwickelt. Der Firefox ist aber absolut ungeeignet für Entwicklung: Mit dem Firefox klappt meistens alles. Und es gibt tolle Plugins, die die Webentwicklung unterstützen. Anscheinend sind die Entwickler diverser jQuery-Plugins ebenfalls dieser Meinung. Denn mittlerweile scheint es vielen Programmierern wurscht zu sein, ob die Sachen auch im IE laufen. Viele Plugins laufen entweder nur mit dem IE oder nur mit dem FF. Wenn man aber will, dass alles in beiden Browsern funktioniert, muss man eine ganze Weile suchen. Im Falle des Notifiers wäre das Desaster von Anfang an verhindert worden, hätte ich die Webseite des Herstellers mit dem IE besucht. Denn auch auf der Homepage vom Notifier funktioniert es auch nur mit dem FF. Und im IE kommt nach ein paarmal Klicken unten links ein gelbes Warndreieck, aber kein Notify...
So machte ich mich also erneut auf die Suche nach einem schicken Meldungs-Plugin. Diesmal wurde zur Ermittlung eines würdigen Kandidaten nur mit dem IE gesurft. Heute morgen um 04:30 Uhr war der Probant ermittelt:
OkNotify von OkBreathe.
Er war der einzige, der unter IE und FF lief und dabei den eigenwilligen Seitenaufbau von YO nicht störte. Außerdem waren nicht alle Meldungen schwarz, man konnte sie auf einfache Weise bunt gestalten (Fehler rot, Erfolg grün usw.). Viele Pluginentwickler finden "schwarz" toll, weil es auf dem Mac einen "Growl"-Notifier gibt. Den muss man als Mac-User natürlich fürs Web nachbauen. Aber Schwarz macht mich irgendwie müde, ich will es bunt haben.
Was mich am OkNotify störte:
- Kein Stop der Ablaufzeit beim Überfahren der Meldung mit der Maus.
- Häßliches Text-"X" als Schließknopf.
- Das "X" musste genau getroffen werden, um die Meldung zu schließen, ich wollte aber per Klick auf die Meldung selbst die Nachricht weghauen können.
- Der FF macht "runde Ecken" (gaaaaaanz wichtig! Das neue CSS3 scheint sich hauptsächlich mit runden Ecken und Rahmengestaltung zu befassen.)
- Der FF macht einen Schatten unter die Meldung.
- Der IE macht beides nicht. Er hat eckige Ecken und keinen Schatten.
Also mussten 3 Dinge noch getan werden, um den okNotify YO-tauglich zu machen:

1. Stop des Timeouts bei MouseOver
Hier wird im Prinzip der Timer gelöscht und beim Verlassen des Objekts wieder neu gestartet. Damit man einen Timer zum Löschen hat, muss man sich das von setTimeout zurückgelieferte Handle merken. Ich kam zum Schluss, mir das Handle im "opts-Array" zu merken.
Es gibt also eine neue Option: timeoutid.

An einer Stelle im Quelltext des Plugins wird überprüft, ob opts.stay "false" ist. Mit "stay" wird festgelegt, ob die Meldung nach einer gewissen Zeit von alleine wieder verschwindet. Ist "stay" gleich "true" dann bleibt die Meldung sowieso stehen. In den bereits vorhandenen IF-Zweig, der "stay" auf "not true" überprüft (!opts.stay) baue ich die Änderungen ein.
Änderungen im Zweig "if(!opts.stay)" (s. Bild):
- Entgegennahme des Timeout-Handles in opts.timeoutid
- Einbau der Hoverfunktion, die mit clearTimeout das Handle löscht und nach dem Mouseout ein neues Handle zurückschreibt.

2. X austauschbar gestalten
Als erstes wird wieder das opts-Array um einen Konfigurationswert erweitert: Diesmal heißt er "closetext". Als Vorgabe wird ein großes "X" eingetragen. (s. Bild 2, hier wird "closetext" mit dem Wert "timeoutid" zusammen eingekringelt).
Mit der Zeile
$('.ui-notification-close', $notice).html(opts.closetext);wird im Link mit der Klasse "ui-notification-close" der Notiz der bereits vorhandene Text "X" durch den Inhalt aus "opts.closetext" ersetzt. Eigentlich könnte man anstelle der jQuery-Funktion "html()" auch "text()" verwenden, aber wenn man ein Bild einbauen möchte, dann ist das kein Text, sondern eine HTML-Anweisung.

3. Klick auf Meldung macht sie zu
Obwohl diese Aufgabe eine der einfacheren scheint, ist es mir nicht gelungen, den Klick auch für den IE zu realisieren. IE-Nutzer müssen im Moment noch genau zielen, um die Notizen vorm Timeout abzuschießen. Vermutlich liegt der Hund in der Benutzung der Variable $notice begraben. Wie auch immer, die Änderung funktioniert im FF problemlos.
Nachdem die Änderungen vorläufig abgeschlossen waren, musste nur noch das CSS angepasst werden. Leider funktionieren die okNotifys "out-of-the-box" nur dann, wenn beide CSS-Dateien, die im Paket mitgeliefert werden, eingebunden sind. Die Datei "screen.css" ist notwendig und zerhaut erstmal gründlich all das, was man selbst als "Design" der Webseite angerichtet hat. Deshalb habe ich die wenigen, notwendigen Teile von screen.css in der Datei jquery.okNotify.css integriert.
Links:
Originalversion von okBreathe:
Webseite des Herstellers okBreathe
Demo
Download tar.gz - Paket vom Hersteller
Version von Yogalehrer-Online:
jquery.okNotify.css (enthält Teile von screen.css)
jquery.okNotify.js (ungepackte Version zum Entwickeln, Ändern)
jquery.okNotify.min.js (gepackte Version für den Betrieb)
Disclaimer:
okNotify ist nicht von Peter Klauer entwickelt. Es wird empfohlen, das Plugin nur von der Webseite des Herstellers zu beziehen. Der Artikel bezieht sich auf den Entwicklungsstand des Plugins zum 5. März 2011. Je älter dieser Artikel wird, um so wahrscheinlicher ist es, dass die hier vorgeschlagenen Änderungen in der gleichen oder besserer Weise im Original-Plugin realisiert wurden.
Labels: Javascript, jQuery, Notizen, okNotify, Popups
