OVH Cloud OVH Cloud

Comment préserver une sélection ?

10 réponses
Avatar
Claude Schneegans
Bonjour,

Comment enpêcher un clic de changer la sélection courante dans une page ?
Voilà le problème :
J'ai un champ (mettons un TEXTAREA) dans lequel je positionne le curseur.
J'ai une zone de texte qqconque (mettons dans une DIV) qui me sert de
bouton de commande.
Quand je clique dessus, je voudrais insérer qqch à l'endroit choisi dans
la TEXTAREA.
Le PROBLÈME, c'est que ce ?%$/ d'Explorer me change d'abord la sélection
à cause du clic
sur la DIV, et c'est dans celle-ci que l'insertion se fait.

D'où ma question.
Il semble que le mousedown efface la sélection courante, le mousup la
rétablit sur le nouveau clic,
et le mouseclick vient ensuite.
Si j'essaie onmousedown au lieu de onclick, la selection est déjà morfée
et ça plante tout simplement.

Voir un code d'exemple ici :
http://www.contentbox.com/claude/test/selection.htm

dont voici le source :

<TEXTAREA COLS="" ROWS="">Test text</TEXTAREA>
<DIV onClick="insertText()">Click here to insert</DIV>
<SCRIPT>
function insertText()
{
var rng = document.selection.createRange();
rng.pasteHTML(" inserted ");
}
</SCRIPT>

10 réponses

Avatar
Claude Schneegans
... En fait, il y a carrément un bug :
Dans le code suivant, j'utilise un mouseDown, donc la selection n'est
pas encore changée.
On le voit dans l'alert qui affiche bien TEXTAREA.
Par contre, la ligne suivante produit une « erreur non spécifiée » ;-(

<DIV onmousedown="insertText()">Click here to insert</DIV>
<SCRIPT>
function insertText()
{
var rng = document.selection.createRange();
alert(rng.parentElement().tagName);
rng.pasteHTML(" inserted ");
}
</SCRIPT>
Avatar
scraper
Bonjour Claude Schneegans, dans le message
news:
tu disais :


... En fait, il y a carrément un bug :
Dans le code suivant, j'utilise un mouseDown, donc la selection n'est
pas encore changée.
On le voit dans l'alert qui affiche bien TEXTAREA.
Par contre, la ligne suivante produit une « erreur non spécifiée » ;-(

<DIV onmousedown="insertText()">Click here to insert</DIV>
<SCRIPT>
function insertText()
{
var rng = document.selection.createRange();
alert(rng.parentElement().tagName);
rng.pasteHTML(" inserted ");
}
</SCRIPT>



est ce dans internet explorer que tu as ce problème ??

j'ai essayé par curiosité et ici, ça fonctionne plutôt bien, ton code !

au final, est affiché :

inserted Click here to insert



--

Adresse invalide
Merci de répondre sur le forum ...
http://scraper.chez.tiscali.fr

scraper

Avatar
Claude Schneegans
est ce dans internet explorer que tu as ce problème ??



Ben voui, sinon je ne sarais pas ici ;-)

j'ai essayé par curiosité et ici, ça fonctionne plutôt bien, ton code !
au final, est affiché :
inserted Click here to insert



Oui, sauf que "inserted" est inséré là où tu cliques dans le texte,
parce que le curseur
y est déplacé, pas dans le textarea où je voudrais faire l'insertion.
C'est ça le problème : je voudrais pouvoir annuler le changement de
sélection
dû au clic sur qqch qui me sert de contrôle pour que l'action ait lieu
là ousque était le curseur avant.


Avatar
scraper
Bonjour Claude Schneegans, dans le message
news:eANf$
tu disais :

Oui, sauf que "inserted" est inséré là où tu cliques dans le texte,
parce que le curseur
y est déplacé, pas dans le textarea où je voudrais faire l'insertion.
C'est ça le problème : je voudrais pouvoir annuler le changement de
sélection
dû au clic sur qqch qui me sert de contrôle pour que l'action ait lieu
là ousque était le curseur avant.


OK ... sauf que dans ton code, j'ai pas de textarea ??


--

Adresse invalide
Merci de répondre sur le forum ...
http://scraper.chez.tiscali.fr

scraper

Avatar
Jean
Bonjour,

Comment enpêcher un clic de changer la sélection courante dans une page ?
Voilà le problème :
J'ai un champ (mettons un TEXTAREA) dans lequel je positionne le curseur.
J'ai une zone de texte qqconque (mettons dans une DIV) qui me sert de bouton
de commande.
Quand je clique dessus, je voudrais insérer qqch à l'endroit choisi dans la
TEXTAREA.
Le PROBLÈME, c'est que ce ?%$/ d'Explorer me change d'abord la sélection à
cause du clic
sur la DIV, et c'est dans celle-ci que l'insertion se fait.

D'où ma question.
Il semble que le mousedown efface la sélection courante, le mousup la
rétablit sur le nouveau clic,
et le mouseclick vient ensuite.
Si j'essaie onmousedown au lieu de onclick, la selection est déjà morfée et
ça plante tout simplement.

Voir un code d'exemple ici :
http://www.contentbox.com/claude/test/selection.htm

dont voici le source :

<TEXTAREA COLS="" ROWS="">Test text</TEXTAREA>
<DIV onClick="insertText()">Click here to insert</DIV>
<SCRIPT>
function insertText()
{
var rng = document.selection.createRange();
rng.pasteHTML(" inserted ");
}
</SCRIPT>


D'abord mettre la propriété unselectable de la div sur on.

Ensuite, comme une textarea n'a pas de rendu HTML, utiliser la proriété
text du textrange retourné par la méthode createTextRange au lieu de la
méthode pasteHTML.

Soit, au total :

<!---8<--->
<TEXTAREA COLS="" ROWS="">
Test text
</TEXTAREA>
<DIV unselectable="on" onclick="insertText()">
Click here to insert
</DIV>

<SCRIPT>
function insertText(){
document
.selection
.createRange()
.text=" inserted "
}
</SCRIPT>
<!---8<--->

Amicalement,

--
Jean - JMST
Belgium

Avatar
Jean
par la méthode createTextRange


lire "par la méthode createRange"

--
Jean - JMST
Belgium

Avatar
Claude Schneegans
OK ... sauf que dans ton code, j'ai pas de textarea ??



Dans l'exemple en entier dont j'ai donné l'adresse :
http://www.contentbox.com/claude/test/selection.htm
Il y a un TEXTAREA


Avatar
Claude Schneegans
D'abord mettre la propriété unselectable de la div sur on.



Bon, ça ça marche en effet. L'ennui, c'est que j'ai volontairement
simplifié mon extrait de code
pour fins de discussion. Dans l'outil que je développe, j'ai aussi des
champs à remplir, si je les rends
tous « unselectable », ils ne sont plus éditables.
Il faudrait vraiment que je puisse sauvegarder la sélection courante,
puis la restaurer avant le pasteHTML,
mais ça ne semble pas possible.
La solution serait de faire toute l'édition dans une sur fenêtre à part,
mais il y a tellement de suppresseurs
de Popup de ?%$/" qu'il n'y a plus moyen de travailler avec ça.
Y nous feront jamais tant rire qu'ils nous font ch?%$/ ;-)

Ensuite, comme une textarea n'a pas de rendu HTML, utiliser la
proriété text du textrange retourné par la méthode createTextRange au


lieu de la méthode pasteHTML.

Voui, voui, createRange, c'est exactement ce que je fais :
« var rng = document.selection.createRange();
rng.pasteHTML(" inserted "); »


Avatar
Claude Schneegans
Salut,

la solution semble être de copier le textRange avec duplicate() avant
d'éditer les champs,
ce qui déplace la sélection, ensuite d'appliquer le pasteHTML à cette
copie au lieu de la sélection courante.
Ça ne restore pas la sélection, mais au moins la modification est
appliquée au bon endroit.
Dans le genre compliqué et tordu, on peut dire que Microstuff a fait
fort avec ses maudits ranges à la mords-moi-la ! ;-))
Merci à tous.
Avatar
Bul
bonjour,

un TEXTAREA dans lequel je positionne le curseur.
une DIV qui me sert de bouton de commande.
Quand je clique dessus, je voudrais insérer qqch
à l'endroit choisi dans la TEXTAREA.


j'arrive peut-être en retard, et/ou je n'ai pas
tout compris, mais en rendant le focus au
textarea ?

<HTML>
<HEAD>
<TITLE></TITLE>
<script type="text/javascript">
function mettre(ou,quoi)
{ ou.focus();
document.selection.createRange().text=quoi; }
</script>
</HEAD>
<BODY>
<textarea name="txt">
exemple de texte dans le textarea
</textarea>
<div onclick="mettre(txt,'exemple de texte à insérer');">
exemple de texte dans le div
</div>
</BODY>
</HTML>

@+