11484 sujets

JavaScript, DOM et API Web HTML5

Bonjour,
J'aimerais détecter en JS quand la touche Ctrl (ou les équivalents Mac / Linux) est pressée.
Mais si elle est pressée avec une autre touche (Ctrl+A, Ctrl+C...), cela ne doit pas la détecter.

Pour essayer directement votre code : https://jsfiddle.net/exercices/dgx1y5af/.

Merci !
Salut,

Le souci qui se pose est qu'avec ton code tu détecte tous les appuis sur CTRL ...
Il faut donc passer par une détection keydown/keyup !

On va détecter l'appui des touches ( juste l'appui (keydown) ).
Si il s'agit d'une touche CTRL on active une variable == true.

On va aussi détecter le relâchement des touches ( keyup ).
On vérifie qu'il s'agit bien d'une touche CTRL, et si aucune touche n'a été appuyée entre temps.

Je te propose donc mon petit JS qui va bien pour ton usage Smiley smile


document.addEventListener('keydown', checkKeyDown);
document.addEventListener('keyup', checkKeyUp);
let ctrlPressed = false;

function checkKeyDown ( event ) {

	if ( event.code == "ControlLeft" || event.code == "ControlRight") {

		ctrlPressed = true;

	} else { ctrlPressed = false; }

};
  
function checkKeyUp ( event ) {

	if ( event.code == "ControlLeft" || event.code == "ControlRight") {

		if ( ctrlPressed ) { alert("CTRL only pressed"); }

	}

};
Par contre, si on clique sur Ctrl + un lien pour l'ouvrir dans un nouvel onglet, le Ctrl est détecté. Comment y remédier ?
Modifié par js_html (02 Dec 2020 - 17:48)
Il faut ajouter une détection d'évènement de la souris qui va dévalider le booléen Smiley smile
Je te laisse essayer de trouver ça, tu as juste une fonction à ajouter !
Si besoin on te proposera un code ^
J'ai rajouté :

document.addEventListener('click',function(){ctrlPressed=false;})

Mais ça ne fonctionne pas.
Pourquoi ?
Modifié par js_html (07 Dec 2020 - 15:41)
Bon j'avoue c'est un peu plus compliqué que ça !

le 'click' n'est pas adapté car si admettons on relache CTRL avant la souris il va y avoir un souci de reset de la variable qui est censé vérifier si la souris est enfoncée.
Et inversement ( j'avais fait quelques tests à une époque et c'est vrai que c'est galère ).
Le souci majeur de ce que tu demande:
_ lors d'un keydown, l'event est répété tant que la touche est pressée.
_ mais ce n'est pas vrai pour un mousedown
Bon alors je n'ai pas voulu entrer dans les preventDefault & stopPropagation et autres joyeusetés, ici c'est du simple, avec une petite tempo pour dévalider le mouseup !

D'ailleurs si quelqu'un à une solution plus élégante je suis preneur Smiley ravi


document.addEventListener('keydown', checkKeyDown,false);
document.addEventListener('keyup', checkKeyUp);
document.addEventListener('mousedown', checkMouseDown);
document.addEventListener('mouseup', checkMouseUp);

let ctrlPressed = false;
let mouseClicked = false;

function checkKeyDown ( event ) {

	if ( event.code == "ControlLeft" || event.code == "ControlRight") {

		ctrlPressed = true;

	} else { ctrlPressed = false; }

};
  
function checkKeyUp ( event ) {

	if ( event.code == "ControlLeft" || event.code == "ControlRight") {

		// on vérifie que y'a pas de click en cours
		if ( ctrlPressed && !mouseClicked ) { alert("CTRL only pressed"); }
			

	}

};

function checkMouseDown ( event ) { mouseClicked = true; };

// petit délai avant de dévalider mouseClicked
function checkMouseUp ( event ) { setTimeout(delayUp, 700); };

function delayUp() { mouseClicked = false; }
Meilleure solution