Show Blocks in TinyMce

Montag, September 26th, 2011

Mit dem TinyMce bin ich soweit zufrieden. Er erfühlt zurzeit noch meine Bedürfnisse, doch eins viel mir ein als ich beim CKEditor eine Funktion bemerkte die so in TinyMce nicht vorhanden ist. Mit der Funktion kann man die Elemente im Text heforheben mit einem Rahmen der zeigt welches Element es ist. Leider hat TinyMce von Haus aus nicht dieses Feature und ich hab leider kein Plugin gefunden welches mir diese Funktion gib. So musste ich etwas Hand anlegen und eigenen Plugin schreiben.

Das Ergebnis ist einfach geschrieben, reicht mir vollkommen aus und bietet mir jetzt die Möglichkeit die Elemente mit Rahmen zu versehen wie im Screenshot zu sehen:

Das Plugin benötigt jQuery und kann schnell in den TinyMce integriert werden:

1. Schritt: Plugin hier runter laden und in den tiny_mce/plugins Ordner entpacken.

2. Schritt: TinyMce Config mit dem Parameter showblocks erweitern.

TinyMce Config:

plugins : "pluginA,pluginB,PluginC,...,showblocks",
theme_advanced_buttons1 : "showblocks,|,bold,italic,underline,strikethrough,..."

3. Schritt: Jetzt kann man den Plugin etwas steuern, in dem man im sagen kann ob er schon sofort die Elemente umrahmen soll oder man kann die Hover Funktion abschalten.

show_blocks: 1, // (optional) show blocks by open the editor
show_blocks_hover: 0 // (optional) hover Tag name 1 or show it permanent 0

Viel Spaß.



Firefox Javascript Error Console

Dienstag, Juli 19th, 2011

Seit der Firefox 4 Version, haben sich die Entwickler entschieden die JavaScript Fehler nicht zu zeigen. So hab ich mich gewundert, dass ich voll den sauberen JasvaScript Code schreibe und bei Fehlern keine Error Meldungen in der Console oder dem Firebug sehen kann. Um die Fehler wieder zu sehen, muss man kleinen Eingriff in die Firefox Config machen:

  1. In der Adressleiste about:config eingeben und aufrufen.
  2. Natürlich wird man Vorsichtig sein und es dem Firefox versprechen.
  3. Nach errorconsole filtern.
  4. Mit einem Doppelklick auf den Registry Wert devtools.errorconsole.enabled, kann man ihn auf true setzen.
  5. Alle Firefox Fenster schließen und neu starten.

Jetzt bekommt man wie gewohnt alle JavaScript Fehlermeldungen zu sehen.



TripleSearch mit Google, Yahoo und Bing

Freitag, März 18th, 2011

Hab für mich eine kleine TripleSearch entwickelt auf der API Basis der Suchmaschinen. Schade das Google seine Search API als Deprecated gemeldet hat und die neue 2.0 lässt die Globale Suche nicht mehr zu. Yahoo hat ihre eigene YQL und Bing eine Javascript Schnittstelle.



Elastische Textareas mit jQuery

Freitag, März 11th, 2011

Ich wollte dynamische Textarea haben wie sie in Facebook gibt. So habe ich im Netz nach Lösungen gesucht und bin über mehrere Lösungen/Plugins gestolpert wie hier, hier oder hier, es gibt noch mehr.

Alle diese Lösungen waren mir zu Groß und zu Komplex. Ich möchte nicht noch ein jQuery im jQuery haben, sondern Kurz und Schmerzlos. Dazu waren ein paar Ansätze nicht so Flexibel, da sie die Größe des Textarea an den Umbrüchen des Inhalts bestimmen und das muss wiederum mit ein paar Wrapper CSS Methoden gefixt werden, was wiederum viel eingriff in den Quelltext des Projekts bedeutet.

Die ganzen Unzufriedenheiten haben mich dazu veranlasst selber zu experimentieren. Und nach kurzer Zeit fand ich eine EinfachGenialeLösung so wie eine Axt, sie hat nur ein Beil und Keil das wars!

Mein Ansatz braucht etwas CSS und nur maximal 400Bytes kleinen jQuery Plugin.

textarea.input {
    	width:500px; 
    	line-height:16px; 
    	height:16px; 
}
<textarea class="input" name="name">Dynamischer Inhalt</textarea>
jQuery.fn.elasticArea = function() {
  return this.each(function(){
    function resizeTextarea() {
      this.style.height = this.scrollHeight/2 + 'px';
      this.style.height = this.scrollHeight + 'px';
    }
    $(this).keypress(resizeTextarea)
    .keydown(resizeTextarea)
    .keyup(resizeTextarea)
    .css('overflow','hidden');
    resizeTextarea.call(this);
  });
};
 
$('textarea.input').elasticArea();

Dieser Ansatz funktioniert mit der Eigenschaft scrollHeight. Sie ist sehr Präzise und gibt genau die maximale Höhe der Textarea mit Inhalt. So nehme ich sie, Teile durch die Hälfte und setze sie der Textarea als Höhe ein. Danach wird sie wieder als Textarea Höhe gesetzt. Das macht die Textarea dynamisch in beide Richtungen wenn neuer Text eingefügt oder gelöscht wird und es passiert so schnell, dass man nichts davon mitkriegt.

Das ganze ist Dynamisch und wurde miniklein gehalten. So kann jeder selbst den Code nach seinen Wünschen erweitern falls er noch maximale Höhe haben möchte, die Höhe per Parameter übergeben ohne die CSS an zufassen oder sonstige Schnickschnacks.

Getestet hab ich in gängigen Browsern. Kann sein das irgend wo noch was hängt, aber alle von mir getesteten neue Browser haben es ohne Probleme geschluckt.

Eingesetzt können diese Elastischen Textareas als Input Felder. Weil ohne Inhalt sind sie so groß wie Inputs und können dynamisch mit dem Inhalt wachsen.

Hier ist noch eine Live Demo.

Das wars und mehr brauche ich nicht.



CKEditor onChange Event

Donnerstag, März 10th, 2011

Vor ein paar Wochen habe ich lange nach einer Lösung gesucht und aufgegeben, weil auch die CKEditor Event Seite war mir nicht genug. Heute hab ich es nochmal probiert und fand hier die Lösung:

var ckeditorInstance = CKEDITOR.replace("mytextarea");
 
ckeditorInstance.on("instanceReady", function()
{
	this.document.on("keyup", CKCHANGED);
	this.document.on("paste", CKCHANGED);
}
);
function CKCHANGED() { 
	formchanged = 1;
}

Gebraucht wird die Lösung um zu erkennen ob der User den Inhalt im CKEditor Textarea geändert hat und ihn beim verlassen der Seite zu warnen, dass er sein Code verändert hat ohne gespeichert zu haben. (Ich benutze es mit jQuery)

 
var formchanged = 0;
var submitted = 0;
 
$(document).ready(function() {
	$('form').each(function(i,n){
		$('input', n).change(function(){formchanged = 1});
		$('textarea', n).change(function(){formchanged = 1});
		$('select', n).change(function(){formchanged = 1}); 
		$(n).submit(function(){submitted=1});
	});
});
 
window.onbeforeunload = confirmExit;
function confirmExit()
{
	if(formchanged == 1 && submitted == 0)
		return "Sie verlassen die Seite ohne gespeichern zu haben.";
	else 
		return;
}