Position du curseur dans une div

Résolu
cs_Dj Nam Messages postés 26 Date d'inscription dimanche 29 octobre 2006 Statut Membre Dernière intervention 1 avril 2012 - 14 janv. 2009 à 14:59
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 - 22 janv. 2009 à 17:24
Bonjour tout le monde,

Dans le cadre de développement d'un site web, j'aimerais tranformer une div en textarea, pour cela j'utilise le javascript car je ne dispose d'aucune connaissance en java.
Le but finale est de pouvoir disposer d'une zone de texte éditable semblable à celle qui permet de poster ce même message, avec une mise en forme directement visible lors de l'édition.

Pour ce faire j'ai commencé à réaliser quelques fonctions (L'ajout de texte, l'insertion du code, les retours à la ligne, backspace et suppr) mais là ou j'aurais besoin de votre aide si préciseuse c'est pour récupérer la position du curseur au clique pour pouvoir insérer du texte au milieu de la zone éditable par exemple.

J'ai essayé d'utiliser les fonctions de createRange() et getCaret (ou quelque chose de semblable) mais cela me retourne toujours "Undefined"

Si je ne suis pas suffisement clair, n'hésitez pas à me demander de détailler d'avantage.

Maxime

28 réponses

cs_Dj Nam Messages postés 26 Date d'inscription dimanche 29 octobre 2006 Statut Membre Dernière intervention 1 avril 2012
19 janv. 2009 à 16:41
Etant donné que la variable Champ fait référence à l'iframe et que je veux le contenu de celle-ci il faut bien que j'utilise Champ.body l'ordre est donc corrècte.
Je vais essayer de prendre vos codes séparément pour voir si cela fonctionne ou non.

Maxime
0
cs_Dj Nam Messages postés 26 Date d'inscription dimanche 29 octobre 2006 Statut Membre Dernière intervention 1 avril 2012
19 janv. 2009 à 16:57
J'ai trouvéééé !!!
le problème vient de la ligne suivante :

Champ.designMode='On';

j'ai placé ce code :
alert(Champ.body); //Retourne : [Object]
Champ.designMode='On';
alert(Champ.body); //Retourne : null

Il me suffit donc d'inverser deux lignes, et le tour est joué !

Maxime
0
cs_Dj Nam Messages postés 26 Date d'inscription dimanche 29 octobre 2006 Statut Membre Dernière intervention 1 avril 2012
19 janv. 2009 à 17:22
Evidement je suis allé un peu trop vite ...

Effectivement le problème venait de cette ligne, mais il reste sur cette ligne car si j'inverse l'ordre des instructions le texte s'affiche,
et lorsqu'arrive cette même instruction, il est à nouveau effacé.
Comment puis-je faire pour éviter cela ?

Maxime
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
20 janv. 2009 à 10:01
le souci uniquement avec IE ( enfin.. IE8 chez chez moi !)
pas expliqué, mais en attendant.... un ch'tiot setTimeout
des plus experts devraient te dire why et comment faire fonctionner
sans ce setTimeout... disons curieux
j'ai déjà eu le même phénomène avec FF (2) dans d'autres circonstances.

  

       

        <textarea name="txt" id="txt">exemple</textarea>

        <script>

            window.onload=function()

            {    switch (navigator.appName)

                {    //      ===============================

                    case     "Microsoft Internet Explorer":

                    //       ===============================

                        Fen=window.frames['Saisie'];

                        Champ=Fen.document;

                        break;

                    //          =========

                    default:    //     sinon

                    //          =========

                        Champ=document.getElementById('Saisie').contentDocument;

                        Fen=document.getElementById('Saisie').contentWindow;

                        break;

                }

                Champ.designMode='On';

                setTimeout
                ( "Champ.body.innerHTML=document.getElementById('txt').value;",
                  1 );

            }

        </script>
   

          [mon Site] [M'écrire] Bul         
0

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

Posez votre question
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
20 janv. 2009 à 20:16
Bonjour,
l'explication, enfin une amorce, concernant le setTimeout est que IExplorer détruit le contenu de l'objet et il lui
faut donc un laps de temps pour le recréer.
exemple pour visualisation :

<html>
<head>

</head>


<textarea name = "txt"
id = "txt">exemple</textarea>
<script type="text/javascript">

  window.onload = function(){
    var O_iFrame = document.getElementById(
'Saisie').contentWindow.document;
    O_iFrame.body.innerHTML =
document.getElementById("txt").value;
    //-- Alerte
de visualisation
    alert( "Before\n"
+O_iFrame.childNodes.length);
    O_iFrame.designMode='On';
    //-- Alerte de visualisation
    alert( "After\n"
+O_iFrame.childNodes.length);
    O_iFrame.body.innerHTML =
document.getElementById("txt").value;
  }
</script>


</html>
...donc setTimeout incontournable avec une IFRAME...

;O)
0
cs_Dj Nam Messages postés 26 Date d'inscription dimanche 29 octobre 2006 Statut Membre Dernière intervention 1 avril 2012
22 janv. 2009 à 11:21
Encore merci pour ces informations complémentaires, je vais voir ce que je peux faire afin de régler ce dernier petit souci.

Maxime
0
Bul3 Messages postés 4933 Date d'inscription samedi 1 juillet 2006 Statut Membre Dernière intervention 2 février 2015 16
22 janv. 2009 à 11:44
alors si PetoleTeam nous dit :
          ...setTimeout incontournable avec une IFRAME...
guère d'autres possibilités pour palier à ce  dysfonctionnement,
si dysfonctionnement il y a,  d'IE...
          [mon Site] [M'écrire] Bul      
0
PetoleTeam Messages postés 3426 Date d'inscription lundi 26 décembre 2005 Statut Membre Dernière intervention 14 janvier 2011 17
22 janv. 2009 à 17:24
Bonjour,
<table bgcolor= "#e6effe" border="0" cellpadding="5" cellspacing="0" width="100%">----, ... setTimeout incontournable avec une
IFRAME...</td>
</td></tr></tbody></table>dans ce
contexte avec les méthodes utilisées.

reprenons l'exemple ci dessus mais
en changeant la technique d'écriture
<html>
<head>
</head>



<textarea
name "txt" id "txt">exemple</textarea>
<script
type="text/javascript">
  window.onload = function(){
    var
O_iFrame = document.getElementById( 'Saisie').contentWindow.document;

    O_iFrame.designMode='On';
    //--
Utilisation des methodes open, write et close

    O_iFrame.open();
    O_iFrame.write(
document.getElementById("txt").value);
    O_iFrame.close();
  }

</script>

</html>
...pas de
problème constaté, dans ce cas avec IExplorer ,
de par la méthode open, le setTimeout devient implicite.

Remarque :
  Il suffit de mettre un alert( O_iFrame.firstChild.nodeName); pour voir que
le document est bien un document HTML, même si l'on n'a pas rajouté les balises
qui vont bien.

<table bgcolor ="#e6effe" border="0" cellpadding="5" cellspacing="0" width="100%">----, ...palier à ce dysfonctionnement,
si
dysfonctionnement il y a,
d'IE...</td>
</td></tr></tbody></table>Il ne
s'agit que d'une façon différente de gérer ce changement d'état, l'IFRAME
n'étant, à ma connaissance, pas fait pour cela au départ.

;O)
0
Rejoignez-nous