cs_bultez
Messages postés13615Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention15 octobre 2013
-
3 avril 2007 à 11:36
cs_bultez
Messages postés13615Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention15 octobre 2013
-
8 avril 2007 à 12:30
Bonjour à toutes et à tous,
j'aimerais ajouter aux caractères sélectionnées dans une iframe
une balise html. tel que ci-dessous, elle n'est "pas interprétée"
mais "affichée comme du texte".
c'est probablement simple (?) mais je tourne, retourne, reretourne...
et ne trouve pas de solution.
<script type="text/javascript">
Fen=document.getElementById("saisie")
Champ=Fen.document
Champ.body.innerHTML="<label style='background-color:#FFFFAA'>exemple</label> mot un autre ... "
function trait()
{
sel = Champ.selection.createRange()
sel.text = "<label style='background-color:#FFCC99'>"+sel.text+"</label>"
}
</script>
uniquement avec IE ici, il faudra que je la rende compatible avec
les autres navigateurs.
si vous avez la réponse : elle est bienvenue...
PROTECTIONNISTE
Messages postés67Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention23 septembre 20081 3 avril 2007 à 14:39
C'était juste pour te montrer que ça fonctionne ainsi ... c'est peut être pas exactement comme tu le souhaite mais au moins de cette façon les balises sont utilisé et non pas inscrite ... A toi de retravailler le script pour avoir ce que tu veux.
le div c'est que je n'utilise pas les label, et j'ai fais un copier coller de ton script .
nickadele
Messages postés1251Date d'inscriptionmercredi 7 août 2002StatutModérateurDernière intervention10 avril 2013 3 avril 2007 à 17:03
Voilà qui est plus claire comme explication.
A mon avis le plus simple serait de reprendre les fonctions du Wysiwyg que tu utilises, comme le suggère roro06.
J'ai du faire ça un jour pour intégrer mes propres fonctions dans un éditeur, j'était effectivement passé par la fonction execCommand qui te fait ça à merveille. Le problème était la compatibilité, car le système était réservé à IE.
Donc la solution : editdoc.execCommand(cmdID);
Si mes souvenirs sont bons, tu ne dois pas t'occuper de savoir ce que l'utilisateur à sélectionné, la commande s'en charge.
Un exemple : http://www.a525g.com/programmation/_code/dhtml_zones_editables.htm
Nickadele
----------------------------------------------
non, ma belle ne s'appel pas Adèle
cs_roro06
Messages postés732Date d'inscriptionjeudi 2 janvier 2003StatutMembreDernière intervention29 octobre 2007 3 avril 2007 à 17:25
Bonjour
pour l'info, execCommand n'est pas reservé à IE. FF et Opera l'implémentent également, mais de manière un peu différentes chacun (certaines options sont reconnues, pas d'autres, etc ..). du coup, il est necessaire de tester chaque option sur chaque browser ... du pur bonheur !!
PetoleTeam
Messages postés3426Date d'inscriptionlundi 26 décembre 2005StatutMembreDernière intervention14 janvier 201117 3 avril 2007 à 20:53
B onsoir à tous...
Je viens mettre ma contribution on ne sait jamais, je vous livre un exemple de code
<html>
<head>
<script type="text/javascript" language="JavaScript">
//-------------------
function Init_Frame(){
var Fen = document.getElementById("saisie")
var Edit = Fen.contentWindow.document;
var Edit = window.frames['saisie'].document;
if( !Edit.body){
setTimeout('Init_Frame()',50);
}
else {
Edit.body.innerHTML = "<label style='background-color:#FFFFAA'>exemple</label> mot un autre ... ";
}
}
//--------------
function trait(){
var Obj = document.getElementById("saisie");
if( Obj){
var Edit = Obj.contentWindow.document;
//-- recup du contenu
var Chaine = Edit.body.createTextRange().htmlText;
//-- recup la selection
var szSelect = Edit.selection.createRange().htmlText;
//-- Cree un double et insert la Mark ou est le curseur
var szMark ="~#~";
var szTmp = Edit.selection.createRange().duplicate();
szTmp.text = szMark;
//-- Recup. la position du curseur
var PosDeb = Edit.body.innerHTML.search(szMark);
//-- Recup. des Chaines
var szAvant = Chaine.substring( 0 , PosDeb);
var szApres = Chaine.substring((PosDeb +szSelect.length), Edit.body.innerHTML.length );
//-- Insertion du texte
Edit.body.innerHTML = szAvant + "<label style='background-color:#FFCC99'>" + szSelect +"</label>" +szApres;
}
}
</script>
</head>
</html>
...je vous rassures ça BUG si l'on fait plusieurs fois la manip mais bon pour continuer à chercher c'est neuronal...
Je pense que l'idéal serai de jouer avec les createElement et autre appendChild mais encore faut il récupérer le noeud parent de la sélection...
Allez bonne PROG !
;0)
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_bultez
Messages postés13615Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention15 octobre 201330 5 avril 2007 à 08:56
... résolu ?
un setTimeout et tout semble baigner ( avec IE, car FF quelques soucis encore,
mais je vais poser une autre question ), nul besoin d'ajouter ni id, ni fonction.
PROTECTIONNISTE
Messages postés67Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention23 septembre 20081 3 avril 2007 à 13:00
Je crois que par sécurité ce n'est pas faisable en faite tu peux ajouter un saut de ligne \n ou un retour chariot \r.
En faite tu peux faire les même chose que tu ferais dans une alert ... donc pas de gras pas d'italic ni autre ...
Enfin une solution peut être est de récupérer dans une variable ton Champ + createRange() et la charger dans un div avec nomdudiv.innerHTML
cs_bultez
Messages postés13615Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention15 octobre 201330 3 avril 2007 à 13:52
y'a des trojans partout ! mais dans un createrange ? faut pas rire....
de toutes manières et encore une fois, rien à voir avec ma question
qui reste l'interprétation ou pas d'une balise.
ça marche logique, je t'ai dis dans ma réponse que tu pouvais réecrire dans en utilisant un div et
innerHTML, mais le createRnage ne t'ajoutera pas directement du HTML, je vais te faire la source vite fais pour que tu puisse comprendre je re ...
>>ça marche
ben oui, donc pas de problèmes de sécurités alors....
>>
je vais te faire la source vite fais pour que tu puisse comprendre
comprendre quoi ? je pense avoir compris.
ce que j'aimerais, c'est remplacer "un mot" par "un mot"
dans une iframe, quitte à passer par ce que tu veux.
PROTECTIONNISTE
Messages postés67Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention23 septembre 20081 3 avril 2007 à 14:23
<script type="text/javascript">
Fen=document.getElementById("saisie")
Champ=Fen.document
Champ=Fen.document
Champ.body.innerHTML="
<label style='background-color:#FFFFAA'>exemple</label> mot un autre ...
"
function trait()
{
output="test";
sel = Champ.selection.createRange()sortie document.getElementById('texte').innerHTML ""+sel.text+"";
}
</script>
PROTECTIONNISTE
Messages postés67Date d'inscriptionjeudi 30 janvier 2003StatutMembreDernière intervention23 septembre 20081 3 avril 2007 à 15:06
>>>pas exactement comme tu le souhaite
>>euh... pas du tout
Ah bon ? alors tu t'expliques mal
>> ce que j'aimerais, c'est remplacer "un mot" par "un mot" Le script fourni fais exactement ceci, mot pour mot, malgré tout il efface le reste (amis ceci est pas tres dur à récupérer, mais bon si tu penses quec'est inexploitable ...
Bon courage
cs_bultez
Messages postés13615Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention15 octobre 201330 3 avril 2007 à 15:23
salut Nick...
probable que je n'ai pas été clair,
je ne me comprends que rarement moi-même
récapépétons :
un iframe, avec du texte quelconque ( saisi en fait par un utilisateur )
j'aimerais "entourer" les caractères sélectionnés par cet utilisateur
de balises html. ce que fait l'exemple que j'ai mis, mais, car il y a
un mais : les balise ne sont pas interprétées.
par exemple, l'iframe contient
<label style= 'color:#FF0000'>exemple</label> mot un autre ...
il est donc affiché : exemple mot un autre ...
sélectionnons le "un", en remplaçons par
<label style='color:#FF0000'>un</label>
on va afficher :
exemple mot
<label style ='color:#FF0000'>un</label>
autre ...
je préfèreais nettement :
exemple mot un
autre ...
quoi mettre à la place de createrange.text pour interpréter les balises ?
si ça existe...
où comment faire autrement ? car je ne sais pas comment retouver les
caractères sélectionnés avec autre chose, ni les positions dans le texte
ni leur nombre...
suis-je plus clair ?
mais essayes ( avec ie ) mon exemple. c'est mieux qu'une explication.
cs_roro06
Messages postés732Date d'inscriptionjeudi 2 janvier 2003StatutMembreDernière intervention29 octobre 2007 3 avril 2007 à 15:37
Bonjour
Ce serait bien qu'on puisse faire ce que tu veux, ça permettrait de créer un petit éditeur WYSIWYG en JS de manière élégante et relativement simple (c'est peut-être le but ?). Helas, 3 fois helas, je n'ai jamais réussi à le faire, ni à trouver de doc ou de bout d'code permettant de le faire. Appremment, "on ne peut pas". Tu peux te tourner vers execCommand, qui permet certaines choses (malheureusement pas toutes, loin de là), qui s'utilise, pour IE :
window.frames[idDuFrame].document.execCommand(action, showUI, parm); puisque tout est simple, c'est évidemment différent pour les sniffeurs GECKO :
document.getElementById(idDuFrame).contentDocument.execCommand(action, showUI, parm);
cs_bultez
Messages postés13615Date d'inscriptionjeudi 13 février 2003StatutMembreDernière intervention15 octobre 201330 3 avril 2007 à 15:45
salut roro,
ouais pour execCommand.
( j'ai d'ailleurs mis dans les sources justement un editeur wysiwyg qui
utilise cette méthode. et ça baigne parfaitement ( ie, ff, opera, k-meleon... ) )
ici je voulais ajouter des fonctionnalités à execCommand
en Javascript finalement ! ( on peut voir ça comme ça )
car
certaines choses (malheureusement pas toutes, loin de là)