Gestion de l'événement de sélection de texte dans l'extension Firefox (empêchant l'utilisateur de sélectionner du texte)

Je me demandais si, dans le code chrome, nous avons un meilleur moyen de détecter lorsque l'utilisateur sélectionne / met en évidence quelque chose dans la page actuelle que d'écouter la keyup / mouseup et la vérification de window.getSelection() . Des idées?

Edit: En fait, ce que j'essaye de faire, c'est simplement empêcher l'utilisateur de sélectionner n'importe quel texte dans le document de contenu. Quelque chose qui accomplit cela sera bien aussi. (L'idée derrière l'événement de sélection était juste pour preventDefault() ou autrement getSelection().removeAllRanges() )

Edit2: Notez qu'il ne faut pas seulement empêcher la mise en évidence, mais plutôt la sélection.

Edit3: je n'ai pas besoin d'empêcher la copie, mais plutôt de sélectionner les éléments.

Si vous mettez la scipt suivante dans votre corps, la sélection sera désactivée dans Firefox:

 <script type="text/javascript"> document.body.style.MozUserSelect = "none"; document.body.style.cursor = "default"; </script> 

Il ne désactive pas seulement la mise en surbrillance, mais aussi désactive la sélection elle-même. Si vous essayez de sélectionner une zone via une souris ou par des touches fléchées (en cliquant sur une position et en naviguant avec les touches fléchées lorsque vous appuyez sur SHIFT ) et STRG+C sur STRG+C , rien ne se produit.

La seule sélection qui fonctionne après cette modification est STRG+A (aucune sélection n'est visible, mais STRG+A & STRG+C copie toutes). Il est possible d'éviter cela par des événements de clavier.


Edit: J'ai vu que vous commentiez avec le lien vers Mozilla Doc Center et pendant qu'ils l'écrivent ne contrôle que l'apparence, tous mes tests dans Firefox 3.6 montrent qu'il affecte également la sélection, non seulement l'apparence. Mais il pourrait être modifié dans les versions futures …

En l'absence d'événements appropriés, tels que select et select selectstart (qui est en effet absente dans Firefox, qui a l'événement select , mais ne l'applique que pour former des contrôles), tout ce que vous pouvez faire est d'utiliser des événements de souris et de clavier, comme vous l'avez suggéré dans la question . La prévention de l'action par défaut de tous les événements mousedown dans le document n'est pas bonne car elle empêchera tous les éléments interactifs tels que les liens et les éléments de formulaire de fonctionner. Au lieu de cela, vous pouvez faire quelque chose comme le suivant qui permet de sélectionner une sélection telle qu'elle est effectuée à l'aide de la souris et du clavier.

Cela n'empêchera pas la sélection via "Sélectionner tout" dans le contexte et éditer les menus, car il n'y a aucun moyen de les détecter dans Firefox. Si vous avez besoin de faire face à cela, le vote de la sélection est votre seul espoir.

 function killSelection() { window.getSelection().removeAllRanges(); } document.addEventListener("mousedown", function(evt) { document.addEventListener("mousemove", killSelection, false); }, false); document.addEventListener("mouseup", function(evt) { document.removeEventListener("mousemove", killSelection, false); }, false); document.addEventListener("keydown", killSelection, false); window.addEventListener("blur", function(evt) { document.removeEventListener("mousemove", killSelection, false); }, false); 

Vous pouvez utiliser css

 -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -o-user-select: none; user-select: none; 

Vous pouvez utiliser CSS pour empêcher l'utilisateur de sélectionner du texte. Voir ma réponse ici: Comment désactiver la sélection de sélection de texte à l'aide de CSS?

Pour configurer ceci via JavaScript dans Firefox, vous pouvez effectuer les opérations suivantes:

 document.body.style.MozUserSelect = "-moz-none"; 

La commande Copier est activée et désactivée par un événement. Vous pouvez vous informer de cet événement en créant un programme de mise à jour de commandes.

 <commandset commandupdater="true" events="select" oncommandupdate="setTimeout(selectNone, 0);"/>