BBCode mehrere Vorkommnisse

DoRiMaN

Erfahrenes Mitglied
Halli Hallo...

hab da ein Problem...

Ich habe ein BBTag in ein vorhandenes Forum eingebaut -> [ spoiler ][ /spoiler ]
Ich habe es mit einem ausgeblendeten DIV-Layer gelöst... Will der User den Text sehen, klickt er auf das [+]-Symbol, und der Text wird mittels JavaScript angezeigt...

Das funktioniert auch recht gut... Aber nun mein Problem... Wenn dieser Tag mehrere male vorkommt, dann gibt es Probleme mit der JavaScript-Funktion, weil die Funktion die ID des DIV-Layers überprüft...

Ich sollte irgendwie mittels Schleife jedem Layer eine andere ID vergeben, was eigentlich kein Problem sein sollte... Jedoch bringe ich es hier nicht fertig... :(

Hier mein Code:

PHP:
// [ spoiler ] and [ /spoiler ] for spoiler-text   
$text = str_replace("[spoiler:$uid]", $bbcode_tpl['spoiler_open'], $text);
$text = str_replace("[/spoiler:$uid]", $bbcode_tpl['spoiler_close'], $text);
Hier die PHP Datei die das ganze umwandelt...

Code:
<!-- BEGIN spoiler_open --><a href="#" onClick="javascript: spoilermore();"><img src="templates/subSilver/images/expand.jpg" width="10" border="0" id="spoilermore_img"></a><div style="display:none" id="spoilermore_div"><!-- END spoiler_open -->
<!-- BEGIN spoiler_close --></div><!-- END spoiler_close -->
Hier den DIV-Layer der Benutzt wird...

Code:
<script language="JavaScript"> 
function spoilermore(){
	var obj = document.getElementById("spoilermore_div");
	var image = document.getElementById("spoilermore_img");
	if(obj.style.display=="none"){
		obj.style.display="";
		image.src='templates/subSilver/images/minimize.jpg';
	} else {
		obj.style.display="none";
		image.src='templates/subSilver/images/expand.jpg';
	}
}
</script>
Und die JavaScript Funktion die die Layers "verwaltet"...


so wie die Seiten jetzt sind, funktionieren sie, aber es funktioniert nur 1 Spoiler...

Ich hab schon die Suche benutzt, bin auf diesen Link gestossen, aber da bin ich auch nicht weiter gekommen...

kann mir jemand helfen?

Danke und Greetz

DoRiMaN
 
Es dürfte sinnvoller(und bequemer) sein, wenn du versuchst, über den Dokumentbaum an das <div> zu kommen.

Übergebe der Funktion lediglich per this den auslösenden Link als Objekt.
Von der Basis aus kannst du dich mit diversen DOM-Methoden/Eigenschaften(parentNode,childNodes,nextSibling,....) bis zu dem <div> vorarbeiten, das braucht dann keine ID (oder ähnliches)
 
Original geschrieben von fatalus
Es dürfte sinnvoller(und bequemer) sein, wenn du versuchst, über den Dokumentbaum an das <div> zu kommen.

Übergebe der Funktion lediglich per this den auslösenden Link als Objekt.
Von der Basis aus kannst du dich mit diversen DOM-Methoden/Eigenschaften(parentNode,childNodes,nextSibling,....) bis zu dem <div> vorarbeiten, das braucht dann keine ID (oder ähnliches)

he :eek: :-(

DOM-Methoden? -> Bahnhof :-)

hmm, wenn ich aber im Link (siehe Oben), der Funktion this mitgebe, dann hat er als Objekt den Link (habs ausprobiert...)

Ich wüsste nicht wie ich es lösen könnte :(

könntest du mir ein Beispiel machen?

THX & Greetz

DoRiMaN
 
dann hat er als Objekt den Link (habs ausprobiert...)
...genau, das ist alles, was du brauchst.

Mit den DOM-Methoden kannst du dich von dem Link aus im Dokument bewegen:


Du willst das Bild verändern...
das Bild ist der erste Kindknoten des Links(firstChild)->
Code:
bildObj = linkObj.firstChild;

du willst das <div> anzeigen/verstecken...
Der Link ist ein Elementknoten.
Der nächste auf den Link folgende Elementknoten(nextSibling) ist schon dein <div>...
Code:
spoilerObj = linkObj.nextSibling;

...die Konstellation in deinem Dokumentbaum könnte für deinen Zweck kaum besser sein :)

Die Funktion könnte z.B. so aussehen:
Code:
<script type="text/javascript">
<!--
function spoiler(obj)
{
if(obj.nextSibling)
    {
    obj.firstChild.src = (obj.nextSibling.style.display=='none')?'minimize.jpg':'expand.jpg';
    obj.nextSibling.style.display = (obj.nextSibling.style.display=='none')?'block':'none';
    }
}
//-->
</script>

Aufruf per
Code:
onclick="spoiler(this)"
..im Link.

Das sähe dann so aus.

Ansich könntest du dir den Link auch noch sparen und den Funktionsaufruf gleich auf das Bild legen...das spart nen paar Bytes Traffic:-)
 
GENIAL!

es funktioniert einwandfrei!

Danke @ fatalus

Und dazu hab ich noch etwas gelernt, was ich nicht wusste... das ganze mit den childs etc :-)

THX! Greetz

DoRiMaN
 
hmm, da wir gerade dabei sind... ich brauche weitere BBCode-Hilfe :-(

wenn ich jetzt parameter verwenden möchte? ich hab versucht, beim originalen BBCode den ich habe zu schauen, aber dort wird nur 1 Parameter verwendet, und da ich RegEx (noch) nicht verstehen kann :-) :-)

Beispiel:

[notiz datum=13.02.2004 typ=privat]TEXT[/notiz] (ist nur ein beispiel...) :-)

hoffe auf help :-)

Greetz, DoRiMaN
 
Das Beispiel zeigt nur wie es Funktionieren soll :) Die Tags werden dann nicht Notiz... so wars gemeint :)
 
Die Tags werden dann nicht Notiz...
Das ist schon klar... und du willst, dass sie eine Notiz werden, ....bloss wie sehen deine Notizen aus? Und wohin mit Parametern?

Wieauchimmer... hier mal nen Beispiel:-):
Code:
$txt=preg_replace("/\[notiz(\s+datum\s*=\s*(\d{1,2}\s*\.\s*\d{1,2}\s*\.\s*\d{2}(\d{2}|))|(()))(\s+typ\s*=\s*(\S+)|())\s*\](.+?)\[\/notiz\]/ise","'<div><b><u>Notiz:</u>&amp;nbsp;&amp;nbsp;<code>'.trim('\\2').'</code>&amp;nbsp;&amp;nbsp;<i>'.trim('\\7').'</i></b><blockquote>'.trim('\\9').'</blockquote></div>'",$txt);
....das wirkt sich dann folgendermassen aus.
 
Zuletzt bearbeitet:
Ok, war zu kompliziert mit dem ganzen Notiz-Scheiss :-)

das war nur ein Beispiel, da die richtigen Tags ein Download-Client betrafen... und da dieses Thema hier nicht beliebt ist, hab ichs umgeschrieben... :-)

by the way, ich hab das Problem lösen können :-)

hab paar Anleitungen und Beschreibungen zu den Regular Expressions gelesen, und dann ists gegangen :)

Trotzdem vielen Dank! :)

Greetz

DoRiMaN
 
Zurück