Mozillafix für BBCode und Smilies beim Posten

In diesem moderierten Forum werden Code-Schnipsel, die zu klein sind, um richtige Mods zu sein, abgelegt.
Bei Fragen oder Problemen benutze bitte das Forum phpBB 2.0: Mod Support.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.0, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
Benutzeravatar
cYbercOsmOnauT
Ehemaliger
Beiträge: 3820
Registriert: 18.02.2004 23:02
Wohnort: Göttingen
Kontaktdaten:

Mozillafix für BBCode und Smilies beim Posten

Beitrag von cYbercOsmOnauT » 18.09.2006 11:28

Dieses Snippet behebt das Problem, dass die Cursorposition bei Browsern, die die Geckoengine verwenden (z.B. Mozilla, Netscape, Firefox) beim Anklicken von Buttons und Smilies (Postfenster) verloren geht.

Das Snippet wurde aus dem "BBCodes & smilies enhancement" Mod von GolfExpert entnommen. Die Codeteile sind zumeist gecodet von markus_petrux und TerraFrost.

Code: Alles auswählen

#
#-----[ OPEN ]------------------------------------------
#
templates/subSilver/posting_body.tpl

#
#-----[ FIND ]------------------------------------------
#
// Shows the help messages in the helpline window

#
#-----[ BEFORE, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
var baseHeight;
function initInsertions() {
	if (is_ie && typeof(baseHeight) != 'number') baseHeight = document.selection.createRange().duplicate().boundingHeight;
}
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
# in der function emoticon(text)
#
		var caretPos = txtarea.caretPos;
		caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
		txtarea.focus();

#
#-----[ REPLACE WITH ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
		if (baseHeight != txtarea.caretPos.boundingHeight) {
			txtarea.focus();
			storeCaret(txtarea);
		}
// End add - BBCodes & smilies enhancement MOD
		var caretPos = txtarea.caretPos;
		caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? text + ' ' : text;
		txtarea.focus();
// Start add - BBCodes & smilies enhancement MOD
	} else
	if ((txtarea.selectionEnd | txtarea.selectionEnd == 0) && (txtarea.selectionStart | txtarea.selectionStart == 0))
	{
		mozInsert(txtarea, text, "");
		return;
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
		if (!theSelection) {
		
#
#-----[ AFTER, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
			if (txtarea.createTextRange && txtarea.caretPos) {
				if (baseHeight != txtarea.caretPos.boundingHeight) {
					txtarea.focus();
					storeCaret(txtarea);
				}
				var caretPos = txtarea.caretPos;
				var text = bbopen + bbclose;
				caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
			} else
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
	else if (txtarea.selectionEnd && (txtarea.selectionEnd - txtarea.selectionStart > 0))
	{
		mozWrap(txtarea, bbopen, bbclose);
		
#
#-----[ REPLACE WITH ]------------------------------------------
#
// Start replacement - BBCodes & smilies enhancement MOD
	else if ((txtarea.selectionEnd | txtarea.selectionEnd == 0) && (txtarea.selectionStart | txtarea.selectionStart == 0))
	{
		mozInsert(txtarea, bbopen, bbclose);
// End replacement - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
		while (bbcode[0]) {
			butnumber = arraypop(bbcode) - 1;
			
#
#-----[ AFTER, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
			if (txtarea.createTextRange && txtarea.caretPos) {
				if (baseHeight != txtarea.caretPos.boundingHeight) {
					txtarea.focus();
					storeCaret(txtarea);
				}
				var caretPos = txtarea.caretPos;
				var text = bbtags[butnumber + 1];
				caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
			} else
			if ((txtarea.selectionEnd | txtarea.selectionEnd == 0) && (txtarea.selectionStart | txtarea.selectionStart == 0))
			{
				mozInsert(txtarea, bbtags[butnumber + 1], "");
			} else
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
		mozWrap(txtarea, bbtags[bbnumber], bbtags[bbnumber+1]);
		
#
#-----[ REPLACE WITH ]------------------------------------------
#
		mozInsert(txtarea, bbtags[bbnumber], bbtags[bbnumber+1]);
		
#
#-----[ FIND ]------------------------------------------
#
		while (bbcode[bblast]) {
				butnumber = arraypop(bbcode) - 1;
				
#
#-----[ AFTER, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
				if (txtarea.createTextRange && txtarea.caretPos) {
					if (baseHeight != txtarea.caretPos.boundingHeight) {
						txtarea.focus();
						storeCaret(txtarea);
					}
					var caretPos = txtarea.caretPos;
					var text = bbtags[butnumber + 1];
					caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
				} else
				if ((txtarea.selectionEnd | txtarea.selectionEnd == 0) && (txtarea.selectionStart | txtarea.selectionStart == 0))
				{
					mozInsert(txtarea, bbtags[butnumber + 1], "");
				} else
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
		if (imageTag && (bbnumber != 14)) {		// Close image tag before adding another
		
#
#-----[ AFTER, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
			if (txtarea.createTextRange && txtarea.caretPos) {
				if (baseHeight != txtarea.caretPos.boundingHeight) {
					txtarea.focus();
					storeCaret(txtarea);
				}
				var caretPos = txtarea.caretPos;
				var text = bbtags[15];
				caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
			} else
			if ((txtarea.selectionEnd | txtarea.selectionEnd == 0) && (txtarea.selectionStart | txtarea.selectionStart == 0))
			{
				mozInsert(txtarea, bbtags[15], "");
			} else
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
		// Open tag
		
#
#-----[ AFTER, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
		if (bbnumber == 16) {
			var url = prompt("{L_BBCODE_URL}", "http://");

			if (url == null) {
				return;
			} else if (!url) {
				alert("{L_BBCODE_URL_ERRORS}" + "\n" + "\n" + "{L_BBCODE_URL_EMPTY}");
				return;
			} else {
				var title = prompt("{L_BBCODE_URL_TITLE}", "");

				if (title == null) {
					return;
				} else if (!title) {
					var text = "[url]" + url + "[/url]";
				} else {
					var text = "[url=" + url + "]" + title + "[/url]";
				}
			}

			if (txtarea.createTextRange && txtarea.caretPos) {
				if (baseHeight != txtarea.caretPos.boundingHeight) {
					txtarea.focus();
					storeCaret(txtarea);
				}
				var caretPos = txtarea.caretPos;
				caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
			} else
			if ((txtarea.selectionEnd | txtarea.selectionEnd == 0) && (txtarea.selectionStart | txtarea.selectionStart == 0))
			{
				mozInsert(txtarea, text, "");
			} else txtarea.value += text;
		} else {
			var text = bbtags[bbnumber];
			if (txtarea.createTextRange && txtarea.caretPos) {
				if (baseHeight != txtarea.caretPos.boundingHeight) {
					txtarea.focus();
					storeCaret(txtarea);
				}
				var caretPos = txtarea.caretPos;
				caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' ' ? caretPos.text + text + ' ' : caretPos.text + text;
			} else
			if ((txtarea.selectionEnd | txtarea.selectionEnd == 0) && (txtarea.selectionStart | txtarea.selectionStart == 0))
			{
				mozInsert(txtarea, bbtags[bbnumber], "");
			} else
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
		eval('document.post.addbbcode'+bbnumber+'.value += "*"');
		
#
#-----[ AFTER, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
		}
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
//-->
</script>

#
#-----[ BEFORE, ADD ]------------------------------------------
#
// Start add - BBCodes & smilies enhancement MOD
function mozInsert(txtarea, openTag, closeTag)
{
        var scrollTop = ( typeof(txtarea.scrollTop) == 'number' ? txtarea.scrollTop : -1 );

        if (txtarea.selectionEnd > txtarea.value.length) { txtarea.selectionEnd = txtarea.value.length; }

        var startPos = txtarea.selectionStart;
        var endPos = txtarea.selectionEnd+openTag.length;

        txtarea.value=txtarea.value.slice(0,startPos)+openTag+txtarea.value.slice(startPos);
        txtarea.value=txtarea.value.slice(0,endPos)+closeTag+txtarea.value.slice(endPos);

        txtarea.selectionStart = startPos+openTag.length;
        txtarea.selectionEnd = endPos;
        txtarea.focus();

        if( scrollTop >= 0 ) { txtarea.scrollTop = scrollTop; }
}
// End add - BBCodes & smilies enhancement MOD

#
#-----[ FIND ]------------------------------------------
#
			  <textarea name="message" rows="20" cols="35" wrap="virtual" style="width:600px" tabindex="3" class="post" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);" onfocus="initInsertions();">{MESSAGE}</textarea><br />
			  
#
#-----[ REPLACE WITH ]------------------------------------------
#
			  <textarea name="message" rows="20" cols="35" wrap="virtual" style="width:600px" tabindex="3" class="post" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);">{MESSAGE}</textarea><br />

#
#-----[ SAVE/CLOSE ALL FILES ]------------------------------------------
#
# EoM
• prof. phpbb-Installation, Reparatur, Rettung nach Hackattacken, sowie PHP/JS Programmierung aller Art
Zend Certified Engineer, Linux Administrator und die Sicherheit von 34 Jahren Programmiererfahrung
• Interesse? Kontakt unter t.birduezen@web-coding.eu

Antworten

Zurück zu „phpBB 2.0: Snippets“