WYSIWYG (Werkzeugleiste?) mit JS : FireFox Problem

Skippy

Mitglied
Hallo Forum,

Während ich hier diesen Text schreibe, gibt es 4 cm weiter oben viele tolle Knöpfe, um den Text Dick zu machen, kurisv, farbig, usw.

Sowas wollte ich für eine Seite die ich gerade mache auch haben, also fing ich an zu googlen.
Was ich bisher erfuhr war:

- WYSIWYG = What You See Is What You Get (Ist angeblich der Begriff für diese Werkzeugleiste)
- Es geht nur mit Javascript

So konnte ich zumindest mal meine Suchbegriffe verfeinern.
Nachdem ich dann nun einiges gesucht habe, viele Links anklickte, auch die Englischen Sachen durch las, sowie probierte experimentierte und es nicht funktionierte, entschied ich mich doch mal hier nach Hilfe zu fragen.

Ich benütze den Mozilla FireFox 3.6.8

Die Hauptsächlichen Codes die ich benutzt habe sind folgende:


1. Von dieser Seite und der nächsten glaub oder so
http://www.devguru.com/features/tutorials/wysiwyg/wysiwyg1.asp

Problem: Das Textfeld lässt sich garnicht erst anklicken, es erscheint kein Schreib-Cursor und wenn ich einfach was eintippe passiert auch nix, sowie beim klicken

Codeschnipsel von Seite 2:
Code:
<html>
<head>
<title> Using execCommand to bold text </title>
<script language="JavaScript">

function Init()
{
iView.document.designMode = 'On';
}

function boldIt()
{
iView.document.execCommand('bold', false, null);
}

</script>

<body onLoad="Init()">
<iframe id="iView" style="width: 200px; height:70px"></iframe>
<br><br>
<input type="button" onClick="boldIt()" value="Toggle Bold">
</body>
</html>

2.
http://www.tutorials.de/content/697-der-wysiwyg-editor.html

Problem: Text lässt sich zwar in das Feld schreiben, wenn ich allerdings auf einen der Buttons klicke passiert nichts... Text ist nichtmehr markiert und formatieren tut sich auch nix.
Hier hab ich übrigends auch mal versucht die zeichen wie z.B. ' ´ ` " und so durch die zu ersetzen von denen ich weiss, dass sie bei meinem Editor garantiert funktionieren, ohne Erfolg


Code:
Code:
<HTML>
<HEAD>
<style type=“text/css“>
#div{
	height:200px;
	width:100%;
	border:1px solid #7d7d7d;
        visibility:hidden;
}
</style>
<script language=”javascript”>
function schreibeintextarea() {
      document.getElementById("textarea").style.visibility='hidden';
      document.getElementById("div").style.visibility='visible';
      document.formular.textarea.value = document.getElementById("div").innerHTML;
}
function formatieren(befehl,inhalt) {
 	div.focus();
 	document.execCommand(befehl, false, inhalt);
}
</script>
</HEAD>
<BODY>
<button OnClick=”formatieren(‘bold’,’’)”>Fett</button>
<button OnClick=”formatieren(‘italic’,’’)”>Kursiv</button>
<button OnClick=”formatieren(‘FontSize’,’7’)”>Schriftgröße 7</button>
<div id=”div” contenteditable>
</div>
<form name="formular" action="" method="post">
<textarea name="textarea" id="textarea">
</textarea>
<input OnMouseOver="schreibeintextarea()" type="submit" value="Abschicken">
</form>
</BODY >
</HTML>

3.
http://www.homepage-total.de/bausteine/bausteine4.php#bs_9

Problem: Dieser Code tut jetzt nicht genau das was ich suche, sondern ledeglich einen markierten Text in die Leiste einfügen, allerdings funktioniert das auch!
evtl. dachte ich mir, da einfach ein wenig etwas ändern zu können damit das den gewollten Zweck erfüllt, leider bin ich nur kein JavaScript kenner, ich arbeite mit PHP und HTML =(


Code:
Code:
<script type="text/javascript">
// Markierten Text in das Eingabefeld einfügen
function markierterText() {
 if (window.getSelection)  {
   document.Formely.auswahl.value = window.getSelection();
 } else if (document.getSelection) {
   document.Formely.auswahl.value = document.getSelection();
 } else if (document.selection) {
   document.Formely.auswahl.value = document.selection.createRange().text;
 }
}
</script>

<form name="Formely" action="">
<em>Viel Text um dieses Beispiel zu demonstrieren.</em></span><br>
<input type="text" name="auswahl" size="45">
<input type="button" value="Markierten Text einfügen" onClick="markierterText();">
</form>


Read more: http://www.homepage-total.de/bausteine/bausteine4.php#bs_9#ixzz0whnb8L1j

4.
http://www.php-resource.de/forum/php-developer-forum/11069-markierten-text-aendern.html

Problem: Wenn ich da auf das "Fett" drücke, kommt ledeglich ein kleines Fehler-Fenster-PopUp ohne Text mit einem "OK" Button, am Text ändert sich nichts...

Code:
Code:
<html><head><title>Test</title>
<script type="text/javascript">
<!--

   
function macheFett(v) {
   if (window.getSelection) alert(window.getSelection());
   else if (document.getSelection) alert(document.getSelection());
   else if (document.selection) {
        var str = document.selection.createRange().text;
        document.bla.message.focus();
        var sel = document.selection.createRange();
        sel.text = "<" + v + ">" + str + "</" + v + ">";
   }
}

//-->
</script>
</head><body>
Markieren und auf Fett klicken ... dann wird alles schoen:
<form name=bla>
<a href="javascript:macheFett('B')">Fett</a>

<textarea name="message" rows=12 cols=52>
</textarea>

</form>
</body></html>

5. Von dieser Seite
http://www.oreillynet.com/pub/a/javascript/2001/12/21/js_toolbar.html

Problem: Der Code ist hier leider nicht drin, weil das der erste Code war den ich getestet und im Editor leider schon überschrieben habe. Aber es war ebenfalls so, dass der Text sich einfach nicht geändert hat, wenn man irgendwas drückte.

Code:
Code:
Da bin ich jetzt gerade etwas zu faul um den zusammen zu setzen, sieht aber am vielversprechensten aus finde ich


Da ihr nun von meinem Problem wisst, könntet ihr mir ja vieleicht helfen.
Habt ihr eine Idee warum das nicht klappt oder was ich falsch gemacht habe?
Über eine Antwort wäre ich euch mega dankbar!

MfG Skippy
 
Du hast ja richtig Gebrauch von den Formatierungsmöglichkeiten hier gemacht ;)

Wie wärs denn, wenn du einen fertigen benutzt? Zum Beispiel TinyMCE oder CKEditor.
Oder geht es dir nur um den Hintergrund der Editoren?
 
Naja einmal geht es darum, dass es kommerziell genuzt wird, und da ist das soweit ich weiss immer ein kleines Problem.

Das Ding ist für ein Admin-Tool (Fenstergröße klein + fast alles mit CSS vordefiniert und nicht änderbar) und braucht nur die Funktionen Fettdruck, Kursiv, Unterstrichen und Link, evtl. kommt mal ein Bild dazu.

Als nächstes ist es auch wahr, dass mich der Hintergrund der Editoren interessiert =) da kommt in Zukunft vieleicht noch mehr!

Ich möchte das halt klein haben und durchschaubar.
 
:D:D:D Hallo Skippy,

der vorschlag von meinen VP ist garnicht so schlecht, warum?
geh mal meine Beitragsliste durch und schaue nach Titeln wo was von execCommand, WYSIWYG oder Editor steht, und lese dann mal die Fragen, du wirst sehr schnell feststellen,
das die ganze execCommand API der größte Haufen Sche*ße ist den es nur geben kann.

Die ganze API unterscheidet sich so gigantisch bei den einzelen Browsern das du der absolute Javascript Guro sein musst um für alle Probleme eine Lösung zuhaben.

Ohne Sven wäre ich kein Stück weiter gekommen denn es gibt für die Probleme keine Lösung die man ergooglen kann, da wird nur rum getrickst, um dir das besser vorstellen zu können schau dir einfach alle Beiträge dazu in meiner Liste an.

Also lieber eine fertige Lösung benutzen bevor du dich selber den unlösbaren Problem stellst.

PS:Bin früher schon weit gekommen, die basis funktionen B,I,U und Smileys waren kein Problem, und wurden nach 4-6 Wochen lernen und 100 Tricks, auch in allen Browsern richtig dargestellt:), dann habe ich es aufgegeben, weil der Code schon kurz vor der Explosion stand (Spagetticode), und meine Nerven natürlich auch, aber vielleicht hilft es dir ja :)

Oder du baust die keinen WYSIWYG Editor sondern einen normalen der [*B*] einfügt,
so einen zu bauen ist leichter als einen Baby den Schnuller weg zu nehmen :)

gruß.one6666
 
Moin,

das Problem ist, du hast viel gefunden, aber nicht genug :)

Diese Technik wurde ja von Microsoft eingeführt, und Mozilla waren die ersten, die dort auf den Zug aufgesprungen sind, andere folgten.
Allerdings ist die Umsetzung in den diversen Browsern ein klein wenig Unterschiedlich.
Das geht los beim Ansprechen des Dokumentes und endet beim erzeugen von Ranges.

Die am Einfachsten zu durchschauende und alle Basics umfassende Variante, die ich kenne, gibt es schon viele Jahre bei Mozilla zu finden, und sie ist mit allen aktuellen Browsern kompatibel(ich kenne zumindest keine Ausnahme).


http://www.mozilla.org/editor/midasdemo/

Der Quelltext sollte dir alle notwendigen Infos vermitteln :)
 
Hi Sven,

um den Code lesen/verstehen zu können muss man schon ein Javascript Guro sein,
wenn er den Hintergrund verstehen will muss er schon selbst einen entwickeln,
wird dann verstehen das es keinen Sinn macht, und wird einen fertigen benutzen ;-)

Wenn du das schreibst wirkt das so easy:D

Fangen wir doch mal ganz von vorne an, ein Textfeld erstellen,
dafür haben wir 2 möglichkeiten iframe+designMode oder div+contentEditable:)

Beide haben die selben Probleme, also neben wir für die alten Browser mal den Weg mit dem iframe.

  • Das erste was auffält sind die Zeilenumbrüche wenn man drin schreibt, der eine Browser benutzt <br>´s der andere Browser benutzt <p>´s für die Umbrüche.

    Das kann man so nach einer festen Regel nicht ändern, mann kann nur die <p> TAG´s über CSS so aussehen lassen wie ein <br> TAG, so sehen in allen Browsern die Umbrüche gleich aus, klinkt jetzt einfach aber versteh als Anfänger erstmal das die Browser da unterschiedliche Wege gehen und komm mal auf die Lösung,
    mir hatte Sven glaube ich damals überhaupt erstmal gesagt das der eine <p> TAG´s einfügt und der andere <br> TAG´s:D
  • Der erste Punkt ist gleich der nächste, denn jetzt ist es nötig extra eine iframe.html Seite anzulegen um überhaupt die CSS Angaben für das TAG Problem angeben zu können,
    so geht das mit dem Spagetticoden los:D, man kann zwar bestehende CSS Sachen ändern aber setze mal auf ein Document was es garnicht gibt CSS eigenschafften :D Soll aber möglichsein nehnt sich DOM CSS oder Javascript CSS habe es aber nie verstanden und ist schlecht Dokumentiert:( Könntest aber auch die möglichkeit mit dem div+contentEditable nutzen, die hat aber auch so viele Probleme das viele den Weg mit dem iframe vorziehen,
    würde aber das Problem lösen:D
  • So nachdem wir jetzt einen Bereich haben in dem wir schreiben können und der auch die Umbrüche in allen Browsern gleich darstellt fällt noch was auf, in manchen Browsern
    sieht man den blinckenden Strich beim anklicken des Textbereichs garnicht,
    gibt dafür auch keine Lösung die im Internet stehen, Sven hatte dafür natürlich wie immer eine Super Idee einfach ein Leerzeichen einfügen, da das Zeichen erst dann kamm wenn schon Text drinne stand, die Lösung war genial :)
  • So jetzt fält noch auf das der Text nicht gleichmäsig an der Linken Oberen Ecke startet,
    also müssen dafür auch noch CSS Eigenschafften gesetzt werden, ist wohl die leichteste Lösung gewese:)
  • Wer glaubt das wäre alles der Irrt, den wir haben ja zum start die <p> TAG so aussehen lassen wie einen <br> TAG, damit später aber alle User die selbe Ausgabe sehen müssen wir den ganzen Inhalt durchsuchen und mit Regulärenausdrücken natürlich noch alle <p> TAG´s gegen <br> TAG´s austaschen:), das wiederum kann Probleme machen,
    da manchmal auch vielleicht <p> TAG´s gebraucht werden so müsste man diese TAG´s noch so makieren das man sie dann später wieder aussortieren kann:)

Wir haben jetzt nur das reihne Textfeld, das muss man sich mal auf der Zunge zergehen lassen, Sven ist hier der beste Javascriptler wenn er sagt das ist einfach dann ist das für normale Menschen unerreichbar:)
 
Naja, ich würde einfach nicht alle genannten Probleme auf Javascript abwälzen.

Der Editor soll ja dem Nutzer eine einfache Möglichkeit der Textformatierung geben, mehr nicht.

Dass die diversen Browser dort unterschiedliche Tags einsetzen, ist zwar richtig, aber kein grundlegendes Problem, denn auf der verarbeitenden Seite(serverseitiges Skript) gehört das ganze eh noch geparst und validiert, und meistens gar in BB-Codes übersetzt, und das wird dann viel einfacher, als es direkt bei der Eingabe zu Tun :)
 
An Javascript liegt das bestimmt nicht, liegt immer an den Browsern,
egal was man macht HTML/CSS oder Javascript,
Maik hatte nicht ohne Grund 30 000 Beiträge, wenn die Browser alles richtig und einheitlich Interpretieren würden, hätte Maik sicherlich schon vor 5 Jahren gesagt "Bin Weg":D

Genau aus dem Grund steht in meiner Signatur Flash Rocks!
ich selber habe mit Flash nicht viel am Hut, weiß aber die vorzüge zuschätzen,
man Programmiert einmal was und es funktioniert überall,
bei HTML/CSS und Javascript geht mehr Zeit für das Fehlersuchen drauf als für das Entwickeln.

Manchmal wenn die Apple Fan Boy´s so richtig aufdrehen wollen sie einen noch erzählen das man als Javascript Entwickler keine Browserweichen braucht, klar wenn ich nur für den Safari meine Seiten entwickle soll das wohl stimmen:)

Wenn es nach mit geht würde ich dir ratten Code dir so einen Editor mit Flash,
du lernst schneller Actionscript 2 als das du so einen WYSIWYG Editor mit Javascript baust,
ach was hast sogar noch Zeit mit einen Heißluftballon um die Weltzufliegen:)

Aber werde ja nie gefragt:)
 
Schonmal riesen dank für eure Antworten.

Also ich merke schon, ich werd mir wohl dafür einen fertigen holen müssen weil sich der Aufwand nicht lohnt sowas selber zu machen, da vertrau ich euch einfach mal =)

Aber:
Oder du baust die keinen WYSIWYG Editor sondern einen normalen der [*B*] einfügt,
so einen zu bauen ist leichter als einen Baby den Schnuller weg zu nehmen :)

gruß.one6666

Das würde mir wohl in dem Fall schon reichen, mit einem "Vorschau" Knopf könnte ich das hinkriegen, dass der Kunde sieht was er tut und sich nicht denkt "das ist totaler mist mit den ganzen zeichen und alles und ich hab keine Ahnung wie das aussieht".
Das ganze muss halt in ner <textarea> stehen weils per PHP und MYSQL in ne Datenbank muss.

Habt ihr mir den dafür ein Tipp?
Also das sichtbar <tags> eingefügt werden?

Wenn ich endlich mein dickes AS3 Buch gelesen hab kann ichs ja mal damit versuchen =D aber bis dato brauch ich halt was.

MfG Skippy
 
Es werden immer sichtbare TAG´s dargestellt,
da eine <textarea> garnicht in der Lage ist HTML darzustellen,
darum müssen die WYSIWYG Editoren auch den Umweg über contentEditable oder designMode gehen:)

Mit innerHTML() kannst du den bestehenden Inhalt auslesen oder den neuen reinschreiben zb. bei einen onclick eines B Button dann innerHTML("<b></b>");

Das einzigste was bisschen kompliziert ist, ist das mit den markierten Text,
aber dafür gibt Javascript dir eine Methode -> http://de.selfhtml.org/javascript/objekte/document.htm#get_selection , der ganze Rest ist Babykramm (function, ifelse usw.)

gruß.one6666
 

Neue Beiträge

Zurück