begin process at 2010 03 21 06:54:27
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Tutoriaux

 > CRÉATION D'UN ÉDITEUR WYSIWYG

CRÉATION D'UN ÉDITEUR WYSIWYG


 Information sur le tutoriel

Note :
Aucune note

 Description

Ce tutoriel à pour but de montrer comment créer un éditeur riche de type WYSIWYG (WhatYouSeeIsWhatYouGet)

Tutorial

WYSIWYG Editor

Ce tutoriel à pour but de montrer comment créer un éditeur riche de type WYSIWYG (WhatYouSeeIsWhatYouGet)

Création de l’éditeur :

Pour activer le mode édition, il existe la propriété « ContentEditable ».

Pour voir toutes les informations sur cet attribut, http://msdn2.microsoft.com/en-us/library/ms537837(VS.85).aspx

Notre éditeur sera une balise DIV. Son id sera « ortf » afin de pouvoir l’appeler durant les différents scripts.

Structure de notre page :

<html>
<head>
</head>
<body>


<div style="height: 377px" id="ortf" contenteditable="true">
</div>
</body>

</html>

Création de la Toolbar :

Design :

Un éditeur doit contenir une toolbar qui elle-même contiendra différents boutons pour mettre en forme le texte.

Nous utiliserons le CSS & JavaScript afin de le rendre dynamique.
Pour faire simple, créons un tableau à 3 lignes, avec aucune marge. Rajoutons un tableau dans chaque ligne sans attributs particuliers.
Normalement, nous devrions tomber là dessus :

<table style="border-style: outset; border-width: 2px; background-color: #C0C0C0;" cellpadding="0" cellspacing="0">

<tr>

<td>

<table>

<tr>

<td>&nbsp;</td>


</tr>
</table>
</td>

</tr>

<tr>

<td>

<table>

<tr>

<td>&nbsp;</td>

</tr>

</table>

</td>

</tr>

<tr>

<tr>

<td>

<table>

<tr>

<td>&nbsp;</td>

</tr>

</table>

</td>

</tr>

<tr>

</table>


Le style du tableau principal est en 3D, avec un bord de 2px de couleur grise.

Chaque cellule des tableaux intermédiaires contiendront les boutons de mise en forme du texte.
Pour donner un effet de style, il faudrait que les boutons changent de couleur lors du passage de la souris.
Ainsi donc, il faudrait faire un script sur les événements « OnMouseOver » (Souris dessus) et « OnMouseOut » (Souris sortie).
Les fonctions doivent avoir comme argument la cellule qui les appelle. Nous mettrons donc comme argument l’objet « this »

<script language="javascript" type="text/javascript">
// Curseur sur la cellule
function btn_on(obj){

obj.style.background="#99CCFF";

obj.style.border="1px solid #808080";

}

// Le curseur quitte la cellule
function btn_off(obj){

obj.style.background="#C0C0C0";

obj.style.border="1px solid #C0C0C0";

}
</script>

[...]

<td style="padding: 2px; cursor: pointer; border: 1px solid #C0C0C0; background-color: #C0C0C0;" onmouseout="btn_off(this)" onmouseover="btn_on(this)">


Le style de la cellule passé par l’attribut « Style » est le style par défaut. C’est celui qui sera restitué par la fonction « btn_off() ».

Script :

Pour interagir avec le Div éditable, il existe la fonction « ExecCommand ».
Pour l’utiliser, il faut l’appeler par l’intermédiaire du document du Div.

Cette fonction possède 3 arguments. La première, cmdID, est le nom de la commande à effectuer.
Les deux autres sont facultatives. Nous reviendrons dessus plus tard.
Récapitulatifs des commandes basiques: (Pour une liste plus exhaustive, http://msdn2.microsoft.com/en-us/library/ms533049(VS.85).aspx)

cmdID

Description

Bold

Gras

Italic

Italique

Underline

Souligné

StrikeThrough

Barré

JustifyLeft

Aligné à gauche

JustifyRight

Aligné à droite

JustifyCenter

Centrer

JustifyFull

Justifier

InsertUnOrderedList

Liste à puce

InsertOrderedList

Liste chiffrée


Afin de centraliser les commandes, nous allons créer une fonction, la fonction « formatage ».
Elle aura pour argument le cmdID à appliquer au texte, et un autre argument que nous utiliserons plus tard.

function formatage(action,autre){
var ob = document.getElementById("ortf");
ob.document.execCommand(action,false,autre);
}


Ajouter donc à chaque cellule l’attribut « OnClick="formatage(‘cmdID’,’’) ;" », ou cmdID fait référence à une commande du tableau précédent.

Il faut maintenant pouvoir choisir la police ou la taille du texte.
Pour ce faire, il nous faut créer 2 dropdowns. Un nommé « cmbpolice » et un « cmbtaille ».
Remplir le premier avec différents noms de police, et le deuxième avec des chiffres allant de 1 à 7.

L’application d’une police se fait avec la commande « FontName ». Le nom de la police est passé dans le 3eme argument de ExecCommand, soit dans le 2eme argument de notre fonction.
Ainsi donc, dans l’événement OnChange, il faut appliquer la commande FontName et la valeur du dropdown.
Il en va de même avec la taille de la police, où la commande est FontSize.

<select name="cmbpolice" onchange="formatage('FontName',this.value)">
<option selected="">Police</option>

<option value="Arial">Arial</option>

<option value="Verdana">Verdana</option>

<option value="Courier New">Courier New</option>

<option value="Time New Roman">Time New Roman</option>

<option value="Comic Sans MS">Comic Sans MS</option>

</select>


<select name="cmbtaille" onchange="formatage('FontSize',this.value)">

<option selected="">Taille</option>

<option value="1">1 (petite)</option>

<option value="2">2</option>

<option value="3">3 (normale)</option>

<option value="4">4</option>

<option value="5">5</option>

<option value="6">6</option>

<option value="7">7 (grande)</option>

</select>


Pour ce qui est de la couleur du texte, rien de bien compliqué !
Il suffit de faire un pop-up avec un sélecteur de couleur. Sauf que le bouton pour valider appel la fonction de l’opener, avec comme commande soit « FontColor » pour la couleur du texte, ou « BackColor » pour le sur lignage du texte, avec bien sure en 2eme argument la couleur au format hexadécimal.
(Pour ce qui ne verrait pas : opener.formatage("FontColor",CouleurSelectionée") ;)

Travailler avec des objets :

Nous avons vu l’essentiel du formatage.
Maintenant, il est intéressant de s’attaquer aux objets. Mais, que sont les objets ? Ben, les images, les formulaires, …

Pour les insérer, vous avez bien sure des commandes déjà toutes prêtes. Mais, comment faire lorsque l’on veut que ces objets aient des attributs spécifiques ?
Et bien, il va falloir utiliser les textRanges.
Les textRanges sont des fonctions qui marchent avec la sélection du texte.
Par exemple, la charnière de notre script pour les objets sera : var range = document.selection.createRange();.
Nous travaillerons ensuite avec l’objet range. Plus particulièrement avec la fonction pasteHTML et la propriété htmlText.

pasteHTML colle du texte à l’endroit ou se trouve le curseur ; htmlText retourne le texte sélectionné.

Ainsi, pour insérer une image, il faudra faire range.pasteHTML("<img src=’mon_image.png’>") ;
Mais, pourquoi ne pas utiliser la fonction de base ?
Tout simplement parce que si je veux ouvrir un pop-up qui permet de paramétré tous les attributs de l’image, et bien, j’ai un accès direct à ce que je vais insérer.
Si vous avez par exemple des cadres prédéfinis et que vous voulez en entourer le texte sélectionné, et bien il suffira de faire range.pasteHTML("<balise aa=’bb’ cc=’dd’>" + range.htmlText + "</balise>") ;Nos fonctions aurons donc cette allure si vous avez bien suivit ^^

function encadrer(b1,b2){
var ob = document.getElementById("ortf");
var range = ob.document.selection.createRange();
range.pasteHTML(b1 + range.htmlText + b2);
}


function ajouter_objet(objet){
var ob = document.getElementById("ortf");
var range = ob.document.selection.createRange();
range.pasteHTML(objet);
}

Poussons le bouchon plus loin :

Un truc assez sympathique à faire, c’est de savoir si le texte ou le curseur se trouve est en gras ou non. (Ou dans d’autres états bien sure).
Si c’est le cas, et bien hop ! On met le bouton « Gras » d’une couleur différente affin de montrer qu’il est actif.

Pour réaliser ceci, il faut utiliser la fonction queryCommandValue.
Cette fonction retourne false ou true, et n’accepte qu’un seul argument : celui de la cmdID à vérifier.
Il faut créer une fonction sans argument qui testera tous les styles souhaité (Gras, Italique, Souligné,…) et de traiter le bouton correspondant par la suite.
Petit retour en arrière : Il faut pour cela nommé avec l’attribut « id » les boutons correspondant. Ainsi, pour le bouton Gras, id="btn_bold", pour l’italique, id="btn_italic".

La fonction regarde le style, si true, alors btn_on(document.getElementById("act_"+cmdID_testé));.

On peut ainsi rendre plus dynamique et plus agréable notre éditeur.

function tester(){
var ob = document.getElementById("ortf").document;
if(ob.queryCommandValue("Bold")){
btn_on(document.getElementById("act_bold"));
}
// Rajouter de même toutes les commandes à tester
}


Il faut appeler cette fonction avec les évènements onclick & onkeydown du Div.

Oups !

Si vous appuyé sur entré et que vous dépassé le cadre du div, vous verrez celui-ci s’agrandir :(
Pour éviter ce petit « désagrément », il faut rajouter un objet de style au div : l’objet overflow:scroll.

Ainsi, quand le texte dépassera la zone, il mettra des scroll bars au lieu de nous faire un petit auto-resize.

Les positions :

Rassurez-vous, pas le Kâma-Sûtra ! (Pour les coquins, www.kamasutra.fr/ ^^)

Une autre commande toute bête : ‘AbsolutePosition’. Met en position absolue l’objet sélectionné.
Mais, pour que cette fonction soit optimale, il faut rajouter dans une fonction d’initialisation la commande ‘2D-Position’ : permet le déplacement par tiré-déplacé.

Un petit peu plus loin :

Bon, si vous n’êtes pas perdu dans mes expliquassions quelque peut farfelus, on va passer à une autre étape : les modifications directes.

Ceci permet de modifier « en Live » les attributs de l’objet sélectionné.
Par exemple, pour rajouter/modifier des objets CSS à un objet.

Pour ce faire, il faut utiliser l’objet « document.ActiveElement », et, choisir les caractéristiques à changer.
Après, à vous de créer une fonction qui par l’intermédiaire d’un pop-up va configurer comme vous le souhaité votre objet.

And to finish :

Pour finir, il est en général utile de récupérer le texte édité.
Pour le récupérer, rien de plus simple !

function getHTML(){
var ob = document.getElementById("ortf").document;
retun ob.innerHTML;

}


J’en ai finis avec mon tutoriel ; j’espère qu’il vous a plut !

Si jamais vous avez des questions, n’hésiter pas !

MrReivax

 Historique

14 février 2008 18:15:58 :
Probleme avec la conversion Word 2007 -> Site
14 février 2008 18:16:36 :
Probleme de mise en page

Commentaires

Commentaire de derceto_lamartine le 09/03/2008 17:18:16

Bonjour
Merci pour ce tutorial, il est très intéressant, même si j'ai quelques problèmes pour l'appliquer. Je ne comprends pas comment interagir avec :
<div style="height: 377px" id="ortf" contenteditable="true">
</div>
Généralement, les wysiwyg que j'ai rencontré utilisent un texte area, ici ce n'est pas le cas, est ce  normale ?

D'autre part est ce que tu pourrais mettre un fichier d'exemple qui retrace toutes tes explications ? Cela m'aiderait beaucoup.
Encore bravo pour ce tuto
Bonne journée
Nicolas

Commentaire de Mrreivax le 09/03/2008 17:43:58

Et bien, pour intéragir avec le div, il faut simplement faire: var ob = document.getElementById("ortf")
Ainsi, ta variable ob contiendra toutes les méthodes & propriétés du dit DIV

Voila, si t'as encore des questions, je suis la

Commentaire de derceto_lamartine le 09/03/2008 18:21:30

Bonjour,
Merci d'avoir répondu si rapidement. En fait je me suis mal exprimé. Je n'avais pas vu la propriété ContentEditable du div (même si je sais que tu en parles, ma faute... désolé)
Elle marche très bien sous Internet explorer 7.0, par contre sous firefox elle ne semble pas vouloir fonctionner. Est ce que c'est aussi le cas chez toi ? Si c'est le cas, est ce que le fait d'utiliser un texte area avec un formulaire à la place du div pourrait résoudre ce problème ?
Merci d avance
Nicolas

Commentaire de Mrreivax le 09/03/2008 18:25:39

Cet éditeur WYSIWYG est spécialisé pour IE *.
Utiliser un textarea à la place du div ne changera strictement rien, puisque pour FireFox, il ne faut pas utiliser la propriété "ContentEditable", mais une autre (je ne l'ai pas en tete désolé).
Mais je pense que tu pourras trouver des indications sur le sote si tu veux en faire un compatible avec le renard ^^

Commentaire de derceto_lamartine le 09/03/2008 18:54:20

Est ce que tu sais si les fonctions createRange(); execCommand(); sont aussi spécialisées pour IE ou ça marche aussi sur Mozilla ?
Merci d avance

Commentaire de Mrreivax le 09/03/2008 20:57:34

Il me semble que execCommand fonctionne aussi sur Mozilla, mais cela n'est qu'une supposition. Après, je pense que tu pourras trouver tes réponses en fouillant un peu sur le site

Commentaire de TheCamel le 16/03/2008 12:37:29

Pourrait-tu mettre le code entier s'il te plait ?

Merci

Commentaire de bultez le 04/06/2008 09:18:48

contenteditable et createRange sont exclusifs IE.
pour être compatible il faut utiliser un iframe
avec designMode='On'
execCommand fonctionne pour tous.
regarde dans les sources, il existe des exemples
multi-navigateurs ( ne serait-ce que le mien ! )
@+

Commentaire de Mrreivax le 04/06/2008 11:10:15

lol!
Et oui, mais je suis pro IE, c'était juste une ébauche pour que les gens puissent ensuite faire des recherches eux meme. C'était juste pour montrer le principe type!

Commentaire de toupic le 27/06/2008 05:33:02

Clair, net et précis

Commentaire de zoby44 le 26/11/2008 19:21:54

Super, je ne connaissait pas contenteditable et je sent que ça va bien me servir. Chez moi ça fonctionne avec Firefox 3 et Chrome. Merci.

Commentaire de longshot41 le 19/03/2009 22:18:16

Hello
Si jamais pour compléter
http://www.venezchezmoi.fr/2008/06/04/creer-un-editeur-wysiwyg-pour-un-formulaire/

Commentaire de sariline le 26/04/2009 21:40:51

salut
Merci, merci bien pour ce tuto
mais j'ai vraiement un grand sessue ....  ):
j'ai pas de recuperer le contenu pour le enregistrer dans la base de donnée

Merci

Commentaire de johnra le 06/08/2009 16:22:40

Ce tuto m'a donné envie de coder de nouveau en js pour découvrir les nouvelles(? j'utilisais des 'Active X') cmds et je vous en remercie.10/10 pour ce site !  

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,078 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales