@Blender: Non, cette question concerne la mise en évidence du texte dans un élément, pas une zone de texte. Les deux sont assez différents.
Tim Down
Réponses:
194
Pour empêcher l'utilisateur de s'énerver lorsque tout le texte est sélectionné à chaque fois qu'il essaie de déplacer le curseur à l'aide de sa souris, vous devez le faire en utilisant l' focusévénement, pas l' clickévénement. Ce qui suit fera le travail et contournera un problème dans Chrome qui empêche la version la plus simple (c.-à-d. Appeler simplement la select()méthode de textarea dans un focusgestionnaire d'événements) de fonctionner.
<textarea id="foo">Some text</textarea><script type="text/javascript">var textBox = document.getElementById("foo");
textBox.onfocus =function(){
textBox.select();// Work around Chrome's little problem
textBox.onmouseup =function(){// Prevent further mouseup intervention
textBox.onmouseup =null;returnfalse;};};</script>
Version jQuery:
$("#foo").focus(function(){var $this = $(this);
$this.select();// Work around Chrome's little problem
$this.mouseup(function(){// Prevent further mouseup intervention
$this.unbind("mouseup");returnfalse;});});
Je pense qu'il est préférable de mettre en œuvre ce truc en utilisant un bouton séparé "sélectionner tout le texte" car la sélection automatique du texte sur le focus ou les événements de clic est vraiment ennuyeux.
@zack: L'exemple jsFiddle de cette réponse fonctionne pour moi dans Chrome. N'est-ce pas pour vous? Je suis d'accord que la réponse à laquelle vous avez lié est plus infaillible.
Tim Down
@TimDown: vous avez raison, j'étais un peu trop zélé - en fait cela fonctionne correctement sur `` clic '', mais échoue si vous entrez tabdans la zone de texte - votre autre solution fonctionne pour les deux cas :)
zack
Changez légèrement le code ci-dessus et cela fonctionnera comme un charme .. $("#foo").mouseup(function() {$("#foo").unbind("mouseup");return false;}); vous devez faire référence à la zone de texte sans utiliser thissimplement le renvoyer avec le chemin complet .. et cela fonctionnera ..
pratikabu
14
Meilleure façon, avec une solution au problème de tabulation et de chrome et une nouvelle méthode jquery
$("#element").on("focus keyup",function(e){var keycode = e.keyCode ? e.keyCode : e.which ? e.which : e.charCode;if(keycode ===9||!keycode){// Hacemos selectvar $this = $(this);
$this.select();// Para Chrome's que da problema
$this.on("mouseup",function(){// Unbindeamos el mouseup
$this.off("mouseup");returnfalse;});}});
mais je ne sais pas comment vérifier si le texte est déjà sélectionné, donc je peux inverser les deux actions :(
Alex
1
@Alex: Je ne dérangerais pas trop ça si j'étais toi. Les utilisateurs attendent un comportement standard des zones de texte.
Tim Down
non, cette zone de texte particulière est uniquement destinée au copier-coller. tout le texte que j'ai à l'intérieur est une grosse chaîne cryptée qui ne peut être soit entièrement remplacée, soit copiée dans le presse
Alex
@Alex: Ah, c'est vrai. Vous voudrez peut-être le rendre en lecture seule en ajoutant ensuite l' readonlyattribut.
Tim Down
1
@Hollister: Non, il est parfaitement possible pour l'utilisateur ou le script de sélectionner du contenu dans un div. Vous envisagez probablement de copier dans le presse-papiers, ce qui n'est pas possible dans un script sans une bibliothèque Flash comme ZeroClipboard.
Peut-être que signaler cette question comme un doublon pourrait être plus utile? Ce n'était pas vraiment votre réponse, il vaudrait donc mieux fusionner les deux questions.
Blender
D'accord - Bien que le PO puisse bénéficier de l'explication supplémentaire pour sa mise en œuvre. :)
Todd
Cette question concerne la mise en évidence d'un texte dans un élément, pas une zone de texte. Les deux sont assez différents.
Tim Down
merci, j'ai découvert que je peux faire ça avec $(this).select(), je vais l'utiliser parce que c'est moins de code :)
Réponses:
Pour empêcher l'utilisateur de s'énerver lorsque tout le texte est sélectionné à chaque fois qu'il essaie de déplacer le curseur à l'aide de sa souris, vous devez le faire en utilisant l'
focus
événement, pas l'click
événement. Ce qui suit fera le travail et contournera un problème dans Chrome qui empêche la version la plus simple (c.-à-d. Appeler simplement laselect()
méthode de textarea dans unfocus
gestionnaire d'événements) de fonctionner.jsFiddle: http://jsfiddle.net/NM62A/
Code:
Version jQuery:
la source
tab
dans la zone de texte - votre autre solution fonctionne pour les deux cas :)$("#foo").mouseup(function() {
$("#foo").unbind("mouseup");
return false;
});
vous devez faire référence à la zone de texte sans utiliserthis
simplement le renvoyer avec le chemin complet .. et cela fonctionnera ..Meilleure façon, avec une solution au problème de tabulation et de chrome et une nouvelle méthode jquery
la source
J'ai fini par utiliser ceci:
la source
readonly
attribut.la source
Version jQuery légèrement plus courte:
Il gère correctement le boîtier d'angle Chrome. Voir http://jsfiddle.net/Ztyx/XMkwm/ pour un exemple.
la source
Sélection de texte dans un élément (semblable à la mise en évidence avec votre souris)
:)
En utilisant la réponse acceptée sur ce message, vous pouvez appeler la fonction comme ceci:
la source
$(this).select()
, je vais l'utiliser parce que c'est moins de code :)