Snippet: Tooltip mit Prototype JS
October 25th, 2008
Tags: codebeispiel, css, javascript, prototype, snippetTooltips.. die kleinen Text-Popups die einem helfen sich zu orientieren. Immer wieder gerne gesehen und wurde auch schon zig-mal programmiert.
Ich hab mir schon so einige fertige Scripts angesehen, aber die meisten machen einfach viel zu viel und nutzen teilweise sogar selber Prototype, nur leider nicht effizient genug.
Meistens werden die DIVs beim Aufruf der Seite generiert und irgendwo unterhalb des BODYs "versteckt". Bei sehr vielen Tooltips/Links kann das den Seitenaufbau extrem verlangsamen. Andere wiederum berechnen gott-weiss-was und haben einen mehrseitigen Umfang. Da oft gleich auch eine Klasse geschrieben wird muss man meist eine weitere Scriptdatei laden, was nochmals den Aufbau verzögert.
Ich schreibe daher meine Tooltips immer selber und bin mittlerweile runter auf 10 Zeilen. Könnte sogar in einer passen, aber man will ja nicht den Überblick verlieren.
-
$$('a[title]').invoke('observe', 'mouseover', function(evt){
-
var element = evt.findElement('a'), text = element.getAttribute('title');
-
var tooltip = new Element('div', {'class':'tooltip'}).update(text);
-
element.removeAttribute('title'); element.setAttribute('_title', text);
-
element.insert({'after': tooltip.setStyle({'left':element.positionedOffset().first()+'px'})});
-
}).invoke('observe', 'mouseout', function(evt){
-
var element = evt.findElement('a'), text = element.getAttribute('_title');
-
element.removeAttribute('_title'); element.setAttribute('title', text);
-
if (element.next().hasClassName('tooltip')) element.next().remove();
-
});
- Es wird OnMouseOver ein DIV kreiert mit dem Inhalt des TITLE Attributs eines Links. OnMouseOut wird das DIV einfach wieder entfernt.
- Damit das Browser Tooltip nicht zusätzlich angezeitg wird, verschiebe ich bis zum OnMouseOut den Inhalt des TITLE Attributs kurz in ein Fake-Attribut namens _TITLE.
- Der Selector
a[title]wählt nur Anker die auch wirklich ein TITLE Attribut haben. Somit brauchen wir auch nicht mehr zu kontrollieren ob eines vorhanden ist. - Vom Javascript aus wird nur LEFT gesetzt, TOP braucht man nicht zwingend.
- Am Ende von OnMouseOut prüfe ich ob das nächste Element wirklich die tooltip Klasse hat. Das ist nur eine reine Vorsichtsmaßnahme. Wer dennoch Probleme hat könnte etwas radikaler einfach alle DIVs mit dieser Klasse löschen via getElementsByClassName (ist am schnellsten).
Das nachfolgende CSS kümmert sich um den z-Index und den Abstand zum Cursor.
div.tooltip {
color: #000;
background-color: #FAFAFA;
position: absolute;
z-index: 9999;
padding: 5px;
margin: 5px;
margin-left: 15px; /* Abstand zum Zeiger */
}
So, und das war's. Wenn man nun irgendwo auf der Seite ein <a ... title="mein tooltip"> platziert hat man einen Link mit Tooltip. Zero config, wenn man so will.
Man kann natürlich auch ohne Probleme auf andere Elemente erweitern. Beispiel: $$('a[title], img[title]')...
Falls jemand Verbesserungsvorschläge hat: Immer her damit!
Script wurde in IE, FF und Safari getestet.


October 26th, 2008 at 01:20
January 31st, 2009 at 07:52
March 3rd, 2009 at 06:23
April 20th, 2009 at 10:51
June 13th, 2009 at 05:24
Ich möchte gern eure meinung auch mal teillen wenn ich mehr darüber wissen könte.Ich bin leider noch enfänger und habe einige diese script anzuwänden.
Ich benutzt ein französich cms(phpboost in lokal)was auch prototype und scriptaculous.Ich bin mir nicht über meine syntax sicher um ein toolbox zu erzeugen!
June 13th, 2009 at 05:25
Cordialement
Eric.H
June 27th, 2009 at 20:47
it will be nice if there is a way to show HTML text in the tooltip (for example, a link to further details page, or multiple links to help topics )
August 8th, 2009 at 10:42
Viele Grüße
September 1st, 2009 at 02:44
September 21st, 2009 at 02:02
Vielen dank!
Grüßle
Klara
September 24th, 2009 at 07:32
genau so etwas suche ich! wie genau muss ich dass einbinden? Habe Prototype 1.6 und deinen Javascript code im tag eingebunden. Das stylesheet im tag. Nur es passiert nichts wenn ich über den mit der maus fahre..
Bye,
Tim