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

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 à 16:05
    on peut déterminer (?) le mot sur lequel est le curseur
        donc repérer sa position et à coups de substr...
    mais c'est assez lourd à faire, et  pour déterminer correctement le mot ?
       et si l'utilisateur veut faire un truc sur plusieurs mots...
    je vais peut-être être obligé de voir dans ce sens...
   
<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 à 18:44
j'ai du aller faire quelques courses, et ma foi : ce fut salutaire.

je crois que je vais faire :

1° mémoriser les caractères sélectionnés de l'Iframe
2° remplacer cette sélection par "une suite de caractères qui n'existent pas" dans l'Iframe
3° mémoriser l'Iframe modifié dans un textarea
4° remplacer dans ce texarea
"la suite de caractères qui n'existaient pas"
    par les balises + "
les caractères sélectionnés du l'Iframe"
5° mettre le textarea dans Iframe

bourrin, mais ça baignera. si vous avez mieux !

Nick et Roro, comme je vous l'ai dis, execCommand j'ai mis en oeuvre
    dans une source ici même ( editeur wysiwyg qui fonctionne avec
    IE, FF, Opera, K-meleon ... ). mais ne fait pas ce que je voulais.

je vais mettre résolu, et grâce à vous finalement.



<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
4 avril 2007 à 07:03
ça fonctionne presque comme je voulais
( exclusif IE pour le moment ,mais simple à harmoniser )
ça doit d'ailleurs ressembler à ce qu'a mis PetoleTeam ( merci à toi )

<html>
<head>
<script type="text/javascript">
    var Fen,Champ;
    function init()
    {
        Fen=window.frames['saisie'];
        Champ=Fen.document;
        Champ.designMode='On';
        Fen.focus();
    }
   function trait()
   {
        var t=document.getElementById("trv");
        //1° mémoriser les caractères sélectionnés de l'Iframe
        sel = Champ.selection.createRange();
        var mem=sel.text;
        //2° remplacer cette sélection par "une suite de caractères qui n'existent pas" dans l'Iframe
        var tmp="nimportequoi";
        while ( Champ.body.innerHTML.indexOf(tmp)>=0 )
        {
            tmp+=tmp; // ça finira par être bon !
        }
        sel.text=tmp;
        //3° mémoriser l'Iframe modifié dans un textarea
        t.value=Champ.body.innerHTML;
        //4° remplacer dans ce textarea "la suite de caractères qui n'existaient pas"
        //        par les balises + " les caractères sélectionnés du l'Iframe"
        t.value=t.value.replace(tmp,"<label style='background-color:#FFCC99' onclick='alert("ok");'>"+mem+"</label>");
        //5° mettre le textarea dans Iframe
        Champ.body.innerHTML=t.value;
   }
</script>
</head>

<textarea   name="trv"
            id="trv"
            style="width:100%;height:40%;border:0;background-color:#DDFFFF"></textarea>

</html>

sauf que... le onclick ajouté ne se fait pas... pas loin, pas loin...
faudrait-il l'ajouter "après" ? en dynamique ?

<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
4 avril 2007 à 08:33
        //4° remplacer dans ce textarea "la suite de caractères qui n'existaient pas"
        //        par les balises + " les caractères sélectionnés du l'Iframe"
        t.value=t.value.replace(tmp,"<label id='"+tmp+"' style='background-color:#FFCC99' onclick='alert("ok");'>"+mem+"</label>");
        //5° mettre le textarea dans Iframe
        Champ.body.innerHTML=t.value;
        Champ.body.document.getElementById(tmp).onclick=function() { alert("ok"); }
        // Champ.body.document.getElementById(tmp).id=''; à faire ou pas

    onclick fonctionne là, bien sûr, mais si on fait une 2ème fois trait()
       cet onclick disparait du contenu de l'Iframe... curieux ?

<hr />


Cordialement            Bul    
0

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

Posez votre question
PROTECTIONNISTE Messages postés 67 Date d'inscription jeudi 30 janvier 2003 Statut Membre Dernière intervention 23 septembre 2008 1
5 avril 2007 à 13:30
Tiens on dirait qu'on a pris mon idée de innerHTML qui était soit disant inexploitable ...
Comme quoi il suffisait de modifier
0
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 à 13:51
>>Tiens on dirait qu'on a pris mon idée de
innerHTML qui était
>>soit disant inexploitable ...Comme quoi il suffisait de modifier

        euh... tu ne te sens pas ni géné ni ridicule là ?   
<hr />


Cordialement        Bul        
0
cerede2000 Messages postés 71 Date d'inscription vendredi 12 janvier 2007 Statut Membre Dernière intervention 6 septembre 2013
8 avril 2007 à 11:04
Bonjour je suis dans le meme truc que toi, je veut me passé d'execcommand et donc je fait la meme chose.
Voici mon code, qui est semblable a ce qui a deja ete donné.
Ceci pour  FireFox:
var selObj = document.getElementById('Saisie').contentWindow.getSelection();
        var start = selObj.anchorOffset;
        alert(start);
        var end  =  selObj.focusOffset;
        alert(end);
        var innerValue = tag.contentDocument.body.textContent;
        var newStr = innerValue.substr(0,start);
        newStr+='<'+balise+'>' + selObj + '</'+balise+'>';
        newStr+= innerValue.substr(end,innerValue.length);
        tag.contentDocument.body.innerHTML = newStr;

Mais j'ai remarqué un soucis que je n'arrive pas a corrigé, en faite anchorOffset et focusOffset, sont géné par les balise deja presente.
Je m'explique, le texte au depart:
123456789
Je selectionne disons 567 et je le met en gras j'obtient bien ceci:
123456789
Mais si maintenant je selectionne 89 pour les mettres en italique voici ce que j'obtient:
123893456789
Comme on le remarque la balise b a disparu et en plus le texte n'est pas au bon endroit :(
Si quelqu'un a une solution ;)
Merci
0
cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 30
8 avril 2007 à 12:30
Bonjour,

quelques éléments de réponses ici : http://www.javascriptfr.com/infomsg_SELECTIONSTART-DANS-IFRAME_915778.aspx#22

c'est "la suite" de cette question.

et il y a au moins une solution ici :
http://www.javascriptfr.com/codes/DOCUMENT-SELECTION-POUR-FF-FIREFOX_42090.aspx

j'espèrait une solution "plus simple" pour mon petit cerveau, mes
    petites capacités... mais loin d'être persuadé que cela soit possible "facilement"...

<hr />


Cordialement            Bul    
0
Rejoignez-nous