2 3 6 24 0 0 0

Event-Handler

Ereignisbehandler stellen ein Bindeglied zischen HTML und JavaSript dar. Als Verweisattribute, in Formularen in input-Elementen oder in Klick-Buttons haben diese lange Eingang gefunden. Alle Elemente sollen allerdings nicht geeignet sein. Na, schaun mer mal!
Ich werde mich nur mit onclick, onmouseover, onmouseout, onmousedown und onmouseup beschäftigen.

Klickt diesen Textabsatz an für das 1. Beispiel!

Aber irgendwie ist das schon blöde, darauf hinzuweisen, dass man da irgendwo hinklicken soll. Das muss besser gehen. Indem im 2. Beispiel ein Satzteil oder Begriff optisch anders hervorgehoben wird, wie Legende oder so. Und das mach mer erstmal mit CSS einschließlich :hover für die Wortgruppe.

CSS-Definitionen:

15
16
em:hover {text-shadow: 0 -1px 6px #fff, 1px 0 6px #fff, 0 1px 6px #fff, -1px 0 6px #fff;  ; }
em:hover::after { content: "(*) na geht doch! Nun musste auch klicken!" }

JavaScript Funktion:

29
30
31
32
33
<script>
function WATT(cl_elem, zahl, text) {
cl_elem.innerHTML = "<b>"+zahl+". Beispiel</b><br />"+text ; 
}
</script>

Zwei Absätze und die Elementverarbeitung für JavaScript:

43
44
45
46
47
48
49
 Klickt diesen Textabsatz an für das 1. Beispiel! </p>
 <p>Aber irgendwie ist das schon blöde, darauf hinzuweisen, dass man da irgendwo hinklicken soll. 
 Das muss besser gehen. Indem im 2. Beispiel ein <em onclick="WATT(cl_elem, 2, 'aus diesem em-Tag')" 
 onmouseover="WATT(cl_elem, 2, 'Na los!')" onmouseout="WATT(cl_elem, 2, 'Alles klar?')"
  style="cursor:pointer;" >
 Satzteil oder Begriff</em> optisch anders hervorgehoben wird, wie Legende oder so. 
 Und das mach mer erstmal mit CSS einschließlich <code>:hover</code> für die Wortgruppe.</p>

Jetzt folgt nur noch: onmousedown und onmouseup. Irgendwie werde ich den Gedanken nicht los, dass das alles auch mit CSS geht (solange die Änderungen Bezug auf das eigenen Element nehmen), aber auf der Seite sollen einige Event-Handler betrachtet werden. Und dazu kommen nun diese zur Anwendung.

Wo ist das denn, Venedig?

Elemente und JavaScript:

77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<figure>
<img src="../images_themen/Skyline.png" width="870px">
<figcaption style="cursor:pointer;">Wo ist das denn, Venedig?</figcaption>
</figure>
</p>
<p onmousedown="this.value='Zur Erinnerung!<br />Hochwasser in Schönebeck an der Elbe im Juni 2013'"
   onmouseup="this.value = 'Damit ist das geklärt!'" > 
</p>
<script>
var opac = 1, bis = 0, wieoft = 0 ;
function AufAnfang(){
 spruch.style.opacity = opac ;
 bis++ ;
 if ( bis < 25 ) opac = opac - .05 ;
 else  {
 opac = opac + .05 ;
 if ( wieoft <= 2) spruch.innerHTML = "Das ist nicht Venedig oder? " ;
 if ( wieoft == 3) spruch.innerHTML = "Nee isses nich! " ;
 if ( wieoft > 3) spruch.innerHTML = "Das ist in Schönebeck!" ;
 }
 if ( bis <= 50 ) setTimeout(AufAnfang, 100) ;
}
var spruch = document.getElementsByTagName("figcaption")[0];
spruch.addEventListener('mousedown', mouseDown);
spruch.addEventListener('mouseup', mouseUp);
function mouseDown() {
  spruch.innerHTML = 'Zur Erinnerung!<br />Hochwasser in Schönebeck an der Elbe im Juni 2013.';
}
function mouseUp() {
 spruch.innerHTML = 'Damit ist das geklärt!';
 bis = 0 ;
 opac = 1 ;
 wieoft++ ;
 setTimeout(AufAnfang, 5000) ;
}
</script>

Hinweise: </p> in Zeile 81 endet das p-Tag, das auch <figure> und <figcaption> einschließt. Den Textabschnitt auf dem Bild wollte ich nicht noch einmal abbilden.

Es folgen einige Beispiele, die ich Ausführungen von Walter Zorn entnehme und an dieser Stelle wärmstens weiter empfehle.
Es handelt sich um Informationsboxen, die, wenn man so will, etwas erläutern oder darstellen können.
Ich zitiere aus der Kurzbeschreibung mit enthaltenen Tool-Aktionen:

Das Aussehen und Verhalten eines solchen mit wz_tooltip.js erzeugten Tooltips können Sie auf vielfältige Weise konfigurieren. Die Standard-Einstellungen für alle Tooltips können in der JavaScript-Datei selbst geändert werden (Abschnitt GLOBAL TOOLTIP CONFIGURATION). Mit Kommandos lassen sich Tooltips individuell konfigurieren.
Darüberhinaus gibt es Erweiterungen (Plugins) (oder schreiben Sie sich Ihre eigenen!) mit weiteren Optionen zum Konfigurieren der Tooltips.
Als weitere Besonderheit kann diese Tooltip-DHTML-Bibliothek beliebige HTML-Elemente dynamisch in Tooltips verwandeln. Da solche HTML-Seiteninhalte im Gegensatz zu JavaScript-Strings suchmaschinen-relevant sind, können Sie also wirklich wichtige Inhalte in Tooltips verpacken. Siehe Dokumentation.

Ich habe im Zitierten nichts geändert, also sind auch die Anker nicht angepasst. Ich habe alles so stehen lassen. Ein Unterschied besteht allerdings: (Asterix) und (Ausrufezeichen) machen sich bereits hier bemerkbar, dazu später.
Leider ist Herr Zorn bereits verstorben. Rückfragen also nur über den HERRN! Na gut, ich bin Atheist, also selbst herausfinden, wie man das an eigene Bedürfnisse anpasst. Der Code ist gut aufgeräumt und kommentiert, so dass ich fast alles verstehe. Es erscheint einem nur riesig, weil die Menge an Auswahlmöglichkeiten dies erfordert. Somit werde ich hierfür keinen Quellcode abbilden. Das ist alles nachzulesen, weil die Familie seine Arbeit weiterhin im Netz stehen läßt. Danke!

Ich nehme mir somit vor, für Beschreibungen, die sich auf bereits vorhandene Erklärungen bei mir beziehen, eine solche Informationsbox nachzubauen. Ohne bis in die letzte Ecke alles verstanden zu haben, versuche ich mein Glück. Ideen sind genügend vorgelegt!

Aus der Auswahl nehme ich mir eine Variante vor. Die Sprechblase ist ganz lustig, wird aber aus mehreren kleinen gif-Bildern zusammengesetzt, um die Höhe an den Inhalt anpassen zu können. Ich möchte das Aussehen mit CSS umsetzen. Die Steuerung natürlich über die Event-Handler onmouseover und onmouseout. Zu erst aber die CSS-Eigenschaften der InformationsElemente.

CSS-Definitionen 'seiten.css' (BoxGestaltungen):

37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
.anker { color: mediumblue; text-decoration: none; }
a[name] { color: mediumblue; text-decoration: none; } /*alternativ */
/* Die InfoBox */
#infobox { font-family: arial; z-index: 5; }
/* Bereich der InfoBoxen */
.infobox { font-size: 13.5px; background-color: powderblue; 
  width: 240px; z-index: 3;  
  padding: 4px 6px 4px 8px; border-color: white navy navy white; border-style: solid; 
  border-width: 24px 1px 1px; border-radius: 0 0.8em 0.8em; 
  box-shadow: 6px 6px 8px rgba(50, 50, 80,.6) ;
  -ms-hyphens: auto; -moz-hyphens: auto; -webkit-hyphens: auto; -o-hyphens: auto; hyphens: auto;
  }
.infoboxtitel { color: white; font-size: 15px; font-weight: bold; background-color: navy; 
  position: absolute; top: -23px; left: 0; width: calc(100% - 8px); height: 21px; 
  padding-top: 2px; padding-left: 8px; border-radius: 0 0.8em 0 0; 
  }
/* die Schließbox closer mit dem Zeichen: X ist ein frei definiertes Element*/
closer { position: absolute; top: 2px; right: 1px; background-color: #cf161a;
  width: 16px; height: 18px; padding-top: 1px; padding-left: 4px; border-radius: 0 0.6em 0 0; 
  } 
closer:hover { background-color: #f00; }
#infobox closer > a { color: white; font-weight: bold; text-decoration: none; }
#infobox closer > a:link { color: white; font-weight: bold; text-decoration: none; }
#infobox closer > a:visited { color: white; font-weight: bold; text-decoration: none; }
#infobox closer > a:focus { color: white; font-weight: bold; text-decoration: none; }
#infobox closer > a:hover { color: white; font-weight: bold; text-decoration: none; }
#infobox closer > a:active { color: white; font-weight: bold; text-decoration: none; }
#infobox a[href]::after { font-weight: normal; content: '' }

/* alternative Klassen für Infoboxen zum überschreiben */
.boxrg { background-color: yellow;  border-color: white red red white; }
.boxtrw { color: white; background-color: red; }
.boxtrg { color: yellow; background-color: darkred; }
 /* bei Bedarf weitere hinzugefügten */
.boxlt { font-size: 13px; color: SaddleBrown; background-color: Cornsilk;

Das ist erledigt, nun muss der JavaScript-Code erzeugt werden. Das wird wesentlich weniger Schreibarbeit als die zuvor beschriebene, ich arbeite nur an einer Variante! Klar, Herr Zorn hatte ja gleich eine ganze Bibliothek erstellt. Dennoch können mit dem Aufruf des Event-Handlers onmouseover geänderte Eigenschaften nachgereicht werden. Solche Möglichkeiten will ich übernehmen.
Aber erst einmal eine Kontrolle. Ein Hinweis, der nicht über den rechten Rand hinausgehen soll, wird hier weit rechts platziert.
Nun zu (Asterix) * und (Ausrufezeichen !), die sollen bei mir wie eine Art Legende kundtun, was sich da verbirgt. Mit Asterix soll lediglich ein Hinweis gekennezeichnet sein und mit dem Ausrufezeichen ein Hinweis und eine Referenz, über die auf andere Inhalte verwiesen wird. Dazu muss bei <code>onmouseout</code>, um einen Verweis aktivieren zu können, die Box stehen bleiben. Hierfür müssen nun die Bedingungen formuliert werden. Bisher wurden nicht alle Argumente mit Inhalten an die Funktion übergeben.

Beispiel INFOKASTEN 1:

<a href="javascript:void(0);" 
 onmouseover="INFOBOX('INFOKASTEN 1', 
 'oberhalb des Mauszeigers positioniert und zentriert über der Maus, 
 wenn die Ränder nicht überschritten werden.', 1, '', '', '')"  
 onmouseout="BOXOUT(0, '')">Aber erst einmal eine Kontrolle</a>
		

Beispiel INFOKASTEN 2:

<a href="javascript:void(0);"
 onmouseover="INFOBOX('INFOKASTEN 2', 
 'oberhalb des Mauszeigers positioniert und zentriert, so die Ränder nicht überschritten werden.  
 Die Box wird durch die X-BOX geschlossen.', 2, '', '', 'ja')" 
 onmouseout="BOXOUT(2, 'ja')">hier weit rechts</a>
		

Ganz kurze Erklärung hierzu: Kommen auf einer Seite mehrere InfoBoxen zur Anwendung, müssen die IDs unterschieden werden. Jede InfoBox ohne Schließfenster erhält für das Event onmouseout die ID=0 und folgend ein leeres Argument. Mit Schließfenster wird die gleiche ID wie für onmouseover vergeben und das zweite Argument - „ja“, irgendwas.

Das reicht nicht mehr für weitere Anpassungen. Eine generelle Änderung an der Infobox sollte allerdings in den CSS-Eigenschaften vorgenommen werden respektive Farbanpassungen zum eigenen Layout.
Ich erachte es zwar nicht als sehr sinnvoll mit „Beckers Bunter Bühne“ für jeden Hinweis mit unterschiedlichen Einfärbungen daherzukommen, aber manches kann ja wichtiger sein als alles Übrige.
Argumente an die Funktion INFOBOX:

KopftextTiteltext
BeschreibungText
Eine IDZahl
CSS Box-KlasseKlassenname (überschreibt Eigenschaften) || ""
CSS BoxTitel-KlasseKlassenname (überschreibt Eigenschaften) || ""
X-Stringirgend was, um X zu aktivieren || ""

Argumente an die Funktion BOXOUT:

IDMit Schließbox: die gleiche wie INFOBOX, ohne : 0
X-String"irgend was, um X zu aktivieren" || ""

Damit läute ich das nächste Beispiel ein: Ein Verweis zum Ideengeber. Die Referenz wird lediglich mit einem Sprungziel versehen. Um nun einmal eine Farbänderung zu erzeugen, werden für die bisher leeren Argumente für Box und Boxtitel definierte CSS-Klassen in die Funktion INFOBOX übergeben. Das sieht dann so aus.

Beispiel 3: DER IDEENGEBER

 <a href="#zorn" 
 onmouseover="INFOBOX('DER IDEENGEBER', 
 'Auch wenn ich das alles etwas anders mache. Von <a href=#zorn>Herrn Zorn</a> kommt die Anregung hierfür. 
 Somit springt der Verweis zum Anker. ', 3, '', '', 'ja')" 
 onmouseout="BOXOUT(3, 'ja')">zum Ideengeber</a>
 

Der Absatz wird mit der CSS-Klasse "tips" versehen und befolgt wie in CSS-Definitionen 35 zu sehen das Setzen von (!), weil das Sprungziel <a href=#zorn>Herrn Zorn</a> angegeben ist.
Das 4. Beispiel stellt eine reine InfoBox dar, aber mit überschriebenen Klasseneigenschaften.

Beispiel 4: INFOBOX mit anderer Farbe

 <a href="javascript:void(0);" 
 onmouseover="INFOBOX('INFOBOX mit anderer Farbe', 
 'Andere CSS-Klasse, somit anderes Aussehen (arg:4 box_rg, arg:5 boxtitel_rw). 
 Die Schließbox brauchen wir hier nicht. ', 4, 'boxrg', 'boxtrw', '')" 
 onmouseout="BOXOUT(0, '')">so aus</a>
 

Nun stelle ich noch aus der externen CSS-Datei die Formung der Bereiche vor, die auf den Aufruf einer InfoBox hinweisen.

Externe CSS-Definitionen für Hervorhebung des Hinweises und Ankerbehandlung:

27
28
29
30
31
32
33
34
35
36
37
38
/* Element oder Inline-Bereich mit InfoTips */
.tips a { color: mediumblue; font-weight: bold; }
.tips a:link { color: mediumblue; text-decoration: none; }
.tips a:visited { color: mediumblue; text-decoration: none; }
.tips a:focus { color: mediumblue; text-decoration: none; }
.tips a:hover { color: darkblue; }
.tips a:active { color: violet; text-decoration: none; }
.tips a[href*="javascript"]::after { font-weight: normal; content: '(*)' }
.tips a[href*="#"]::after { font-weight: normal; content: '(!)' }
/* Ein a-tag, dass nur einen Ankernamen als Sprungziel enthält*/
.anker { color: mediumblue; text-decoration: none; }
a[name] { color: mediumblue; text-decoration: none; } /*alternativ */

Am Ende dieser Beschreibung noch 88 Zeilen des JavaScriptes. Nicht alles entspricht den Bedingungen wie sie von Herrn Zorn vorgegeben sind. Das war auch nicht mein Ziel. Ein Ansatz zur Nachempfindung von InfoBoxen ist, so hoffe ich, gegeben.

Die JavaScript-Datei:

00
01
02
03
04
05
06
07
08
09
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/* tip.js für Informationsboxen */
var obj_ibox = document.getElementById("infobox"); 
var mausx, mausy, zx, rechts ;
var zentral = document.getElementById("zentrale") ;
var myHead, myHeadText, myBox, s_box, s_link ;
var bisda = 40 ; //Einzug rechter Rand
var BoxH , currentId ;

function POSITION (event) {
mausx = document.all ? event.offsetX : event.pageX;
mausy = document.all ? event.offsetY : event.pageY;
zx = zentral.offsetLeft ;
mausx = mausx - zx ;
}
document.body.onmousemove = POSITION;

var elh, elw, elex ;
function BOXPOSIT(elem, x, h){
 elh = elem.offsetHeight ;
 elw = elem.offsetWidth ;
 rechts = zentral.offsetLeft+zentral.offsetWidth-(elw/2)-bisda  ; 
 
 if ((elw/2) <= x && x+elw <= rechts-bisda ) {
  x = zentral.offsetLeft +mausx -(elw/2) ;
 } else{
  if ( x < (elw/2) ) { 
  x = zentral.offsetLeft+5 ;
  }
  if ( x+elw > rechts-bisda ){
  x = rechts -(elw/2); 
  }
 }
 return [elh, x, elw] ;
}
// aus dem VerweisElement
function BOXOUT(id, close){
 if( close == '' ){ 
 var obj_ibox = document.getElementById("infobox"); 
 obj_ibox.innerHTML = "";
 }
}
//aus der SchließBox
function BOX_OUT(){
 var obj_ibox = document.getElementById("infobox");
 obj_ibox.innerHTML = "";
 currentId = 0 ;
}

function INFOBOX(){
// argumente: head, text, id, classeBox, classeKopf, ref 
 if (currentId != arguments[2] || arguments[5] == ''){
 // falls InfoBox mit X-String noch nicht geschlossen wurde
 BOXOUT(currentId, '') ;
 myBox = document.createElement("aside");
 myBox.innerHTML = arguments[1] ;
 myHead = document.createElement("section");
 myHeadText = document.createTextNode(arguments[0]);
 myHead.className = "infoboxtitel "+arguments[4] ;
 myBox.appendChild(myHead);
 myHead.appendChild(myHeadText); 
 myBox.className = "infobox "+arguments[3] ; 
 myBox.style.position = "fixed" ;
 myBox.setAttribute("id", arguments[2]);
 myBox.setAttribute("z-index", "5");
 // wenn eine Schließbox aktiviert werden soll 
 if( arguments[5] != '' ) {
 // createElement("closer") für ein erfundenes Element
  s_box = document.createElement("closer") ;
  s_link = document.createElement("a");
  s_link.setAttribute("href", "javascript:BOX_OUT()") ;
  s_link.appendChild(document.createTextNode(" X ")); 
  s_box.appendChild(s_link); 
  myHead.appendChild(s_box);
 } 

 currentId = myBox.getAttribute("id") ;
 var obj_ibox = document.getElementById("infobox");
 obj_ibox.appendChild(myBox);
 
 BoxH = myBox.offsetHeight ;
 var masze = BOXPOSIT(myBox, mausx, BoxH);
 // -15 ist Abstand zum MausZeiger, masze[0] ist Boxhöhe
 myBox.style.top = ( mausy -15 -masze[0] )+"px" ;
 myBox.style.left = ( masze[1])+"px" ;
 } 
}

/* Event onclick für das Eltern-Objekt zentral als Alternative*/
zentral.addEventListener("click", BOX_OUT);
/* bewirkt, dass auch ein Klick für eine fixierte InfoBox mit Schließbox X */
/* auch außerhalb X ein Schliessen auslöst. */

Ach so, ja: Auch wenn mittels createElement() Kindelemente erzeugt werden, auf ein bereits vorhandenes muss zugegriffen werden können. Dem Objekt obj_box werden in 77 alle Kindelemente zugefügt. Das Element mit der ID="infobox" muss vor der Ausführung des Scriptes als auch den Referenzierungen extistent sein.
In 57 und 60 werden den obligatorischen Klassennamen weitere mögliche Definitionen zugefügt (Beispiel 4).
Zum Schluss noch ein alternatives Schließen außerhalb der SchließBox X in 88.




Dokument geändert am: 01. Okt. 2016 19:50