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.
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.
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);
}
};
Otrzymuję błąd w input.createTextRange. obiekt nie obsługuje tej właściwości lub metody. –
@dIvYaNsHsInGh: To musi oznaczać, że obiekt, który przekazujesz, nie jest elementem input/textarea. –
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.
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
Troska o wyjaśnienie '(range.offsetLeft - 1)/7;'? –
Err, nie mam pojęcia, szukałem funkcji pozycji opiekuńczej w Google – Harmen
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. –
Musisz sprawdzić * znak * wobec wyrażenia regularnego? – mkluwe
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