Florians Forum » Webmaster » Xobor (Homepagemodules & Dynamicboard) » Funktionen & Template » Spoiler-Button (Update)

JavaScript muss aktiviert sein, damit die Funktion ausführbar ist.
(Erklärung zum Spoiler-Button)
Zuerst muss unter Admin -> Layout -> Header & Footer folgender Quelltext im Header eingefügt werden:
function spoil(me) {
if (me.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') {
me.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = '';
me.innerText = '';
me.value = 'Hide';
} else {
me.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none';
me.value = 'Show';
}}
</script>
Anschließend wird unter Admin -> Einstellungen -> Codes/Smilies in den Feldern unter "Hinzufügen eines neuen Forumcodes" der neue Foren-Code
Zuletzt wird unter Admin -> Einstellungen -> Symbol-Bar die Symbol-Bar ergänzt, damit auch die Foren-Mitglieder die Funktion nutzen können.
Dazu einfach an geeigneter Steller diese Zeile einfügen:
z.B. direkt über:
Spoiler in Aktion:
versteckter Text

Hallo.
Habe ein Problem mit dem Spoiler-Button und den "Auflistungszeichen" <li> + </li>.
In meinem Forum habe ich diese Zeichen (Auflistungspunkte) in den Forum-Code umgesetzt.
Werden diese Auflistungszeichen im Spoiler verwendet, verschwindet der Abschluß-Button nach dem Anklicken, auch wenn der Spoiler wieder geöffnet wird.
Wird die Seite neu aufgerufen, ist er wieder da.
Weist Du hier weiter?
Gruß
Wolfgang

Also ich habe das mal mit der HTML-Variante in meinem Test-Thread probiert.
Hier auch mein Code:
<ul>
<li>Test</li>
<li>Test</li>
<li>Test</li>
</ul>
[/spoiler]
Bei mir verschwindet der Button nicht, auch nicht im IE, falls dies nur dort aufgetreten ist.
1. Welcher Browser hat den Fehler gemacht? IE, Firefox, ... oder alle?
2. Waren auch die ul-Tags einegfügt, bzw. auch als Foren-Code verfügbar?
Bei SelfHTML ist der Aufbau einer Liste nochmals nachzulesen.
Sollte dies alles überprüft worden sein, hier noch eine Alternative:
Meine erste Anfrage ging direkt mal in's Support-Forum.
Da die Antwort aber sehr simpel ist, habe ich noch ein wenig weiterprobiert. Das im Support-Forum ist also nicht mehr 100% aktuell.
Im Moment habe ich ein paar Funktionen in der Test-Phase. Diese gehört z.B. auch dazu. Gravierende Fehler habe ich bisher nicht entdecken können. Deshalb stelle ich diese kurze Anleitung hier und jetzt schonmal zur Verfügung. Eine extra Anleitung könnte demnächst folgen.
Eine Beispiel-Liste kann in diesem Beitrag angeschaut werden: Quellcode-Übersicht
Ein Screenshot davon findet sich im Anhang.
Punkt für Auflistung
Doppelpfeil für Auflistung
Ich habe bewusst ein Div... und kein span... für die Liste verwendet. Sie soll immer extra und nicht mit in der Zeile stehen.
Die Leerzeichen
In der CSS-Klasse "list" habe ich diesen Style angegeben:
padding-left:20px;
white-space:pre;
font-weight:normal;
}
Das Pre sieht nicht ganz so aus, wie wenn man den zugehörigen Foren-Code dazu verwendet.
Dann kann man ja aber auch
Die Listen werden durch das
Eine mit HTML-Tags definierte Liste kann auch mit Groß-/Klein-Buchstaben, Zahlen, ...Kreisen (hier schon eingebaut), etc. ... versehen werden.
Vor allem geschieht dies automatisch. Falls der Automatismus bei der Nummerierung gewünscht ist, kommt man um eine Umsetzung der Listen-HTML-Tags nicht herum.
Mit dieser hier beschriebenen Variante kann der Admin aber beliebige Zeichen als Menü-Punkt für eine Liste definieren.
Außerdem kann man auch selbst mit Buchstaben und Zahlen arbeiten. Anstatt a. verwenden zu müssen, kann dann auch a) verwendet werden.
Genauso verhält es sich mit (römischen) Zahlen. Einzig und allein um die kleinen Einrückungen__1.
__2.
...
_10.
...
_100.
usw. ...
(_ soll Leerzeichen bedeuten) muss man sich selbst kümmern. Diese sind aber durch pre in der CSS auch möglich, bzw. wenn das Pre-Tag oder der Foren-Code stattdessen verwendet wird.
So sieht's später aus:
» Doppelpfeil
• Punkt
» Doppelpfeil
• Punkt
Huiii, das wurde dann doch wieder etwas länger...
Aber vielleicht hilft es ja!

ich habe die Ursache gefunden!

Es liegt darin, dass ich keine korrekte Liste angelegt habe!
Wie Du gezeigt hast, beginnt eine Liste mit z.B. <ul> und endet mit </ul>.
Wenn ich die beiden HTML-Codes in BB-Codes umsetze und damit eine Tabelle aufbaue, funktioniert der Spoiler-Button 1A!
[ul]
[li]TEXT[/li]
[li]TEXT[/li]
[li]TEXT[/li]
[/ul]
[/spoiler]
• Das würde aber immer voraussetzen, dass der Benutzer wissen muss, wie eine Liste aufgebaut wird!
• Für eine unkomlizierte Bedienung aus der Symbolbar heraus, bietet sich die einfache Umsetzung an.
Vielen Dank für Deine Ausführliche Antwort.

Sehr informativ und aufschlussreich
Gruß
Wolfgang
Ich muss mich gleich in meinem ersten Beitrag mal bei Dir / Euch bedanken. Habe diesen Spoiler soeben bei mir eingebaut und der ist ja sowas von Klasse.



Mit einem Spoiler kann ein ausgewählter Text-Abschnitt ausgeblendet werden.
Bei dieser neuen Version steht ein weiterer Ausblenden-Button am Ende.
So können lange Texte, ohne nach oben zu scrollen, geschlossen werden.
JavaScript muss aktiviert sein, damit der Button funktioniert.
(Erklärung zum Spoiler-Button)
Zuerst muss im Template Element "Obere Leiste" folgender Quelltext zwischen den Head-Tags eingefügt werden:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18<script language="javascript" type="text/javascript">
// Spoiler Klapp-Funktion
function spoiler_on(me) {
if (me.parentNode.parentNode.getElementsByTagName('span')[1].getElementsByTagName('span')[0].style.display != 'block') {
me.parentNode.parentNode.getElementsByTagName('span')[1].getElementsByTagName('span')[0].style.display = 'block';
me.innerText = '';
me.value = 'Hide';
}
else {
me.parentNode.parentNode.getElementsByTagName('span')[1].getElementsByTagName('span')[0].style.display = 'none';
me.value = 'Show';
}
}
function spoiler_off(me) {
me.parentNode.style.display = 'none';
me.parentNode.parentNode.parentNode.getElementsByTagName('span')[0].getElementsByTagName('input')[0].value = 'Show';
}
</script>
Als nächstes kommen die CSS-Angaben auch zwischen die Head-Tags:
2
3
4
5
6
7
8
9
10
11
12<style type="text/css">
/* Spoiler */
.spoiler_button {
width:50px;font-size:10px;margin:0px;padding:0px;
}
.spoiler_inhalt {
display:none;border:double;width:95%;padding:10px;overflow:auto;
}
.spoiler_hide {
font-size:10px;margin:0px;padding:0px;
}
</style>
Anschließend wird unter Admin -> Einstellungen -> Codes/Smilies in den Feldern unter "Hinzufügen eines neuen Forumcodes" der neue Foren-Code [spoiler]
<span><span><input name="button" type="button" class="spoiler_button" onClick="spoiler_on(this);" value="Spoiler" onmouseover="this.style.cursor='pointer';"></span><span><span class="spoiler_inhalt">
und [/spoiler]
<br /><br /><input name="button" type="button" class="spoiler_hide" onClick="spoiler_off(this);" value="ausblenden" onmouseover="this.style.cursor='pointer';"></span></span></span>
ersetzt.
Zuletzt wird unter Admin -> Einstellungen -> Symbol-Bar die Symbol-Bar ergänzt, damit auch die Foren-Mitglieder die Funktion nutzen können.
Dazu einfach an geeigneter Steller diese Zeile einfügen:<A HREF="javascript:insert('[spoiler]','[/spoiler]')"><img src="http://www.bilder-hochladen.net/files/585t-5.png" title="[spoiler] versteckter Text [/spoiler]" border=0 width="48" height="17"></A>
Spoiler in Aktion:
versteckter Text
Hinweis:
Damit die Funktionalität des alten Spoilers erhalten bleibt, reicht es aus, das alte JavaScript einfach zu belassen.

Hallo Florian,
läßt sich die Funktion des Spoilers so umdrehen, das er am Anfang geöffnet ist?
Man könnte Ihn dann z.B. zum Ausblenden von Textstellen verwenden.
Läßt sich der Zustand des Spoilers auch über ein Cookie speichern?
Währe super, wenn Du hier eine Lösung siehst.
Bis dann
Wolfgang

Hallo Wolfgang,
um welchen Spoiler dreht es sich nun überhaupt?
Um einen der hier entwickelten (mit/ohne Ausblendebutton), oder den aktuellen von HPM?
Standardmäßig einblenden könnte gehen.
Ändere einfach mal
style="display:none;"
beim ausgeblendeten Element in
2
3
style="display:block;"
oder
style="display:inline-block;"
Dann sollte es beim Laden der Seite wohl angezeigt werden.
Die Sache mit dem Cookie sehe ich problematisch.
Die Spoiler haben jeweils keine eigene und konstante ID.
Die Nummer des Spoilers nach dem Quellcode kann sich auch durch neue oder gelöschte Beiträge verschieben.
Dann würden die falschen Spoiler ein-/ausgeblendet.

Hallo Florian,
besten Dank für die Anwort.
Mit den "Div's" im JavaScript funktioniert es. Leider verursachen sie immer einen Zeilenumbruch.
+ Ich habe mir vorgestell, dass der Anfangsbuchstabe den Ausblendeffekt auslöst.
+ Der ausgeblendete Text sollte ein Pluszeichen hinterlassen
+ Die Ausblendung sollte auch mitten im Text möglich sein
+ Die Einstellung sollte gespeichert werden
Hier das Script das nicht richtig funktioniert will:
- Der Text wird umgebrochen
- Ein Text zwischen den Ausblendungen wird ans Ende gesetzt
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Spoiler</title>
<script language="JavaScript" type="text/javascript">
function spoiler(me) {
var spoiler_obj = me.parentNode.parentNode.getElementsByTagName('span')[2];
if (spoiler_obj.style.display != 'block') {
spoiler_obj.style.display = 'block';
}
else {
spoiler_obj.style.display = 'none';
document.getElementById('me').innerHTML = '+'; // ???????
}}
</script>
</head>
<body>
<span><span><a title="Zum Ausblenden anklicken" style="color:#ff0000;float:left;font-weight:bolder;" onmouseover="this.style.cursor='pointer';" onclick="spoiler(this);">D</a></span><span></span>
<span style="display:block;">er Text oder die Tabelle</span></span>
Test 1
<span><span><a title="Zum Ausblenden anklicken" style="color:#ff0000;float:left;font-weight:bolder;" onmouseover="this.style.cursor='pointer';" onclick="spoiler(this);">D</a></span><span></span>
<span style="display:block;">er Text oder die Tabelle</span></span>
Test2
</body>
</html>
Was ist falsch an dem Script?
Mit besten Dank im Voraus
Wolfgang

Hallo Wolfgang,
ich schätze, dass ich etwas in die Richtung habe.
Also erstmal, falls ich das nun richtig verstanden habe, das finde ich eine super Idee.
Evtl. kann man dies auch in umgekehrter Variante irgendwie einsetzen, dass man erst Textteile aufklappen muss, wenn man sie will, eine Art Mini-Spoiler eben.
Ich habe inzwischen auch ein kleines Beispiel hier im Forum eingebaut, um die Funktion einmal zu demonstrieren.
Das Skript und der Style habe ich ausgelagert, um die Länge des Forencodes in der Administration nicht zu lang für das Textfeld werden zu lassen, außerdem kann ich so das Aussehen jederzeit ohne Forencodes anzufassen verändern.
Du benötigst zum Einbau einen "Erweiterten Forencode":
2
3
[spoil=
...
+{{text}}]
2
3
<span><span onclick="spoiler_text(this);" onmouseover="this.style.cursor='pointer';" title="Zum Ausblenden anklicken" class="spoiler_text_link">
...
<font></font></span><span class="spoiler_text_content" style="display:inline;">{{text}}</span></span>
In einem Beitrag kannst du dies nun folgendermaßen einbinden (Beachte das kleine "+" als Trennzeichen, optional auch ein anderes Zeichen...):
2
3
[spoil=ANFANGSBUCHSTABE+AUSGEBLENDETER_TEXT]
[spoil=B+eispiel hier im Forum...]
Aber beachte:
Das "+" als Trennzeichen im Forencode ist nur geschmackssache und sagt, wie man den Foren-Code schreiben muss.
Blendet man den Text aus, erscheint auf jeden Fall ein "+" hinter dem Anfangsbuchstaben.
Ändern kannst du die Einblendung hinter dem Buchstaben in folgender Skript-Zeile:
me.getElementsByTagName('font')[0].innerHTML = '+';
Setze z.B. den HTML-Code eines kleinen Bildchens da ein.
Ich habe es kurz ausprobiert, fand aber ein Bild als zu "globig" und störend, ein "+"-Zeichen ist angenehmer anzusehen. (Geschmackssache )
Diese Variante erfüllt nun folgende Bedingungen:
+ Anfangsbuchstabe blendet den Text aus.
+ Ein "+"-Zeichen wird dem Buchstaben angehängt.
+ Kein Umbruch mitten im Text (HTML-Codes müssen dazu in einer Zeile direkt aneinander stehen bleiben! - doof, ist aber so)
+ Textstellen innerhalb des Absatzes können nahtlos mittendrin ausgeblendet werden.
- Einstellung wird nicht gespeichert.
Der Speicherung stehe ich nach wie vor skeptisch gegenüber.
Manuell IDs zu vergeben finde ich zu aufwendig und auch zu fehleranfällig.
Autom. können sie auch nicht vergeben werden, ergäben auch nur Probleme bei neuen oder gelöschten Beiträgen.
Man müsste sie fast an deren Inhalt unterscheiden.
Das Cookie würde aber viel zu stark aufgebläht.
Und bei jedem Seitenstart zu prüfen, würde das Forum nur unnötig ausbremsen.
2
3
4
5
6
7
8
9
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
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Spoiler</title>
<script language="JavaScript" type="text/javascript">
function spoiler_text(me) {
var spoiler_obj = me.parentNode.getElementsByTagName('span')[1];
if (spoiler_obj.style.display != 'inline') {
spoiler_obj.style.display = 'inline';
me.getElementsByTagName('font')[0].innerHTML = '';
me.title = 'Zum Ausblenden anklicken';
}
else {
spoiler_obj.style.display = 'none';
me.getElementsByTagName('font')[0].innerHTML = '+';
me.title = 'Zum Einblenden anklicken';
}
}
</script>
<style type="text/css">
.spoiler_text_link {
color:#ff0000;
font-weight:bolder;
border-bottom:1px dotted red;
}
.spoiler_text_content {
border-bottom:1px solid red;
}
</style>
</head>
<body>
Dies ist ein
<span><span onclick="spoiler_text(this);" onmouseover="this.style.cursor='pointer';" title="Zum Ausblenden anklicken" class="spoiler_text_link">T<font></font></span><span class="spoiler_text_content" style="display:inline;">est-Text, der ausgeblendet werden kann.</span></span>
Weitere Text-Teile dazwischen
<span><span onclick="spoiler_text(this);" onmouseover="this.style.cursor='pointer';" title="Zum Ausblenden anklicken" class="spoiler_text_link">s<font></font></span><span class="spoiler_text_content" style="display:inline;">ind auch kein Problem,</span></span>
genauso wie danach.
</body>
</html>

Hier habe ich nun noch einen Quellcode, bei dem der ausblendbare Text nur beim Hovern unterstrichen wird:
2
3
4
5
6
7
8
9
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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Spoiler</title>
<script language="JavaScript" type="text/javascript">
function spoiler_text(obj) {
var spoiler_obj = obj.parentNode.getElementsByTagName('span')[1];
if (spoiler_obj.style.display != 'inline') {
spoiler_obj.style.display = 'inline';
obj.getElementsByTagName('font')[0].innerHTML = '';
obj.title = 'Zum Ausblenden anklicken';
}
else {
spoiler_obj.style.display = 'none';
obj.getElementsByTagName('font')[0].innerHTML = '+';
obj.title = 'Zum Einblenden anklicken';
}
}
function spoiler_text_mouseover(obj) {
obj.style.cursor = 'pointer';
obj.parentNode.getElementsByTagName('span')[1].style.borderBottom = '1px solid red';
}
function spoiler_text_mouseout(obj) {
obj.parentNode.getElementsByTagName('span')[1].style.borderBottom = 'inherit';
}
</script>
<style type="text/css">
.spoiler_text_link {
color:#ff0000;
font-weight:bolder;
border-bottom:1px dotted red;
}
.spoiler_text_content:hover {
border-bottom:1px solid red !important;
}
</style>
</head>
<body>
Dies ist ein
<span><span onclick="spoiler_text(this);" onmouseover="spoiler_text_mouseover(this);" onmouseout="spoiler_text_mouseout(this);" title="Zum Ausblenden anklicken" class="spoiler_text_link">T<font></font></span><span class="spoiler_text_content" style="display:inline;">est-Text, der ausgeblendet werden kann.</span></span>
Weitere Text-Teile dazwischen
<span><span onclick="spoiler_text(this);" onmouseover="spoiler_text_mouseover(this);" onmouseout="spoiler_text_mouseout(this);" title="Zum Ausblenden anklicken" class="spoiler_text_link">s<font></font></span><span class="spoiler_text_content" style="display:inline;">ind auch kein Problem,</span></span>
genauso wie danach.
</body>
</html>

Hallo Florian,
einfach Klasse, was so möglich ist!!!
Viele Grüße und besten Dank für Deine umfangreiche Hilfe
Wolfgang

Hier gibt es nun nochmal eine leicht überarbeitete Version.
Sie ist nun nicht mehr unbedingt von einem Doctype abhängig.
Außerdem wurde ein kleiner Bug behoben, durch den im IE ohne Doctype-Angabe der Text beim Hovern des Anfangsbuchstabens die Unterstreichung bestehen blieb und evtl. aber auch nicht beim Hovern des Textes gesetzt wurde.
Danke dafür auch noch an Wolfgang, der dies entdeckt und auch gleich behoben hat.
2
3
4
5
6
7
8
9
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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Spoiler</title>
<script language="JavaScript" type="text/javascript">
function spoiler_text(obj) {
var spoiler_obj = obj.parentNode.getElementsByTagName('span')[1];
if (spoiler_obj.style.display != 'inline') {
spoiler_obj.style.display = 'inline';
obj.getElementsByTagName('font')[0].innerHTML = '';
obj.title = 'Zum Ausblenden anklicken';
}
else {
spoiler_obj.style.display = 'none';
obj.getElementsByTagName('font')[0].innerHTML = '+';
obj.title = 'Zum Einblenden anklicken';
}
}
function spoiler_text_mouseover(obj) {
obj.style.cursor = 'pointer';
obj.parentNode.getElementsByTagName('span')[1].style.borderBottom = '1px solid red';
}
function spoiler_text_mouseout(obj) {
obj.parentNode.getElementsByTagName('span')[1].style.borderBottom = 'inherit';
}
</script>
<style type="text/css">
.spoiler_text_link {
color:#ff0000;
font-weight:bolder;
border-bottom:1px dotted red;
}
</style>
</head>
<body>
Dies ist ein
<span><span onclick="spoiler_text(this);" onmouseover="spoiler_text_mouseover(this);" onmouseout="spoiler_text_mouseout(this);" class="spoiler_text_link" title="Zum Ausblenden anklicken!">T<font></font></span><span onmouseover="spoiler_text_mouseover(this);" onmouseout="spoiler_text_mouseout(this);" class="spoiler_text_content" style="display:inline;" title="Zum Ausblenden markierten Anfangsbuchstaben klicken!">est-Text, der ausgeblendet werden kann.</span></span>
Weitere Text-Teile dazwischen
<span><span onclick="spoiler_text(this);" onmouseover="spoiler_text_mouseover(this);" onmouseout="spoiler_text_mouseout(this);" class="spoiler_text_link" title="Zum Ausblenden anklicken!">s<font></font></span><span onmouseover="spoiler_text_mouseover(this);" onmouseout="spoiler_text_mouseout(this);" class="spoiler_text_content" style="display:inline;" title="Zum Ausblenden markierten Anfangsbuchstaben klicken!">ind auch kein Problem,</span></span>
genauso wie danach.
</body>
</html>
Die Pseudoklasse ":hover" wird nun nicht mehr unbedingt benötigt.
Zum Schluss noch ein kleines Beispiel zum Quellcode.