2010-11-13 4 views
1

Je suis actuellement en train d'utiliser un commutateur pour déclencher du code quand on appuie sur une touche. Ce n'est pas le code exact, mais ce essentiellement ce que j'utilise (ce qui est juste pour le plaisir de le garder court et simple ici.)Empêche le déclenchement de l'événement de pression de touche lorsque l'entrée est au point

$(document).keydown(function(e) { 
switch(e.keyCode) { 

case 39: 
e.preventDefault(); 
    alert("Arrow Key"); 

break; 

case 37: 
    e.preventDefault(); 
    alert("Arrow Key"); 
} 
}); 

Comment empêcher les événements de mise à feu lorsqu'une entrée boîte est en focus?

+1

ce que sur ce qui ne fonctionne pas ? avez-vous besoin d'appeler également 'e.stopPropagation()'? –

Répondre

4

Je pense que vous voulez dire que vous voulez faire e.preventDefault() seulement si l'élément cible n'était pas une étiquette input. Vous pouvez le faire comme ceci:

$(document).keydown(function(e) { 
    if (e.target.nodeName.toLowerCase() !== 'input') { 
     switch(e.keyCode) { 
      case 39: 
       e.preventDefault(); 
       alert("Arrow Key"); 

       break; 

      case 37: 
       e.preventDefault(); 
       alert("Arrow Key"); 
     } 
    } 
}); 

e.target est l'élément où l'événement est originaire. Vous pouvez également utiliser l'API de délégation d'événements jQuery:

$(document).delegate(':not(input)', 'keydown', function(e) { 
    switch(e.keyCode) { 
     case 39: 
      e.preventDefault(); 
      alert("Arrow Key"); 

      break; 

     case 37: 
      e.preventDefault(); 
      alert("Arrow Key"); 
    } 
}); 

Modifier Mise à jour ma réponse à faire des vérifications « pas une entrée » plutôt que « est une entrée ».

+0

Parfait! Merci beaucoup. Fonctionne comme un charme. Je vous en suis reconnaissant. – mcbeav

1

Il peut y avoir une façon plus élégante mais je voudrais faire quelque chose comme ceci:

var inputHasFocus = false; 
$("#some_input_id").focusin(function() { 
    inputHasFocus = true; 
}).focusout(function() { 
    inputHasFocus = false; 
}); 

et utiliser ensuite dans votre déclaration de cas.

+0

Ce serait mon idée initiale serait de mettre une sorte de compte de variables et de garder une trace de celui-ci, mais la réponse originale fonctionne très bien. Merci pour cela. Je vous en suis reconnaissant. – mcbeav

1

Vous pouvez utiliser document.activeElement qui retourne l'élément actuellement focalisé.

Brève doc du MDN:

Renvoie l'élément actuellement focalisé, qui est l'élément qui se frappe clavier si les types d'utilisateurs tout. Cet attribut est en lecture seule.

C'est, afin d'éviter que des événements de frappe de mise à feu lorsque l'entrée est mise au point, vous pouvez simplement ignorer la gestion des événements de frappe lorsque l'élément ciblé est un input

if (!$(document.activeElement).is("input"){ /* handle keystroke events here */ } 
Questions connexes