Florians Forum » Webmaster » Ideen für Skripte und sonstige Quellcodes » Signatur ausblenden
Hallo Leute
Mal wieder ein Skript, dass ich benötige, und nicht selber schreiben kann.
Ich möchte vor dem "Bei Antworten Informieren" Button einen Button (Checkbox) haben wo steht "Signatur ausblenden". Wenn der haken in diesem Feld drin ist, soll in dem Beitrag (Nur in dem einen Beitrag, nicht im ganzen Thema) die Signatur ausgeblendet und nicht angezeigt werden.
Ist sowas machbar? HPM scheint da keinen sinn zu sehen sowas einzuprgrammieren, für angepinnte Threads und gewisse Beiträge würden bei mir aber einige User gerne die Sig ausblenden.

Hallo Movert,
dass wird sich leider nicht so umsetzen lassen.
Das müsste Xobor dann schon zusammen mit dem Beitrag in ihrer Datenbank abspeichern, dass für diesen Beitrag die Signatur ausgeblendet wird.
Wird wohl leider nichts, sorry...
Falls nicht schon ein Vorschlag dazu existiert, kannst du ja mal ganz lieb im Support-Forum anfragen.
Vielleicht vermissen ja auch andere noch so eine Funktion. Viel Glück!
Schade, ich dachte dass es vielleicht möglich wäre wie bei deinem Bedanken System das ganze in einer Datenbank zu speichern, wenn haken oder sowas.

Hmm, könnte evtl. sogar wirklich möglich sein.
Allerdings war das Bedanken-Skript auch sehr zeitaufwendig und musste mir viele Tricks einfallen lassen, um es überhaupt einmal grob zum Laufen zu bekommen.
Also im Moment werde ich da jetzt nicht gerade zu kommen, das mal eben zu implementieren.
Falls mir dazu nicht noch eine weniger komplexe Lösung einfällt, wird das vorerst noch nichts, sorry...
Sollte sich noch was in nächster Zeit dazu ergeben, werde ich es natürlich hier posten.
ok, Trotzdem Danke für deine Guten Hilfe hier im Forum!

Hallo Movert,
ich würde mal sagen, gute Nachrichten...
Also ich habe mir nochmals ein paar Gedanken zu diesem Thema gemacht.
Vorweg muss ich aber sagen, dass ich es nicht genau so umgesetzt habe, wie du es am Anfang beschrieben hast.
Dafür bist du aber auch nicht von einem externen Webspace abhängig, sondern kannst alles über die Templates erledigen.
Einzige Ausnahme natürlich, falls du deine Scripts wie ich in einer Datei auf deinem Webspace zur Verfügung stellst und nicht immer ins Template hineinkopierst.
Beginne damit, einen neuen Foren-Code anzulegen (und blende die Felder für den erweiterten Foren-Code aus).
Ersetze dann:
2
3
[hideSignature]
... mit...
<span name="hideSignature" style="display:none;"> </span>
Stelle nun also noch diese Javascript-Funktion für dein Forum bereit, z.B. ganz klassisch zwischen den Head-Tags im Forum:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function hideSignatures() {
var className = 'msignature';
var bbCodes = document.getElementsByName('hideSignature');
for(i=0; i<bbCodes.length; i++) {
try {
var signature = bbCodes[i];
while (signature.className != 'mtext') {
signature = signature.parentNode;
}
var divCount = signature.getElementsByTagName('div').length;
signature = signature.getElementsByTagName('div')[divCount-1];
if(signature.className.indexOf(className) != -1) {
var teststr = "," + signature.className.split(" ").join(",") + ",";
if(teststr.indexOf("," + className + ",") != -1) {
signature.style.display = 'none';
}
}
}
catch(err) {}
}
}
Die Variable className enthält den Namen der CSS-Klasse des Containers, welcher die Signatur umgibt.
Bei meinem Template hatte der Container keine ID oder Namen, dafür aber bereits diese Klasse zuegordnet.
In der Variablen bbCodes werden zuerst einmal alle SPANs gesammelt, welche deinem neu erstellten BBCode entsprechen.
Passe 'hideSignature' hinten ggf. an, falls du dem SPAN in der Ersetzung des BBCodes einen anderen Namen gegeben hast.
Der Name des BBCodes selbst ist im Prinzip davon unabhängig, nennst du ihn aber z.B. [nosig], dann musst du ihn später eben so in deinen Beiträgen verwenden.
Beachte, dass du dann noch die Funktion hideSignatures(); auch per Onload aufrufen musst, die Signaturen sollen ja automatisch nach dem Laden der Seite ausgeblendet werden.
Welchen Onload du verwendest, ist ja egal, beachte auch hier evtl. zur Orientierung den Beitrag Onload im Body-Tag verkürzen.
Sollte aufgrund von Template-Unterschieden sich der Pfad vom ersetzten BBCode zum Signatur-Container unterscheiden, müsstest du wohl noch die ersten fünf Zeilen in dem Try-Block anpassen.
Kurz zur aktuellen Funktionsweise:
2
3
4
5
6
7
8
9
<div class="mtext">
<p>
Beitrags-Text
<span name="hideSignature" style="display:none;"> </span>
</p>
<div class="msignature">
Beitrags-Signatur
</div>
</div>
Beiträge befinden sich hier im Forum innerhalb eines P-Tags, welches wiederum in einem DIV mit der Klasse mtext liegt.
Direkt nach besagten P-Tag und auch noch innerhalb von mtext befindet sich ein DIV mit der Klasse msignature, welches eben der Container für die Signatur ist.
Die Variable signature ist zu Anfang das SPAN-Element, welches vom BBCode erzeugt wurde und sich damit innerhalb des Beitrages befindet.
Nun springt das Skript solange einen Knoten nach oben, bis der Knoten eine Klasse namens mtext besitzt, in diesem Fall ja der Container, in welchem das P-Tag mit Beitrag und Signatur-Container liegen.
Von da aus wird auf das letzte DIV innerhalb des Tags weitergesprungen, dieses sollte der Signatur-Container sein.
Sollte dein Signatur-Container auf eine andere Art erreichbar sein, musst du die Skript-Anweisungen so ändern, dass du von dem vom BBCode erzeugten SPAN zum Signatur-Container springst.
Das Skript prüft dann weiterhin, ob die Klasse des angesprungenen Containers auch wirklich der Variablen className (hier also msignature) entspricht.
Könnte ja sein, dass jemand das Tag verwendet, obwohl er keine Signatur hat.
Also es wird wirklich nur der richtige Signatur-Container ausgeblendet, sollte er gar nicht vorhanden sein oder nicht richtig vom Skript angesprungen werden, passiert einfach nichts.
Da das Skript in dieser Standard-Einstellung einfach solange nach oben springt, bis der Container mit der Klasse mtext erreicht wurde, ist es eigentlich egal, an welcher Stelle im Beitrag du den neuen BBCode einfügst.
Bei Zitaten könnte ich mir vorstellen, dass dann schlimmstenfalls die Anweisung auch auf den eigenen Beitrag angewendet wird.
Dann muss eben beim zitierten Text der BBCode ggf. herausgenommen werden, aber eine nicht zu sehende Signatur wird ja nicht das schlimmste sein.
Nur in Code-Blöcken wird der BBCode natürlich außer Kraft gesetzt.
Ich empfehle dir, dass du den BBCode einfach nach dem ganzen Inhalt ganz am Ende des Beitrages einfügst, da ist er leicht wiederzufinden und logisch gesehen finde ich ihn da am besten aufgehoben.
Viel Spaß damit!
Ist es denn möglich das ganze noch so zu machen, dass bei dem Haken in der Checkbox wenn ein haken drin ist, automatisch dieser Teil angehängt wird, und wenn nicht eben nicht?

Du könntest dich evtl. an der Xobor-Funktion zum Einfügen orientieren.
xob_insert('[nosig]');
Beim Haken setzen fügst du das Tag über die Funktion ein.
Dann wird es an der aktuellen Cursor-Position eingefügt.
Um es evtl. unabhängig vom Cursor immer ans Ende anzufügen, setzt du es an den bisherigen Inhalt des Textfeldes an.
Bei der ID messagetext des Textfeldes müsste das in etwa so gehen:
document.getElementById('messagetext').value += '\n[nosig]';
\n um davor noch einen Zeilenumbruch zu erzeugen.
Miitels der replace()-Methode von String-Objekten könntest du dann die Zeichenkette des BBCodes mit einem leerem String ('') ersetzen lassen.
Alternativ zur obigen Einfügemethode kannst du evtl. auch die concat()-Methode verwenden.
mhh ok, danke. hört sich kompliziert an.

Die Grundidee ist eigentlich nicht einmal so umfassend.
Natürlich kann man das Skript zum Einfügen so weit ausbauen, wie man möchte.
Ich habe hier einmal eine Variante, welche den BBCode automatisch einfügt.
Beim Entfernen werden beliebig viele Vorkommen automatisch entfernt, damit auch evtl. mitten im Beitrag dazukopierte BBCodes rausgenommen werden.
Aber in diesem Beispiel wird dadurch ggf. auch ein Tag innerhalb von Code-Tags entfernt.
Im Folgenden nun mal eine Zusammenstellung der hier im Forum eingebauten Funktion:
2
3
[noSignature]
... ersetzen mit ...
<span name="hideSignature" style="display:none;"> </span>
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
function hideSignatures() {
var className = 'msignature';
var bbCodes = document.getElementsByName('hideSignature');
for(i=0; i<bbCodes.length; i++) {
try {
var signature = bbCodes[i];
while (signature.className != 'mtext') {
signature = signature.parentNode;
}
var divCount = signature.getElementsByTagName('div').length;
signature = signature.getElementsByTagName('div')[divCount-1];
if(signature.className.indexOf(className) != -1) {
var teststr = "," + signature.className.split(" ").join(",") + ",";
if(teststr.indexOf("," + className + ",") != -1) {
signature.style.display = 'none';
}
}
}
catch(err) {}
}
}
function nosigChanged(cbox) {
var textField = document.getElementById('messagetext');
if (cbox.checked) {
textField.value += '\n[noSignature]';
}
else {
var signatureSearch = /\s?\[noSignature\]/gi;
var result = signatureSearch.exec(textField.value);
for (var i=0; i<result.length; i++)
textField.value = textField.value.replace(signatureSearch, '');
}
}
2
3
4
5
<form action="" class="nosigForm">
<input type="checkbox" id="nosigCheckbox" name="nosigCheckbox" value="[noSignature]"
style="width:auto;" onchange="nosigChanged(this);" />
<label for="nosigCheckbox">Signatur ausblenden</label>
</form>
Falls du die Checkbox wie hier in die Iconbar einbauen möchtest, dann wird es dort natürlich als HTML eingegeben.
Außerdem lässt du einfach das Form-Tag außen weg, da die Iconbar bereits von einem umgeben ist.
P.S.: Den Onload natürlich auch beibehalten...
Dass es in einem normalen Beitrag funktionieren sollte, siehst du hier.
Unterhalb von diesem Beitrag wird keine Signatur angezeigt, obwohl meine Beiträge normalerweise eine Signatur enthalten.
P.P.S.:
Zusätzlich wurde in diesem Skript auch ein Bug behoben, welcher das Ausblenden der Signatur evtl. verhinderte.
Er trat auf bei zusätzlichen im Beitrag generierten DIVs, ich werde es auch in meiner ersten Antwort anpassen.
Habs nun eingebaut, Onload ist auch drin. das hide signaure ist auch im Quellcode, aber es wird nicht ausgeblendet.

Naja, wie bereits oben erwähnt, könnte es durch die Template-Unterschiede sein, dass bei dir die Signatur anders in der Baumstruktur deines HTML-Quellcodes liegt.
Vom Beitrags-Container (wo der Foren-Code sich später ja befindet) wird mittels diesem Quellcode zum DIV mit der Signatur gesprungen:
2
3
4
5
6
var signature = bbCodes[i];
while (signature.className != 'mtext') {
signature = signature.parentNode;
}
var divCount = signature.getElementsByTagName('div').length;
signature = signature.getElementsByTagName('div')[divCount-1];
Falls dein Signatur-Container z.B. keine Klasse namens msignature besitzt oder anders in der Struktur liegt, wird er mit dem Code natürlich nicht richtig angesprungen.
Der Klassenname kann ja noch ein wenig weiter oben im Code geändert werden, wenn er in deinem Template anders heißt.
Hat der Signatur-Container keine Klasse, musst du auch den umliegenden Code ggf. etwas anpassen.
Ebenso kann es Probleme geben, wenn das Feld, in dem dein Beitrag später angezeigt wird, nicht die Klasse mtext besitzt.
Dass es umgesetzt werden kann, siehst du ja in diesem und auch in meinem letzten Beitrag, wo ja die Signatur ausgeblendet sein sollte.
Du kannst ja auch mal schauen, wie ein anderer Browser die Seite anzeigt.
Bei mir funktioniert es allerdings auch im IE, welchen du evtl. Standard-mäßig benutzt.
Entwickeln und Testen erfolgt bei mir i.d.R. mit Firefox.
Weiterhin ist es sonst schwierig zu sagen, wo das Problem liegt.
Da musst du dann schauen, ob du mittels ein paar alerts im Code etwas erreichen kannst oder eben noch einen Schritt weiter in eine Fehlerkonsole von z.B. Firefox gehen.
Auch Internet-Explorer sollte in einer der neueren Version (ab 7 oder 8) so eine Fehlerkonsole mit Debugger besitzen.
Seit Firefox 17 (allerdings noch im alpha-Stadium) wurde neben der normalen Fehlerkonsole noch ein extra Debugger eingebaut, so ist man etwas flexibler.
Über die Entwickler-Symbolleiste kann man inzwischen eine Menge machen, darüber sind dann die Entwickler-Tools bequem erreichbar.
Mittels dem inspect-Kommando kann man dann anfangen, den Quellcode der Seite zu inspizieren und verändern.
In der zusätzlich erscheinenden Leiste kann man dann auch per Mausklick ein HTML-Element zum Inspizieren auswählen.
Insgesamt hat man einen fast vollständigen Firebug-Ersatz, entwickelt und getestet habe ich auch diesen Code hier mit den genannten Tools.
Als Hinweis für Neugierige: Firefox kann mit der Entwickler-Symbolleiste auch nativ Screenshots von Teilen oder der ganzen Website machen.
Firefox 17 könntest du evtl. als portable Anwendung nutzen, um vorübergehend auf dessen Entwickler-Tools ohne Installation zugreifen zu können.
Ansonsten hilft dir auch evtl. Firebug weiter, das im Moment wohl noch etwas leichter zu bedienen aber trotzdem umfangreicher ist.

Hallo Florian,
wenn ich das Script im Standard-Template einbauen will, gibt es da etwas besonderes zu beachten?
Irgendwie funktioniert es in meinem Forum nicht!
Gruß
Wolfgang

Hallo Wolfgang,
das liegt an der unterschiedlichen Quellcode-Struktur.
Ich gehe mal davon aus, dass du den Foren-Code als [noSignature] bereits angelegt hast, dann musst du das Skript also nur noch ein wenig anpassen.
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
function hideSignatures() {
var className = 'msignature';
var bbCodes = document.getElementsByName('hideSignature');
for(i=0; i<bbCodes.length; i++) {
try {
var signature = bbCodes[i];
while (signature.className != 'mtext') {
signature = signature.parentNode;
}
var divCount = signature.getElementsByTagName('div').length;
signature = signature.getElementsByTagName('div')[divCount-1];
if(signature.className.indexOf(className) != -1) {
var teststr = "," + signature.className.split(" ").join(",") + ",";
if(teststr.indexOf("," + className + ",") != -1) {
signature.style.display = 'none';
}
}
}
catch(err) {}
}
}
function nosigChanged(cbox) {
var textField = document.getElementById('messagetext');
if (cbox.checked) {
textField.value += '\n[noSignature]';
}
else {
var signatureSearch = /\s?\[noSignature\]/gi;
var result = signatureSearch.exec(textField.value);
for (var i=0; i<result.length; i++)
textField.value = textField.value.replace(signatureSearch, '');
}
}
Anzupassen sind dabei die Variable className ganz oben und 'mtext' (in der While-Bedingung).
Im Gaia-Template sieht es ja so aus, dass sich die Signatur im Prinzip im Container des Beitrages befindet.
Bei dir ist das so ähnlich, nur dass der entsprechende Container nicht mit der Klasse mtext, sondern ifo55 versehen ist.
Dieser Container, enthält also insgesamt Beitrag und Signatur, somit tauscht du also den Namen in der While-Bedingung mit ifo55 aus.
Jetzt kann die While-Schleife also solange Tags nach oben springen, bis der entsprechende übergeordnete Container erreicht ist.
Gleich danach wird davon ausgegangen, dass sich die Signatur im letzten davon wiederum untergeordneten Container enthalten ist.
Die untergeordneten DIVs werden also gezählt und dann zum letzten gesprungen.
Um sicherzugehen, dass auch wirklich ein Signatur-Container angesprungen wurde, wird die Klasse des Containers mit msignature (Variable className) verglichen.
Also solltest du dafür sorgen, dass dein Signatur-Container im Template eine Klasse msignature erhält, damit er auch erkannt werden kann.
Änderst du den Klassen-Namen, musst du ihn natürlich auch in der Variable im Skript anpassen.
Eine Kleinigkeit ist mir dabei noch aufgefallen.
Deine Signatur war in einem DIV-Container enthalten, eine andere war stattdessen in P-Tags geschrieben.
Teste es also zuerst mal mit deiner Signatur.
Gebe später auch den anderen Signaturen die Klasse msignature, achte dann aber auch darauf, dass du nicht nur das letzte DIV-Tag anspringen und testen solltest, sondern ggf. auch das letzte P-Tag.
Zur Übersicht, wie das bei dir überhaupt aussieht und funktionieren sollte, hier nochmal entsprechender Quellcode aus deinem Forum:
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
<!-- 2. While-Schleife endet am übergeordneten Container, welcher Beitrag und Signatur enthält. ("ifo55" in While-Bedingung) -->
<td class="ifo55" valign="top" height="430px">
<div style="text-align:right;font-size:10px;font-style:oblique"></div>
<a href="#marke_unten">
<img title="Nach unten springen" src="http://www.bilder-hochladen.net/files/ecsj-1.gif" border="0" width="15" height="15">
</a>
<div class="xquoteable" id="xquoteable_p_1512">
<p></p>
<div style="background-image: url(http://www.bilder-hochladen.net/files/1tys-rd-d240.png); background-color:#D0D0D0;border:2px solid #000070;margin:5px;padding:10px;padding-left:20px; color:#000000;">
<font color="#00008B">
[BEITRAGS-TEXT]
[noSignature]
<!--
1. Vom [noSignature]-Tag wird über die While-Schleife der übergeordnete Container angesprungen.
-->
</font>
</div>
<p></p>
</div>
<div style="clear:both"></div>
<br>
<a href="#marke_oben">
<img title="Nach oben springen" src="http://www.bilder-hochladen.net/files/1tys-j1.gif" border="0" width="15" height="15">
</a>
<hr color="#888888" size="1">
<!-- 3. Dann wird von 2. aus der letzte untergeordnete Container angesprungen und dessen Klassen-Namen (noch ergänzen!) mit "msignature" verglichen. -->
<div style="background-color:#D8F5D7;margin:5px;padding:10px;padding-left:20px;border:2px solid green;color:#0000FE;">
[BEITRAGS-SIGNATUR]
</div>
</td>
Falls dann die neue Checkbox in der Iconbar keinen Foren-Code einfügt, liegt es vielleicht an der anderen Textfeld-ID.
Ändere dann die ID in der Funktion nosigChanged(cbox) ggf. so ab, dass das Skript das Textfeld finden kann.
var textField = document.getElementById('messagetext');
Du solltest in diesem Beitrag meine Signatur übrigens nicht sehen können.
Ich hoffe, dass dich das einen Schritt weiterbringt.

Hallo Florian,
besten Dank für Deine ausführliche Anwort.
Ich habe es bei mir noch nicht hinbekommen. Muss noch einiges versuchen.
Vielleicht stören sich auch die Scripte?
PS:
Die Signatur von Deinem letzten Beitrag wird im FF und Google-Chrom ausgeblendet, im Opera und IE leider nicht!
Gruß
Wolfgang

Hallo Wolfgang,
schade dass es noch nicht ganz klappt.
Aber das wird schon irgendwie noch, bald habe ich auch wieder ein wenig mehr Luft.
Komisch, dass meine Signatur in Opera und IE nicht ausgeblendet wird.
Ich habe es selbst einmal gestestet und konnte das leider (/zum Glück?) nicht bestätigen.
Könnte u.a. auch daran liegen, dass sich der aktuelle IE mehr an Standards hält...

An dieser Geschichte wäre ich sehr interessiert. Das gefällt mir super, dass Mitglieder die Signatur im Beitrag ausblenden können.
Wenn ihr da weiter seid, würde ich das gerne bei mir einbauen (Business Template).
Hat aber keine Eile. Hab momentan die Alternative aktiviert.
LG
River