Modifier la sélection dans un iframe

Résolu
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 - 3 avril 2007 à 11:36
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 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...

merci d'avance.
<hr />


Cordialement            Bul    

28 réponses

PROTECTIONNISTE Messages postés 67 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 23 septembre 2008 1
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 .
3
nickadele Messages postés 1251 Date d'inscription mercredi 7 août 2002 Statut Modérateur Dernière intervention 10 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
3
cs_roro06 Messages postés 732 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 29 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 !!

Cordialement
Roro webDev
3
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
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.designMode != 'On')
    Edit.designMode = 'On';
 

 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)
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
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.

    setTimeout("Champ.body.innerHTML=t.value;",100);

    donc, pas compris (!) mais çà marche...
   
    merci donc à tous.

<hr />


Cordialement            Bul    
3
PROTECTIONNISTE Messages postés 67 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 23 septembre 2008 1
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
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
3 avril 2007 à 13:15
>>Je crois que par sécurité ce n'est pas faisable 
   quelle sécurité ? rien à voir à priori, pas de soucis de ce coté là !
<hr />
            Cordialement    Bul   
0
PROTECTIONNISTE Messages postés 67 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 23 septembre 2008 1
3 avril 2007 à 13:41
Y a un trojan qui a été créé qui exploitait le createRange()donc la sécurité évidente ...
j'ai trouvé un lien : http://www.bitdefender.fr/VIRUS-215606-fr--Exploit.HTML.CreateRange.Gen.html
voilà pourquoi ;-)
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
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.



Champ.body.innerHTML= "<label style='background-color:#FFFFAA'>exemple</label>"
   

ça marche, alors les problèmes de sécurité n'ont rien à voir.






merci pour ta réponse, mais c'est totalement à coté de la plaque.





<hr />



Cordialement        Bul    
0
PROTECTIONNISTE Messages postés 67 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 23 septembre 2008 1
3 avril 2007 à 13:57
Champ.body.innerHTML="<label style='background-color:#FFFFAA'>exemple</label>"




ç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 ...
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
3 avril 2007 à 14:06
>>mais le createRnage ne t'ajoutera pas directement du HTML,
    ben oui ! c'est mon souci. ce n'était pas clair ?
       pas dis dans mon message d'origine ?


>>

Champ.body.innerHTML= "<label style='background-color:#FFFFAA'>exemple</label>"

>>ç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.






<hr />



Cordialement            Bul    
0
PROTECTIONNISTE Messages postés 67 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 23 septembre 2008 1
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>
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
3 avril 2007 à 14:32
pas tout à fait... puisque ça efface le contenu de l'iframe.
il faudrait remplacer la sélection, et laisser le reste.

inutile d'ailleurs.
<hr />                Cordialement    Bul    
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
3 avril 2007 à 14:35
de plus, on ne peut pas utiliser un id.
c'est le texte sélectionné qu'il faut modifier. il n'a pas d'ID.
<hr />


Cordialement    Bul    
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
3 avril 2007 à 14:49
>>pas exactement comme tu le souhaite
   euh... pas du tout

>>mais au moins de cette façon les balises
sont utilisé et non pas inscrite
    ça ne correspond absolument pas à mon problème.
    ça ne résoud rien.

>>A toi de retravailler le script
pour avoir ce que tu veux.
    ton script est simplement inexploitable.



    merci malgré tout des tes efforts.





<hr />            Cordialement Bul
0
nickadele Messages postés 1251 Date d'inscription mercredi 7 août 2002 Statut Modérateur Dernière intervention 10 avril 2013
3 avril 2007 à 14:57
Bultez,


j'ai rien compris à vos échanges et rien compris à ton problème.
Peux-tu ré-expliquer ton problème et ce que tu veux faire ?

Nickadele
----------------------------------------------
non, ma belle ne s'appel pas Adèle
0
PROTECTIONNISTE Messages postés 67 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 23 septembre 2008 1
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
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
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.



<hr />



Cordialement    Bul    
0
cs_roro06 Messages postés 732 Date d'inscription jeudi 2 janvier 2003 Statut Membre Dernière intervention 29 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);

Cordialement
Roro webDev
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
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à)





   



<hr />



Cordialement            Bul    
0
Rejoignez-nous