2010-07-06 17 views
6

w polu wejściowym, jeśli użytkownik naciśnie klawisz Backspace lub Delete, czy istnieje sposób na usunięcie usuniętego znaku.Uzyskanie usuniętego znaku

Muszę sprawdzić to na podstawie wyrażeń regularnych.

+0

Musisz sprawdzić * znak * wobec wyrażenia regularnego? – mkluwe

+0

możesz dołączyć handler * * i poczekać na znak Backspace, zapobiec domyślnej akcji, zrobić to samemu, ale zanim będziesz wiedział, co to jest ostatnia postać, możesz zrobić to za pomocą wyrażenia regularnego. – galambalazs

Odpowiedz

7

Następujące będzie działać we wszystkich głównych przeglądarek dla elementów tekstowych <input>. Nie należy go używać w przypadku elementów <textarea>, ponieważ funkcja getInputSelection nie uwzględnia poprawności linii w IE. Zobacz this answer dla (dłuższej) funkcji, która to zrobi.

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

Otrzymuję błąd w input.createTextRange. obiekt nie obsługuje tej właściwości lub metody. –

+0

@dIvYaNsHsInGh: To musi oznaczać, że obiekt, który przekazujesz, nie jest elementem input/textarea. –

3

Nie, brak zmiennej przechowującej usunięty znak. O ile nie masz historii cofania/ponawiania, ale trudno byłoby uzyskać informacje z tego komponentu.

Najprościej byłoby porównać zawartość pola wejściowego przed i po usunięciu/cofnięciu.

1

można spróbować coś z pozycji karetki:

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)); 
    } 
}​ 

Testowane na Chrome 6. Zobacz jsFiddle dla przykładu

+1

Troska o wyjaśnienie '(range.offsetLeft - 1)/7;'? –

+0

Err, nie mam pojęcia, szukałem funkcji pozycji opiekuńczej w Google – Harmen

+0

Funkcja pozycji opiekuńczej jest podejrzana. Nie tylko dla tej linii, której cel jest poza mną, ale dla testu dla 'control.selectionStart && control.selectionEnd': to zwróci false, jeśli oba mają wartość 0, co nie jest dobre i spowoduje błędy w przeglądarkach innych niż IE. –

Powiązane problemy