2010-07-06 6 views
6

dans le champ de saisie, si l'utilisateur appuie sur la touche Retour arrière ou Suppr, il existe un moyen d'obtenir le caractère supprimé.Obtention du caractère supprimé

Je dois le vérifier par rapport à un RegExp.

+0

Vous devez cocher * un caractère * par rapport à une expression rationnelle? – mkluwe

+0

vous pouvez attacher un gestionnaire * keyup * et attendre le caractère de retour arrière, empêcher l'action par défaut, faire la suppression vous-même mais avant que vous sachiez quel est le dernier caractère afin que vous puissiez faire l'expression régulière. – galambalazs

Répondre

7

Ce qui suit fonctionnera dans tous les principaux navigateurs pour le texte <input> éléments. Il ne doit pas être utilisé pour les éléments <textarea> car la fonction getInputSelection ne tient pas compte des sauts de ligne correctement dans IE. Voir this answer pour une fonction (plus longue) qui fera cela.

function getInputSelection(input) { 
    var start = 0, end = 0; 
    input.focus(); 
    if ( typeof input.selectionStart == "number" && 
      typeof input.selectionEnd == "number") { 

     start = input.selectionStart; 
     end = input.selectionEnd; 
    } else if (document.selection && document.selection.createRange) { 
     var range = document.selection.createRange(); 
     if (range) { 
      var inputRange = input.createTextRange(); 
      var workingRange = inputRange.duplicate(); 
      var bookmark = range.getBookmark(); 
      inputRange.moveToBookmark(bookmark); 
      workingRange.setEndPoint("EndToEnd", inputRange); 
      end = workingRange.text.length; 
      workingRange.setEndPoint("EndToStart", inputRange); 
      start = workingRange.text.length; 
     } 
    } 
    return { 
     start: start, 
     end: end, 
     length: end - start 
    }; 
} 

document.getElementById("aTextBox").onkeydown = function(evt) { 
    evt = evt || window.event; 
    var keyCode = evt.keyCode; 
    var deleteKey = (keyCode == 46), backspaceKey = (keyCode == 8); 
    var sel, deletedText, val; 
    if (deleteKey || backspaceKey) { 
     val = this.value; 
     sel = getInputSelection(this); 
     if (sel.length) { 
      deletedText = val.slice(sel.start, sel.end); 
     } else { 
      deletedText = val.charAt(deleteKey ? sel.start : sel.start - 1); 
     } 
     alert("About to be deleted: " + deletedText); 
    } 
}; 
+0

Je reçois une erreur à input.createTextRange. objet ne supporte pas cette propriété ou méthode. –

+0

@dIvYaNsHsInGh: Cela doit signifier que l'objet que vous transmettez n'est pas un élément input/textarea. –

3

Non, aucune variable ne stocke le caractère supprimé. Sauf si vous avez un historique pour Annuler/Refaire, mais il serait difficile d'obtenir l'information de ce composant.

Le plus simple serait de comparer le contenu du champ de saisie avant et après la suppression/l'effacement arrière.

1

Vous pouvez essayer quelque chose avec la position de caret:

function getCaretPosition(control){ 
    var position = {}; 
    if (control.selectionStart && control.selectionEnd){ 
    position.start = control.selectionStart; 
    position.end = control.selectionEnd; 
    } else { 
    var range = document.selection.createRange(); 
    position.start = (range.offsetLeft - 1)/7; 
    position.end = position.start + (range.text.length); 
    } 

    position.length = position.end - position.start; 
    return position; 
} 

document.getElementById('test').​​​​onkeydown = function(e){ 
    var selection = getCaretPosition(this); 
    var val = this.value; 

    if((e.keyCode==8 || e.keyCode==46) && selection.start!==selection.end){ 
    alert(val.substr(selection.start, selection.length)); 
    } else if(e.keyCode==8){ 
    alert(val.substr(selection.start-1, 1)); 
    } else if(e.keyCode==46){ 
    alert(val.substr(selection.start, 1)); 
    } 
}​ 

Testé sur Chrome 6. Voir jsFiddle pour un exemple

+1

Attention à expliquer '(range.offsetLeft - 1)/7;'? –

+0

Euh, je n'ai aucune idée, j'ai cherché une fonction de position d'insertion sur Google – Harmen

+0

La fonction de position d'insertion est douteuse. Non seulement pour cette ligne, dont le but est au-delà de moi, mais pour le test de 'control.selectionStart && control.selectionEnd': cela retournera false si les deux sont 0, ce qui n'est pas bon et causera des erreurs dans les navigateurs non IE. –

Questions connexes