272 votes

Comment savoir si le verrouillage des majuscules est activé en utilisant JavaScript ?

Comment savoir si le verrouillage des majuscules est activé en utilisant JavaScript ?

Un bémol toutefois : j'ai cherché sur Google et la meilleure solution que j'ai trouvée consiste à joindre un fichier de type onkeypress à chaque entrée, puis vérifie à chaque fois si la lettre appuyée est une majuscule, et si c'est le cas, vérifie si shift a également été maintenue enfoncée. Si ce n'est pas le cas, alors le verrouillage des majuscules doit être activé. Cela semble vraiment sale et juste... gaspillage - Il y a sûrement un meilleur moyen que ça ?

1 votes

Juste par curiosité, pourquoi voulez-vous détecter le verrouillage des majuscules dans une application web ?

221 votes

PARCE QUE BEAUCOUP TROP DE MES UTILISATEURS REMPLISSENT LEURS FORMULAIRES COMME ÇA.

7 votes

@nicf : Si c'est la raison, pourquoi ne pas lancer un regexp sur l'entrée et leur demander d'arrêter de crier s'il y a trop de lettres majuscules ?

129voto

user110902 Points 849

Dans jQuery,

$('#example').keypress(function(e) { 
    var s = String.fromCharCode( e.which );
    if ( s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey ) {
        alert('caps is on');
    }
});

Évitez l'erreur, comme la touche retour arrière, s.toLowerCase() !== s est nécessaire.

5 votes

En fait... fromCharCode m'a évité d'avoir à vérifier. cependant, il faut noter que keydown et keypress donnent des codes de caractères différents, ce qui est la raison pour laquelle je me suis trompé en premier lieu.

5 votes

-1 car cela fonctionne UNIQUEMENT s'ils n'ont pas appuyé sur shift pendant que CAPS est activé.

1 votes

Si quelqu'un veut voir un exemple en direct avec bootstrap alors vous pouvez voir ici bootply.com/91792

96voto

rajesh pillai Points 5180

Vous pouvez l'essayer. Nous avons ajouté un exemple fonctionnel. Lorsque le focus est sur l'entrée, le fait d'activer le verrouillage des majuscules fait que la led passe du rouge au vert. (Je n'ai pas testé sur mac/linux)

NOTE : Les deux versions fonctionnent pour moi. Merci pour les contributions constructives dans les commentaires.

ANCIENNE VERSION : https://jsbin.com/mahenes/edit?js,output

Voici aussi une version modifiée (quelqu'un peut-il tester sur mac et confirmer)

NOUVELLE VERSION : https://jsbin.com/xiconuv/edit?js,output

NOUVELLE VERSION :

function isCapslock(e) {
  const IS_MAC = /Mac/.test(navigator.platform);

  const charCode = e.charCode;
  const shiftKey = e.shiftKey;

  if (charCode >= 97 && charCode <= 122) {
    capsLock = shiftKey;
  } else if (charCode >= 65 && charCode <= 90
    && !(shiftKey && IS_MAC)) {
    capsLock = !shiftKey;
  }

  return capsLock;
}

ANCIENNE VERSION :

function isCapslock(e) {
  e = (e) ? e : window.event;

  var charCode = false;
  if (e.which) {
    charCode = e.which;
  } else if (e.keyCode) {
    charCode = e.keyCode;
  }

  var shifton = false;
  if (e.shiftKey) {
    shifton = e.shiftKey;
  } else if (e.modifiers) {
    shifton = !!(e.modifiers & 4);
  }

  if (charCode >= 97 && charCode <= 122 && shifton) {
    return true;
  }

  if (charCode >= 65 && charCode <= 90 && !shifton) {
    return true;
  }

  return false;
}

Pour les caractères internationaux, une vérification supplémentaire peut être ajoutée pour les touches suivantes, selon les besoins. Vous devez obtenir la gamme de codes de clé pour les caractères qui vous intéressent, peut-être en utilisant un tableau de mappage de clé qui contiendra toutes les clés de cas d'utilisation valides que vous adressez...

majuscules de A à Z ou "Ä", "Ö", "Ü", minuscules a-Z ou 0-9 ou "ä", "ö", "ü".

Les clés ci-dessus ne sont que des exemples de représentation.

1 votes

Ce n'est peut-être pas la meilleure implémentation, mais quand je l'ai écrite, j'essayais de la garder simple. Je pense que la seule façon de le faire est de couvrir les différents navigateurs.

2 votes

J'ai constaté que l'utilisation de cette fonction avec la touche " keydown " (dans chrome) fait que tous les codes sont pris en compte en tant que majuscules. Si j'utilise keypress, cela fonctionne.

2 votes

Trouver chaque combinaison de caractères possible pour tous les caractères internationaux est voué à manquer certains cas. Utilisez plutôt les méthodes toUpper/Lower case pour vérifier la casse.

24voto

Borgar Points 12493

Vous pouvez détecter le verrouillage des majuscules en utilisant "la lettre est en majuscule et aucune majuscule n'a été pressée" en utilisant une capture de pression de touche sur le document. Mais vous devez alors vous assurer qu'aucun autre gestionnaire d'appui sur les touches ne fait éclater la bulle d'événement avant qu'elle n'atteigne le gestionnaire du document.

document.onkeypress = function ( e ) {
  e = e || window.event;
  var s = String.fromCharCode( e.keyCode || e.which );
  if ( (s.toUpperCase() === s) !== e.shiftKey ) {
    // alert('caps is on')
  }
}

Vous pourriez saisir l'événement pendant la phase de capture dans les navigateurs qui le supportent, mais cela semble quelque peu inutile car cela ne fonctionnera pas sur tous les navigateurs.

Je ne vois pas d'autre moyen de détecter l'état de verrouillage des majuscules. La vérification est simple de toute façon et si des caractères non détectables ont été tapés, eh bien... alors la détection n'était pas nécessaire.

Il y avait un article sur les 24 façons sur ce sujet l'année dernière. Assez bon, mais il manque la prise en charge des caractères internationaux (utilisation de toUpperCase() pour contourner ce problème).

0 votes

C'est en fait ce que je cherchais. Cela fonctionne avec les chaînes de caractères latines et cyrilliques. Merci !

0 votes

Cela fonctionne bien, mais des touches comme ESPACE et les chiffres signalent l'avertissement. Vous connaissez une solution de contournement (tout aussi concise/élégante) ?

1 votes

De plus, c'est bien que vous notiez l'incomplétude, mais elle EST toujours incomplète. Je ne suis pas sûr de savoir comment résoudre ce problème avec cette méthode.

13voto

joshuahedlund Points 632

De nombreuses réponses existantes vérifient si le verrouillage des majuscules est activé lorsque la touche shift n'est pas enfoncée, mais ne le vérifient pas si vous appuyez sur shift et obtenez des minuscules, ou vérifient cela mais ne vérifient pas également si le verrouillage des majuscules est désactivé, ou vérifient cela mais considèrent les touches non alpha comme "désactivées". Voici une solution jQuery adaptée qui affichera un avertissement si une touche alpha est pressée avec des majuscules (shift ou non), désactivera l'avertissement si une touche alpha est pressée sans majuscules, mais ne désactivera ou n'activera pas l'avertissement lorsque des chiffres ou d'autres touches sont pressés.

$("#password").keypress(function(e) { 
    var s = String.fromCharCode( e.which );
    if ((s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey)|| //caps is on
      (s.toUpperCase() !== s && s.toLowerCase() === s && e.shiftKey)) {
        $("#CapsWarn").show();
    } else if ((s.toLowerCase() === s && s.toUpperCase() !== s && !e.shiftKey)||
      (s.toLowerCase() !== s && s.toUpperCase() === s && e.shiftKey)) { //caps is off
        $("#CapsWarn").hide();
    } //else upper and lower are both same (i.e. not alpha key - so do not hide message if already on but do not turn on if alpha keys not hit yet)
  });

12voto

Joe Liversedge Points 2134

Dans JQuery. Cela couvre le traitement des événements dans Firefox et vérifie les caractères majuscules et minuscules inattendus. Cela présuppose un <input id="password" type="password" name="whatever"/> et un élément séparé avec l'id ' capsLockWarning qui contient l'avertissement que nous voulons afficher (mais qui est caché autrement).

$('#password').keypress(function(e) {
    e = e || window.event;

    // An empty field resets the visibility.
    if (this.value === '') {
        $('#capsLockWarning').hide();
        return;
    }

    // We need alphabetic characters to make a match.
    var character = String.fromCharCode(e.keyCode || e.which);
    if (character.toUpperCase() === character.toLowerCase()) {
        return;
    }

    // SHIFT doesn't usually give us a lowercase character. Check for this
    // and for when we get a lowercase character when SHIFT is enabled. 
    if ((e.shiftKey && character.toLowerCase() === character) ||
        (!e.shiftKey && character.toUpperCase() === character)) {
        $('#capsLockWarning').show();
    } else {
        $('#capsLockWarning').hide();
    }
});

0 votes

Je ne sais pas trop pourquoi, mais cette méthode ne fonctionne pas dès la première pression sur une touche (testé uniquement sur Chrome).

0 votes

Serait-ce le problème du masquage des champs vides ? Je n'ai pas réussi à le faire fonctionner correctement, du moins dans Chrome. Cela se produit automatiquement dans de nombreux autres navigateurs (du moins dans ma version, ci-dessous) parce que les retours arrière comptent et effacent le mssg.

0 votes

Note : comme vous l'avez correctement utilisé ici, vous devez utiliser la fonction keypress d'utiliser des boîtiers différents à l'entrée, parce que les deux keydown y keyup retournera toujours les majuscules . Par conséquent, cela ne tirer la clé de verrouillage du capuchon ...si vous aviez l'intention de combiner avec e.originalEvent.getModifierState('CapsLock')

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