Écrit par Neil Deakin
,
mise à jour par les contributeurs à MDC
.
Traduit par Adrien Bustany (19/07/2004), mise à jour par Cyril trumpler (15/04/2005) , Alain B. (04/04/2007) .
Page originale :
http://developer.mozilla.org/en/docs/XUL_Tutorial/Focus_and_Selection
Attention : Ce tutoriel est ancien et n'est pas mis à jour. Bien que beaucoup d'informations soient encore valables pour les dernières versions de gecko, beaucoup sont aussi obsolètes. Il est préférable d'aller consulter cette page sur la version française de ce tutoriel sur developer.mozilla.org.
Cette section va décrire comment manipuler le focus et la sélection des éléments.
L'élément focalisé est l'élément qui reçoit les événements entrants. S'il y a trois champs de saisie sur une fenêtre, celui qui détient le focus est celui dans lequel l'utilisateur peut taper du texte. Un seul élément à la fois peut détenir le focus.
L'utilisateur peut changer le focus en cliquant sur un élément avec la souris ou en appuyant sur la touche Tab (tabulation). Lorsque la touche tabulation est appuyée, le focus passe à l'élément suivant. Pour revenir en arrière, il suffit d'appuyer sur les touches Maj (shift) et Tab simultanément.
Vous pouvez changer l'ordre dans lequel les éléments seront focalisés quand l'utilisateur appuiera sur la
touche Tab en ajoutant un attribut tabindex
à un élément. Cet
attribut doit être renseigné avec un nombre. Lorsque l'utilisateur appuiera sur la touche Tab, le focus
sera donné à l'élément ayant l'index de tabulation consécutif le plus haut. Cela implique que vous pouvez
ordonner les éléments en définissant des indices pour séquencer les éléments. Toutefois, vous
n'aurez normalement pas à définir l'attribut tabindex
. Dans ce cas, un appui
sur la touche tabulation donnera le focus à l'élément suivant affiché. Vous avez seulement besoin de
définir des indices de tabulation si vous voulez utiliser un ordre différent. Voici un exemple :
<button label="Bouton 1" tabindex="2"/>
<button label="Bouton 2" tabindex="1"/>
<button label="Bouton 3" tabindex="3"/>
L'événement 'focus' est utilisé pour réagir lorsqu'un élément obtient le focus. L'événement 'blur' est utilisé
pour réagir lorsqu'un un élément perd le focus. Vous pouvez réagir aux changements de focus en ajoutant un
attribut onfocus
ou onblur
à un élément. Ils
fonctionnent de la même façon que leurs homologues HTML. Vous pouvez utiliser ces événements pour mettre un
élément en surbrillance ou afficher un texte dans la barre d'état. L'exemple suivant peut s'appliquer à une
fonction de gestion des événements de focus.
<script>
function displayFocus() {
var elem=document.getElementById('sbar');
elem.setAttribute('value','Entrez votre numéro de téléphone.');
}
</script>
<textbox id="tbox1"/>
<textbox id="tbox2" onfocus="displayFocus();"/>
<description id="sbar" value=""/>
Quand l'événement 'focus' est déclenché, il va appeler la fonction displayFocus
. Cette fonction va
changer la valeur du libellé
texte. Nous pourrions développer cet exemple pour effacer le texte quand l'événement 'blur' a lieu.
Généralement, vous utiliserez les événements focus et blur pour mettre à jour certaines parties de votre interface,
quand l'utilisateur sélectionne des éléments. Par exemple, vous pouvez mettre à jour un total quand l'utilisateur
entre des valeurs dans d'autres champs, ou utiliser les événements de focus pour vérifier certaines valeurs.
N'affichez pas de messages d'alerte pendant un événement focus ou blur, car ils pourraient distraire l'utilisateur
et ils dégradent le design de l'interface.
Vous pouvez aussi ajouter dynamiquement des gestionnaires d'événements en utilisant la fonction DOM
addEventListener
. Vous pouvez l'utiliser pour n'importe quel élément et type
d'événement. Elle prend trois paramètres : le type d'événement, une fonction à exécuter quand l'événement
est produit et un booléen indiquant la phase de capture de l'événement.
L'élément ayant le focus est pris en charge par un objet appelé « répartiteur de commandes », dont il ne peut y avoir qu'une instance par fenêtre. Le répartiteur de commandes garde la trace de l'objet qui a le focus pendant que l'utilisateur se sert de l'interface. Le répartiteur de commandes a d'autres rôles, qui seront abordés plus tard dans la section des commandes. Pour le moment, nous allons nous intéresser à quelques fontions relatives au focus du répartiteur de commandes.
Vous pouvez récupérer le répartiteur de commandes d'une fenêtre en utilisant la propriété
commandDispatcher
du document. À partir de là, vous pouvez obtenir l'élément focalisé
avec la propriété focusedElement
du répartiteur. L'exemple ci-dessous illustre ce cas.
<window id="focus-example" title="Exemple Focus"
onload="init();"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script>
function init() {
addEventListener("focus",setFocusedElement,true);
}
function setFocusedElement() {
var focused = document.commandDispatcher.focusedElement;
document.getElementById("focused").value = focused.tagName;
}
</script>
<hbox>
<label control="username" value="Nom d'utilisateur:"/>
<textbox id="username"/>
</hbox>
<button label="Bonjour"/>
<checkbox label="Se souvenir de ce choix"/>
<label id="focused" value="-pas de focus-"/>
</window>
Dans cet exemple, un gestionnaire d'événement de focus est attaché à la fenêtre. Nous voulons utiliser
un gestionnaire de capture d'événements, donc la méthode addEventListener
doit être utilisée. Elle associe un gestionnaire de capture d'événements à la fenêtre qui appellera la
méthode setFocusedElement
. Cette méthode récupère l'élément focalisé depuis le
répartiteur de commandes et modifie un libellé avec le nom de sa balise. Quand l'élément focalisé
change, le libellé montre le nom de l'élément.
Plusieurs choses sont à noter :
control
pointant vers l'id du champ de saisie.control
, donc un clic dessus n'affecte pas l'élément focalisé. Seuls les éléments focalisables peuvent être focalisés.Si vous créez des éléments personnalisés, vous pouvez décider si un élément peut prendre
le focus ou non. Il vous suffit d'utiliser la propriété de style spéciale
-moz-user-focus
. Cette propriété détermine si un élément peut être focalisé ou
non. Par exemple, vous pouvez rendre un libellé focalisable, comme dans l'exemple ci-dessous.
<label id="focused" style="-moz-user-focus: normal;"
onkeypress="alert('Étiquette focalisée');" value="Focalise moi"/>
La propriété de style est réglée à normal. Vous pouvez aussi la définir à ignore pour
désactiver le focus pour un élément. Toutefois, elle ne doit pas être utilisée pour désactiver un élément ;
l'attribut ou la propriété disabled
doit être utilisée dans ce cas, car elle a
été conçue pour. Dans l'exemple, une fois le libellé focalisé, il peut réagir aux événements du
clavier. Évidemment, le libellé ne donne aucune indication sur son focus, car il n'est
normalement pas prévue pour cet usage.
Il existe plusieurs façons de changer d'élément focalisé. La plus simple est d'appeler la méthode focus
de
l'élément XUL que vous voulez focaliser. La méthode blur
peut être employée afin d'enlever le focus d'un élément.
L'exemple suivant met en pratique ces principes :
<textbox id="addr"/>
<button label="Focus" oncommand="document.getElementById('addr').focus()"/>
Vous pouvez aussi utiliser les méthodes advanceFocus
et
rewindFocus
du répartiteur de commandes. Ces méthodes changent le focus respectivement
vers l'élément suivant ou précédent de la séquence de tabulation. Elles correspondent aux actions réalisées
lorsque l'utilisateur appuie sur Tab ou Maj+Tab.
Pour les champs de saisie, un attribut spécial, focused
est ajouté quand l'élément obtient
le focus. Vous pouvez vérifier la présence de cet attribut pour déterminer si l'élément a le focus, soit depuis un script,
soit depuis une feuille de styles. Il aura la valeur true si le champ de saisie a le focus, et le cas échéant,
l'attribut ne sera pas présent.
Supposons que vous souhaitez déplacer le focus vers le prochain emplacement connu par le navigateur. pour y arriver, un utilisateur va typiquement appuyer sur la touche Tab. Vous pouvez faire la même chose dès lors que vous disposez d'un document de navigation XUL en faisant :
document.commandDispatcher.advanceFocus();
En fait, l'objet commandDispatcher
implémente simplement l'interface
nsIDOMXULCommandDispatcher. D'autres fonctions peuvent également vous intéressez si vous manipulez des focus.
focus()
.Deux événements peuvent être utilisés lorsque l'utilisateur modifie la le contenu d'un champ de saisie. Naturellement, ces événements seront uniquement transmis au champ de saisie ayant le focus.
Lorsque vous travaillez avec un champ de saisie, vous pouvez récupérer uniquement le texte que l'utilisateur a sélectionné. Ou alors vous pouvez changer la sélection.
Les champs de saisie XUL offrent la possibilité de récupérer et de modifier une sélection. La plus simple et de sélectionner
tout le texte du champ. Cela implique l'utilisation de la méthode select
du champ de saisie.
tbox.select();
Toutefois, vous pouvez aussi sélectionner seulement une partie du texte. Il vous suffit d'utiliser la fonction
setSelectionRange
. Elle prend deux paramètres, le premier représente le caractère de départ et le second
le caractère suivant le dernier que vous voulez sélectionner. Les valeurs commencent à zéro, donc le premier caractère est indicé à 0,
le second à 1 et ainsi de suite.
tbox.setSelectionRange(4,8);
Cet exemple va sélectionner le cinquième caractère affiché, ainsi que le sixième, le septième et le huitième. S'il n'y avait que six caractères présents dans le champ, seuls le cinquième et le sixième auraient été sélectionnés. Aucune erreur ne serait signalée.
Si vous utilisez la même valeur pour les deux paramètres, le début et la fin de la sélection changent pour la même position. Le résultat revient à changer la position du curseur dans le champ de saisie. Par exemple, la ligne ci-dessous peut être utilisée pour ramener le curseur au début du texte.
tbox.setSelectionRange(0,0);
Vous pouvez récupérer la sélection en cours en utilisant les propriétés selectionStart
et
selectionEnd
. Ces propriétés définissent respectivement le début et la fin de la sélection. Si
les deux sont définies à la même valeur, aucun texte n'est sélectionné, mais les valeurs représentent la position du curseur.
Une fois que vous avez les valeurs de début et de fin, vous pouvez récupérer la section de chaîne du texte.
Vous pouvez récupérer et modifier le contenu du champ de saisie en utilisant la propriété value
.
Une autre propriété utile des champs de saisie est la propriété textLength
qui contient le nombre
total de caractères dans le champ.
Dans la prochaine section, nous découvrirons comment utiliser les commandes.
Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™
sont des marques de la fondation Mozilla.