DOCUMENT.SELECTION POUR FF (FIREFOX)

cs_bultez Messages postés 13615 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 15 octobre 2013 - 5 avril 2007 à 11:31
aliestrella Messages postés 1 Date d'inscription vendredi 5 mars 2010 Statut Membre Dernière intervention 22 avril 2010 - 22 avril 2010 à 01:10
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/42090-document-selection-pour-ff-firefox

aliestrella Messages postés 1 Date d'inscription vendredi 5 mars 2010 Statut Membre Dernière intervention 22 avril 2010
22 avril 2010 à 01:10
Salut!!!

Merci Merci Merci beaucoup vraiment pour le code :D il y a longtemps que je cherche quelque chose comme ça. J'avais le même problème (ça marchait en IE mais pas en FF). Après avoir découvert ça je suis heureuse. J'aimerais bien programmer comme toi ;) FÉLICITATION!

Bonne journée :)
cs_Killan Messages postés 46 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 5 février 2010
5 févr. 2010 à 11:28
D'accord, je vais voir ça merci.
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
4 févr. 2010 à 17:59
Sous IE, le code ici n'est pas exécuté. On utilise le code par défaut de document.selection. Tu devrais donc regarder sur la MSDN ce qu'ils disent à ce sujet...
cs_Killan Messages postés 46 Date d'inscription jeudi 10 janvier 2002 Statut Membre Dernière intervention 5 février 2010
4 févr. 2010 à 16:15
Bonjour et merci déjà pour ce code magnifique.

J'ai un soucis sous IE8 dans le cas d'une iframe (cf msg yves2929 du 09/11/200).

J'ai modifié ton setter comme suit :

ControlRangeObject.prototype.__defineSetter__("htmlText",function(value) {
var range = this._range;
range.deleteContents();
range.insertNode(value)
});

Pour envoyer du html directement sans avoir la balise que tu créais qui parasitait.

Et je fais ça :

tr = pa.getSelection(pa.selectobj);
var e = document.createElement('b');
e.innerHTML = tr.text;
tr.htmlText = e;

J'ai bien un objet textRange mais IE8 dit que htmlText n'existe pas, ça plante à la dernière ligne, le reste ça a l'air d'aller.

Une idée ?

Merci d'avance.
cs_yves2929 Messages postés 2 Date d'inscription vendredi 1 juin 2007 Statut Membre Dernière intervention 9 novembre 2009
9 nov. 2009 à 17:24
voici donc ce qu'il faut faire avec une iframe.
merci d'avoir repondu aussi vite.

<script type="text/javascript" charset="utf-8">
var textRange = null;

function getItemSelection(edid) {
try {
textRange = getFrameSelection(new SelectionObject(getFrameWindow(document.getElementById(edid)))).createRange();
} catch (ex) {}
}

function setHtmlItemSelection(str) {
try {
if (textRange != null) {
//textRange.text = str;
if (textRange.pasteHTML) {
textRange.pasteHTML(str);
textRange.select();
} else {
textRange.htmlText = str;
}
}
} catch (ex) {}
}

function getFrameSelection(win) {
return win.document.selection? win.document.selection : win;
}

function getFrameWindow(iframe) {
return iframe.window? iframe.window : iframe.contentWindow;
}

</script>
cs_yves2929 Messages postés 2 Date d'inscription vendredi 1 juin 2007 Statut Membre Dernière intervention 9 novembre 2009
4 nov. 2009 à 15:27
Bonjour,

Je rencontre quelques problemes avec ton script sous IE8 si j'utilise une iframe (tinymce editor).
Peux-tu me dire si tu es d'accord de donner un petit coup de main pour essayer de resoudre ce probleme.
Si oui je t'envoie un exemple a telecharger
Merci d'avance

A+
deadpig Messages postés 2 Date d'inscription lundi 2 juin 2008 Statut Membre Dernière intervention 11 juin 2008
11 juin 2008 à 21:59
Merci Fremy pour ta prompte réponse.

Bon courage pour les exams & pas de pb de mon côté, je ne suis pas aux pièces...

De plus, le bug peut être interprété comme une fausse manip par l'utilisateur, puisqu'au deuxième coup, ça fonctionne ;-)

MAIS d'un point de vue de codeur cela reste un bug :-))

++
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
11 juin 2008 à 16:29
Bonjour !

Je suis en examen toute cette semaine et la semaine prochaine, mais je te promets de regarder le problème dès que ceux-ci seront terminés.

Fremy
deadpig Messages postés 2 Date d'inscription lundi 2 juin 2008 Statut Membre Dernière intervention 11 juin 2008
11 juin 2008 à 16:09
Bonjour à tous,

Tout d'abord un grand bravo à FREMYCOMPANY pour ce script qui m'a sauvé du suicide 8-]

Par contre j'ai mis le doigt sur un nanobug sous Fx :
J'utilise le script pour l'appliquer à un formulaire comportant un textarea avec 3 fonctionnalités d'édition de texte.
Voici le phénomène sous Fx:
Je saisi un mot dans le textarea, je le mets en surbrillance, je clique sur un des 3 boutons, mes tags html s'affichent bien (ce qui n'était pas le cas avant l'utilisation du script de FREMY), MAIS le mot sélectionné disparait...
Je saisi un deuxième mot, fais les même manips, et là ça fonctionne nickel pendant tout le reste de la saisie !
On dirait que le focus n'est pas pris en compte lors de la première "utilisation" du script.

Le script de FREMY est appelé en début de page ainsi:

<script type="text/javascript" src="script/docSelFx.js"></script>

Le script pilotant les boutons "gras", "italique" et "url" est le suivant:

<script>
function format(f) {
var str = document.selection.createRange().text;
document.publication.offre.focus();
var sel = document.selection.createRange();
sel.text = "<" + f + ">" + str + "</" + f + ">";
return;
}

function lien() {
var str = document.selection.createRange().text;
document.publication.offre.focus();
var lien = prompt("URL:","http://");
if (lien != null) {
var sel = document.selection.createRange();
sel.text = "" + str + "";
}
return;
}
</script>

Dans mon formulaire, j'utilise le code suivant pour mettre en forme le texte sélectionné :

Voilà, si quelqu'un a une idée, je suis preneur. Pour info, je suis développeur XHTML/CSS/PHP mais le JS reste un grand mystère pour moi ; il y a donc peut être une grossière erreur dans mes "functions".

++
cs_renaud63 Messages postés 17 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
4 avril 2008 à 16:16
:-) Ben t'es le meilleur mon gars ! et ton script est carrément génial : autant sur IE que sur FF. Bravo et merci beaucoup de ton coup de main.
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
4 avril 2008 à 15:56
Edité
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
4 avril 2008 à 14:01
Je vais me pencher sur le problème.
Néanmoins, je ne peux pas te garantir que je vais trouver une solution, vu que normalement mon code est déjà censé être OK...

Peut-être est-ce un bug dans FireFox... Enfin, je vais faire des tests et je te mets au courant.
cs_renaud63 Messages postés 17 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
3 avril 2008 à 11:49
Bonjour Fremy, je viens de réinstaller ton script et plus d'erreur JS sur IE ! bravo. Mais j'ai toujours le problème avec FF et 2 textareas: si je mets en forme un mot dans le champ inférieur, la mise en page s'applique dans le champ supérieur. Tu as testé ? peut être que j'appelle mal les fonctions sur la page ? Ce serait très cool si tu pouvais te pencher une dernière fois sur ton script. D'avance merci et bonne journée.
Renaud.
cs_renaud63 Messages postés 17 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
18 févr. 2008 à 17:31
Euh...je précise que ce n'est vrai qu'en mode modification, lorsque le textarea est rempli par les infos de la BDD...
cs_renaud63 Messages postés 17 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
18 févr. 2008 à 16:58
Bonjour,

En fait, je découvre en re testant, que sous FF, le script "se trompe" de focus. Si j'ai deux textarea l'un sous l'autre, avec des id et noms différents, si on veut mettre en forme celui du dessous, les balises s'affichent dans celui du dessus ! Est ce que ce n'est pas prévu pour gérer 2 textarea sur la même page ?
Merci de ta réponse éclairée.
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
16 févr. 2008 à 11:49
Ok, c'est __defineGetter__ qui ne marche pas sous IE
Mais on s'en fout un peu, vu que cela ne doit être utilisé que sous FireFox

Je vais faire une version avec un try {} catch (ex) {} qui va empecher l'erreur, comme ca CJS serait content ;)
cs_renaud63 Messages postés 17 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
16 févr. 2008 à 10:17
Mais ce matin, triple sniff... (hier soir le companion JS était fatigué, ou moi...)
ligne 224 cet objet ne gère pas cette propriété ou méthode
ligne 223 syntax error

Pourtant le script fonctionne, et, surtout les lignes 223 et 224 correspondent à des accolades de fermeture... c'est le companion JS qui délire ???
cs_renaud63 Messages postés 17 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
15 févr. 2008 à 19:16
Je viens de tester sur IE et FF : C'est tout simplement magnifique. Le companion JS était pas très content (objet ne gère pas propriété ou méthode)...maintenant il est muet comme une tombe !
Bravo ! et merci.
Bonne soirée et bon week-end.
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
15 févr. 2008 à 18:07
Encore une petite mise à jour.
Cette fois tout devrait marcher comme prévu.

Peux-tu tester pour voir ?
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
14 févr. 2008 à 22:13
Oui, on dirait qu'il y a encore un bug qqpart...
Je verrai ca ce week-end [;)]
cs_renaud63 Messages postés 17 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
14 févr. 2008 à 19:34
Décidément, ce script me donne des suées ! bon, j'ai commenté
var allInputs = this.document.getElementsByTagName("INPUT");

ainsi que

allInputs.length;

et toute la boucle l1.

Pour ne garder que l2 des textareas

Ca paraît fonctionner sur les 2 navigateurs... ça te paraît correct ?
cs_renaud63 Messages postés 17 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
14 févr. 2008 à 19:07
Arggghh non, il y a un truc hallucinant sur FF : une fois l'image cliquée, la balise va s'appliquer à un champ de type text placé plus haut sur la page, qui a un ID différent de celui passé en paramètre ! Et si je supprime ce champ, la balise s'applique à un autre champ text !
Faut il déclarer quelque part que c'est un textarea ? l'id ne suffit pas à l'identifier avec le nom passé en param de la fonction insertBalise(input, name, args) ???
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
14 févr. 2008 à 19:00
Bonne soirée à toi aussi !
cs_renaud63 Messages postés 17 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
14 févr. 2008 à 18:49
Non, c'est tout bon ! vraiment top ! Merci.
Bonne soirée à toi.
cs_renaud63 Messages postés 17 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
14 févr. 2008 à 17:40
Alors, je viens de recharger ce code ci, avec ta modif.
Sur FF, nickel !
Sur IE, ça fonctionne, les balises s'appliquent dans le textarea, mais j'ai l'alerte suivante "cet objet ne gère pas cette propritété ou cette méthode"...
cs_renaud63 Messages postés 17 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
14 févr. 2008 à 17:34
Merci de ta réaction rapide...
En fait j'ai posté aussi sur Dev.net puisque tu avais eu la gentillesse de poster ce code sur le forum. Puis j'ai testé avec cet autre source (sensiblement différente de celle-ci). Ca fonctionne aussi avec IE, et sur FF, bizarre, les balises s'affichent bien...mais en dehors du textarea. Sous l'image où je mets le onclick, en fait.
Par ailleurs, je suis allé jeté un oeil sur ton blog. 16 ans ? J'en suis pas revenu.
Bravo, jeune homme !
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
14 févr. 2008 à 17:29
Voila, c'est mis à jour, est-ce que tu peux tester voir si tu rencontre encore le pb ?
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
14 févr. 2008 à 17:22
En effet, tu as raison, il y a bien un bug.
Celui-ci est situé ligne 179 : this.beforeText est à remplacer par beforeText (sans le this donc)

Je mets à jour immédiatement
cs_renaud63 Messages postés 17 Date d'inscription mardi 24 janvier 2006 Statut Membre Dernière intervention 4 avril 2008
13 févr. 2008 à 21:58
Bonsoir, déja, bravo pour ce script...époustoufflant !

Mon but est le même que _KLESK : écrire des balises HTML dans un textarea autour des mots sélectionnés.
Je suis donc parti de la page index.htm

<script>
function insertBalise(input, name, args) {
// Donne le focus à l'élément
input.focus();
// Si rien n'est sélectionné, il faut mettre la séléction en fin de boite de texte sous FireFox
if (document.selection instanceof SelectionObject && input.selectionStart 0 && input.selectionEnd 0)
{
input.selectionStart input.selectionEnd input.value.length;
}
// Méthode commune pour ajouter la balise
var range = document.selection.createRange();
range.text = "["+name+(args?"="+args:"")+"]"+range.text+"/"+name+"";
}
</script>

J'ai mis ensuite le onclick sur une image, puis le texterea.
Ca fonctionne bien sur IE mais pas sur Firefox.
"this.beforeText has no properties".

Qu'est ce que j'ai raté dans l'appel de la fonction ?
Merci de tes lumières.
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
24 déc. 2007 à 18:46
C'est bon, je vais publier demain ma version corrigée (je n'ai pas le temps aujourd'hui hélas)
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
24 déc. 2007 à 10:36
alors effectivement avec ça :
function test()
{
var textRange = document.selection.createRange();
el = document.getElementById('mon_txt_area');
var selectionText = el.value.substr(el.selectionStart, el.selectionLength);
alert(selectionText);
}
je n'ai plus de Undefined, mais par contre j'ai plus rien du tout !! Le alert() est vide, ai-je encore louper quelquechose ?? . ?? Oo ??

j'avoue que ja n'arrive pas bien à saisir le principe :s

mais un petit coup de pouce n'est pas de refus.
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
22 déc. 2007 à 20:02
Ah oui, en effet, je n'ai pas prévu ce cas-là.
Sur FireFox, il faut faire

// el = ton textarea
var selectionText = el.value.substr(el.selectionStart, el.selectionLength)

Je vais voir si je peux ajouter ce cas spécifique à mon script
_klesk Messages postés 70 Date d'inscription jeudi 14 avril 2005 Statut Membre Dernière intervention 20 août 2008
22 déc. 2007 à 19:06
Bonjour,

Je n'arrive pas un recuperer la sélection d'un textarea

le resultat que je veux obtenir = > du text du text Mon text selectionner encore du text encore du text

J'ai fait simplement
function test()
{
var textRange = document.selection.createRange();
alert(textRange.text);
}
Mais cele me renvois Undefined.

Pourriez vous m'aider svp ?
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 à 16:24
ajouté les 2 functions getFrameWindow et getFrameDocument
mis ce que tu as sonné : alert==>undefined.
peut-être inutile d'encombrer ici ? ce serait dommage
pour la source.
on continue sur le forum dans ma question. ok ?
@+
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
5 avril 2007 à 16:08
Je viens de remettre le script à jour (dans __defineSetter("htmlText, ...), j'ai remplacé "div" par "htmlSection")
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 à 16:02
ne pas tenir compte de mes bourdes !
je reteste en essayanr d'en faire moins.
@+
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
5 avril 2007 à 16:01
// (Voir réponse sur le forum pour getFrameWindow)
var iframeWindow=getFrameWindow(document.getElementById('saisie'));
var iframeSelection = iframeWindow.document.selection
if (!iframeSelection) { iframeSelection=new SelectionObject(iframeWindow); }
var iframeRange=iframeSelection.createRange();
alert(iframeRange.text);
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 à 15:53
je fais :

saisie étant l'ID de l'Iframe,

var Champ=document.getElementById('saisie').contentDocument;
#### pas sûr qu'il fallait faire ça ! ################
var iframeSelection = Champ.getSelection();
#### mais sinon, plante sur la ligne précédente ####
//if (!iframeSelection)
{
iframeSelection=new SelectionObject(iframeWindow);
}
var iframeRange=iframeSelection.createRange();
#### createRange undefined

alert(iframeRange);
iframeRange="exemple";

je crois (?) qu'il y a un } en trop en fin de ton script
ou alors j'ai mal copié. enlevé pour tester.

@+
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
5 avril 2007 à 15:15
Est-ce que tu pourrais tester et voir si tu as des problèmes ?
Ce serait bête de passez à coté d'un truc maintenant alors que ca commence enfin à ressembler à qqchose...
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
5 avril 2007 à 15:09
Pour la gestion des iframes, voila ce que je te propose.

J'ai mis à jour mon script et tu devras faire comme cela :
var iframeSelection = iframeWindow.document.selection;
if (!iframeSelection) {
iframeSelection=new SelectionObject(iframeWindow);
}
var iframeRange=iframeSelection.createRange();
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 à 15:05
tout baigne.
il ne me reste plus "qu'à adapter" à un[e] iframe.
@+
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
5 avril 2007 à 14:49
Voila, c'est ok pour controlRange.text="newSelection" et controlRange.htmlText="newSelection"
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 à 14:28
>>...c'est pas facile
oh non.

>>alors j'utilise document.getSelection
ok. pareil.

>>Ca marche sur IE ca ?
oui.
sel = objet.selection.createRange();
sel.text="tout ce qu'on veut y compris des balises..."
( avec ton script ou pas d'ailleurs )
dommage, si en plus on pouvait mettre ça dans un Iframe,
ça répondait pile poil à mon souci.

>>Pour les iframes, faut mettre le script dans la page de l'iframe
ce que je ne voulais ( ne pouvais presque ) pas faire... hélas.
il faudrait qu'il reste dans la page principale.
j'ai quand même posé la question dans le forum
quelquefois que...

en tous cas, le moins qu'on puisse dire du script : nickel.
ça n'a pas du être simple...
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
5 avril 2007 à 14:08
Pour les iframes, faut mettre le script dans la page de l'iframe et faire IFrame.document.selection.createRange(), si je me rappelle bien
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
5 avril 2007 à 14:06
Ah ben non, le remplacement ca marche pas... Ca marche sur IE ca ? Si oui, faudra que je trouve un moyen de rendre mon script compatbile... Peut-être avec execCommand...
FREMYCOMPANY Messages postés 276 Date d'inscription jeudi 12 janvier 2006 Statut Membre Dernière intervention 22 décembre 2008
5 avril 2007 à 14:03
Oui, pardon, j'ai laissé ma méthode de test ;)
Pour l'histoire du decrapted, je sais mais en fait, c'est parce que document.getSelection renvoie le texte sélectionné alors que window.getSelection renvoie une objet selection, et pour obtenir le texte sélectionné depuis cet objet, c'est pas facile alors j'utilise document.getSelection ;)
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 à 11:31
à priori c'est exactement ce dont j'ai besoin, ou presque !
mais je n'arrive pas à l'utiliser... avec FF justement ! (ie ok )

probable que j'utilise mal !

1° Deprecated method document.getSelection() called.
Please use window.getSelection() instead.
2° Erreur : document.getElementById("s4") has no properties
Fichier source : file:///D:/Utilitaires/EasyPHP/www/PIC/test_2.htm
Ligne : 44

je fais :
<script type="text/javascript">
...ton script...
</script>
un mot exemple toto d'autres mots ...


en mettant cete ligne en commentaire
( //document.getElementById("s4").innerHTML=msg; )
l'affichage des caractères sélectionnés fonctionnent,
pas "leur remplacement"

une petite question :
#### peut-on appliquer sur un iframe ?
si oui : comment ?
ne pas utiliser window.getSelection(); mais
mais iframe.contentWindow ou .contentDocument
ou ... je ne sais pas[.Window].getSelection
ou ...
Rejoignez-nous