Bonjour,

JE METS CE POST EN ATTENTE

EN EFFET J'AI TROUVE UNE ERREUR QUI INTERROMPAIT LE TRAITEMENT DE CREATION DE LIENS D'EVENEMENT, ALORS INCOMPLET

IL EST POSSIBLE QUE LE PROBLEME N'EXISTE PAS

VERIFICATION EN COURS

______________________________________________________________________________________________________________

Contexte
Je développe un outil de gestion de documentation qui crée des références à des éléments de textes (marque-pages avec commentaires etc.).
L'application doit fonctionner dans l’environnement PC et mobile et sur tous les navigateurs courants.
Pour cela j'utilise bien bien sur l'objet "selection" récupéré par document.getSelection(), mais aussi selectionChange, la gestion des Range et l'ensemble des objets associés, mais aussi, bien sur, les évènements d'interface.
La plus grande partie est écrite en JQUERY mais le problème posé n'est pas lié à JQUERY, c'est pour cela que j'utilise ce forum javascript pour la question que je pose.

J'ai réglé de très nombreux problèmes mais je n'arrive pas à résoudre de manière suffisamment satisfaisante le problème suivant :

Nature du problème

Un click sur un bouton (ou tout élément clickable) en environnement PC ne change pas la sélection mais son émulation mobile, elle, si (génère alors un sélection vide).

En conséquence il semble impossible de définir une interaction utilisateur sur un mobile qui puisse lancer une action qui récupère la sélection courante sans avoir perdu préalablement cette sélection.


Principe de l'ergonomie prévue
Une "zone" (div) affiche le contenu de la sélection (analysée) et les données associées calculées ou à saisir.
Cette zone (volet) peut être cachée et un élément (rôle d'un bouton) recoit le "click" qui demande l'affichage (click ou son émulation pour un mobile).

Je cherche:
Quel mécanisme adapté non alambiqué utiliser pour verrouiller la sélection quand l'utilisateur a cliqué pour ouvrir le volet.
(on est en début d'exécution de la fonction associée au onselectionchange, la sélection a changé mais le contenu "vide" n'est pas encore récupéré (getselection() non encore exécuté)


Si Quelqu'un a une idée sur la manière de traiter ce sujet...

Ensuite j'aurais à traiter le cas de navigateur qui ne prend pas en charge selectionchange, puis ceux des mobiles...
Evidemment je cherche une solution assez globale.

Cordialement

Trebly

Note détaillée, compléments :
Détail sur l'ergonomie, on a deux cas utilisateur :
  • Le volet est ouvert en permanence et l'utilisateur voit dynamiquement la sélection "reconditionnée" affichée dans le volet. Quand l'utilisateur a décidé de créer un référence il clique un bouton "figer" qui crée un Range et les données associées, test etc.
  • Le volet est caché (moins d'espace), un repère indique quand une sélection valide existe, l'utilisateur va alors seulement ouvrir/fermer le volet. La sélection courante est sensée rester active lors de l'ouverture/fermeture du volet.

Détail du problème et processus
Dans le cas de l'interface PC (windows) il n'y a aucun problème.
En effet le click souris en interface PC ne désactive pas la sélection, le volet s'ouvre et il est possible de "figer" la sélection (créer un "range" défini fixe) pour pouvoir remplir les données associées.
Dans le cas d'un mobile le click émulé, lui, désactive la sélection courante.
L'environnement du problème
La gestion de la sélection est effectuée de deux manières suivant que onselectionchange existe ou non pour le navigateur.
Je me limite ici pour l'instant ici à ce cas de l'utilisation de onselectionchange (sur PC le test de la sélection sur onmouseup fonctionne très bien en absence de selectionchange).
Sur mobile et avec onselectionchange actif (met à jour le contenu d'une variable sélection et des données) je n'ai pas de solution.
Analyse :
Plusieurs solutions sans issue ? :
  1. Pour cela il faudrait pouvoir tester (simplement) dans le onselectionchange en première instruction si l'élément ciblé dont est issu l'événement est le bouton d'ouverture/fermeture du volet. Si c'est le cas on peut exécuter le gel de la sélection dans l'état précédent.
  2. Je n'ai pas réussi, en effet l'évènement est très fréquent et ? je fige l'exécution probablement par un arrêt de propagation d'événement.
  3. Ne pas utiliser onselectionchange !!! et développer une nouvelle fonction c'est l'aventure...
  4. Dans tous les cas effectuer le traitement (minimal) sur la selection (sauver le range).
    Dans le développement actuel j'affiche dans une textarea simplement la sélection en utilisant window.getSelection().toString().
    Ensuite afficher le range mémorisé et restaurer la sélection depuis ce range. C'est alambiqué.