Détecter le retour arrière et la suppression sur l'événement «d'entrée»?

93

Comment faire ça?

J'ai essayé:

var key = event.which || event.keyCode || event.charCode;

if(key == 8) alert('backspace');

mais ça ne marche pas ...

Si je fais la même chose sur l'événement keypress, cela fonctionne, mais je ne veux pas utiliser keypress car il génère le caractère tapé dans mon champ de saisie. J'ai besoin de pouvoir contrôler ça


mon code:

  $('#content').bind('input', function(event){

    var text = $(this).val(),
        key = event.which || event.keyCode || event.charCode;

    if(key == 8){
      // here I want to ignore backspace and del
    }

    // here I'm doing my stuff
    var new_text = 'bla bla'+text;
    $(this).val(new_text);
  });

aucun caractère ne doit être ajouté dans mon entrée, à part ce que j'ajoute avec val () en fait, l'entrée de l'utilisateur doit être complètement ignorée, seule l'action d'appuyer sur la touche est importante pour moi

Alex
la source
3
En fait, vous n'avez pas besoin de faire l'événement or'ing -, ce qui est très bien, jQuery normalise l'objet événement pour vous. Voir api.jquery.com/category/events/event-object
Niko
Vous êtes censé mettre le nom de l'événement comme premier argument de .bind, pas comme sélecteur. Devrait être$('content').bind('keypress', ...
pmrotule le

Réponses:

119

Utilisez .onkeydownet annulez la suppression avec return false;. Comme ça:

var input = document.getElementById('myInput');

input.onkeydown = function() {
    var key = event.keyCode || event.charCode;

    if( key == 8 || key == 46 )
        return false;
};

Ou avec jQuery, car vous avez ajouté une balise jQuery à votre question:

jQuery(function($) {
  var input = $('#myInput');
  input.on('keydown', function() {
    var key = event.keyCode || event.charCode;

    if( key == 8 || key == 46 )
        return false;
  });
});

Wouter J
la source
19
Et si vous vouliez capturer l'entrée d'un clic droit> coller?
ctb le
6
keydownne fonctionne pas dans Chrome Android, il renvoie le vide en cliquant sur retour arrière ou del
Kosmetika
2
En fonction, nous devons garder l'événement comme paramètre, alors seulement cela fonctionnera comme la fonction (événement) -------------------------- var input = document. getElementById ('myInput'); input.onkeydown = function (événement) {var key = event.keyCode || event.charCode; if (key == 8 || key == 46) return false; };
Anurag_BEHS
1
avec jQuery, il filtre enteret backspaceclés en interne sur les inputévénements, et ces pressions sur les touches ne l'atteignent pas
vsync
@Wouter - Non pas que ce soit un gros problème, mais je pense qu'il y a une faute de frappe dans le code de jquery. Je pense que vous vouliez ajouter le nom de paramètre "event" au gestionnaire d'événements on-keydown.
RoboBear
14

Avec jQuery

La propriété event.which normalise event.keyCode et event.charCode. Il est recommandé de regarder l'événement pour la saisie des touches du clavier.

http://api.jquery.com/event.which/

jQuery('#input').on('keydown', function(e) {
    if( e.which == 8 || e.which == 46 ) return false;
});
SerzN1
la source
2
J'utilise jQuery depuis longtemps, mais je n'ai pas vu cela. Toujours bon d'apprendre quelque chose de nouveau. +1!
Sablefoste
9

event.key === "Retour arrière"

Plus récent et beaucoup plus propre: utilisation event.key. Fini les codes numériques arbitraires!

input.addEventListener('keydown', function(event) {
    const key = event.key; // const {key} = event; ES6+
    if (key === "Backspace" || key === "Delete") {
        return false;
    }
});

Documents Mozilla

Navigateurs pris en charge

Gibolt
la source
Parfois, event.key renvoie "Process" pour une raison que je ne comprends pas ...
Oscar Chambers
C'est un navigateur pris en charge. Vous avez peut-être un bogue, ou peut-être que votre clavier personnalisé ne déclenche pas les événements
keydown
3

Avez-vous essayé d'utiliser «onkeydown»? C'est l'événement que vous recherchez.

Il fonctionne avant l'insertion de l'entrée et vous permet d'annuler l'entrée de caractères.

iMoses
la source
mais comment l'annuler? parce que j'utilise val () sur l'entrée et qu'il ajoute toujours le caractère tapé
Alex
3
Et pourquoi pas event.preventDefault()?
Niko
Vous pouvez simplement return false;annuler tout événement lors de l'utilisation de jQuery.
iMoses
3

C'est une vieille question, mais si vous vouliez attraper un événement de retour arrière lors de la saisie, et non keydown, keypress ou keyup - comme j'ai remarqué que l'une de ces fonctions interrompent certaines fonctions que j'ai écrites et provoquent des retards gênants avec le formatage automatique du texte : Vous pouvez intercepter un retour arrière en utilisant inputType:

document.getElementsByTagName('input')[0].addEventListener('input', function(e) {
    if (e.inputType == "deleteContentBackward") {
        // your code here
    }
});
Brandon McConnell
la source
3

keydown avec event.key === "Backspace" or "Delete"

Plus récent et beaucoup plus propre: utilisation event.key. Fini les codes numériques arbitraires!

input.addEventListener('keydown', function(event) {
    const key = event.key; // const {key} = event; ES6+
    if (key === "Backspace" || key === "Delete") {
        return false;
    }
});

Style moderne:

input.addEventListener('keydown', ({key}) => {
    if (["Backspace", "Delete"].includes(key)) {
        return false
    }
})

Documents Mozilla

Navigateurs pris en charge

Gibolt
la source
2
$('div[contenteditable]').keydown(function(e) {
// trap the return key being pressed
if (e.keyCode === 13 || e.keyCode === 8)
{
    return false;
}
});
Phanikumar Jatavallabhula
la source
1
Code clé 8 pour "BackSpace"
Phanikumar Jatavallabhula
La question concerne le retour arrière et la suppression, pas le retour arrière et l'entrée.
Paul
0
//Here's one example, not sure what your application is but here is a relevant and likely application 
function addDashesOnKeyUp()
{
    var tb = document.getElementById("tb1"); 
    var key = event.which || event.keyCode || event.charCode;

    if((tb.value.length ==3 || tb.value.length ==7 )&& (key !=8) ) 
    {
        tb.value += "-"
    } 
}
user2125311
la source
0

sur les appareils Android utilisant Chrome, nous ne pouvons pas détecter un retour arrière. Vous pouvez utiliser une solution de contournement pour cela:

var oldInput = '',
    newInput = '';

 $("#ID").keyup(function () {
  newInput = $('#ID').val();
   if(newInput.length < oldInput.length){
      //backspace pressed
   }
   oldInput = newInput;
 })
Aafaq Ahmad
la source
Je ne veux vraiment pas que ce soit la réponse, mais il semble que ce soit le cas, puisqu'ils ont fixé whichet keyCodeà 229. Il doit y avoir un meilleur moyen, ou un meilleur moyen à venir, mais je vais utiliser essentiellement cela pour le moment. ..
JohnnyFun