32 votes

Détectez quel champ de formulaire a le focus en utilisant JavaScript ou jQuery

Comment détecter le champ de formulaire qui a le focus en utilisant JavaScript ou jQuery?

À partir d'une fonction, je veux être capable de déterminer quel champ de formulaire a le focus. Je voudrais pouvoir le faire en JavaScript pur et/ou en jQuery.

62voto

Juan Mendes Points 31678

document.activeElement, il est supporté dans IE depuis longtemps et les dernières versions de FF et de Chrome le supportent également. Si rien n'a le focus, il renvoie l'objet document.body.

17voto

Paolo Bergantino Points 199336

Je ne suis pas sûr que ce soit la manière la plus efficace, mais vous pouvez essayer :

var selectedInput = null;
$(function() {
    $('input, textarea, select').focus(function() {
        selectedInput = this;
    }).blur(function(){
        selectedInput = null;
    });
});

16 votes

Très inefficace pour les grandes structures DOM, ne prend pas en charge l'ajout dynamique d'éléments, que dire des liens ?. Surpris que cela ait été choisi comme bonne réponse

2 votes

@Juan Mendes: Tout ne doit pas être une solution globale pour chaque situation. Croyez-le ou non, la plupart du temps vous aurez <10 entrées et aucun champ ajouté dynamiquement et cela fonctionnera très bien.

6 votes

La plupart du temps, moins de 10 inputs et ne pas les ajouter dynamiquement ? Peut-être pour les formulaires simples, pas pour les applications web complexes. Si document.activeElement est disponible dans tous les navigateurs de catégorie A, pourquoi utiliser une solution plus complexe et techniquement inférieure ? De plus, si le focus va vers un lien, cela vous donnera un faux positif. Je préviens juste l'OP.

3voto

Marc Novakowski Points 22611

Si tout ce que vous voulez faire est de changer le CSS pour un champ de formulaire particulier lorsqu'il obtient le focus, vous pourriez utiliser le sélecteur CSS ":focus". Pour une compatibilité avec IE6 qui ne supporte pas cela, vous pourriez utiliser la bibliothèque IE7.

5 votes

$('#some_id_here input[type=text]:focus') fonctionnera pour les inputs texte.

0 votes

Cela ne fonctionne pas du tout pour moi - y a-t-il un nouveau sélecteur ":focus" ?

0 votes

Je parle d'un sélecteur CSS, pas d'un sélecteur jQuery.

2voto

Maxime Points 275

Sinon, vous pourriez utiliser les événements onfocus et onblur.

quelque chose comme :

et ensuite avoir quelque chose comme ceci dans votre javascript

if (txtfocus==1)
{
//Whatever code you want to run
}

if (txtfocus==0)
{
//Something else here
}

Mais cela ne serait que ma façon de le faire, et cela pourrait ne pas être extrêmement pratique si vous avez, disons, 10 entrées :)

1voto

vapcguy Points 48

Je le ferais de cette façon : j'ai utilisé une fonction qui retournerait un 1 si l'ID de l'élément envoyé déclenchait mon événement, et tous les autres retourneraient un 0, et l'instruction "if" ne ferait alors rien :

function getSender(field) {
    switch (field.id) {
        case "someID":
        case "someOtherID":
            return 1;
        break;
        default:
            return 0;
    }
}

function doSomething(elem) {
    if (getSender(elem) == 1) {
       // faire quelque chose
    }
  /*  else {
       // faire quelque chose d'autre
    }  */
}

Marquage HTML :

Les deux premiers déclencheront l'événement doSomething, le dernier ne le fera pas (ou exécutera la clause else si décommentée).

- Tom

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X