2010-07-06 207 views
6

,如果用戶按下退格鍵或刪除鍵,是否有辦法獲取已刪除的字符。在輸入字段中輸入已刪除的字符

我需要根據RegExp檢查它。

+0

您需要檢查*字符*對正則表達式嗎? – mkluwe 2010-07-06 09:54:04

+0

您可以附加* keyup *處理程序,並等待退格字符,防止默認操作,自行移除,但在此之前您知道最後一個字符是什麼,以便您可以執行正則表達式。 – galambalazs 2010-07-06 10:19:45

回答

7

下面將在所有主要瀏覽器的工作文字<input>內容,見jsFiddle。它不應該用於<textarea>元素,因爲getInputSelection函數不會在IE中正確計算換行符。請參閱this answer瞭解將執行此操作的(更長)功能。

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

我得到錯誤在input.createTextRange。對象不支持這個屬性或方法。 – 2016-09-08 12:48:44

+0

@dIvYaNsHsInGh:這意味着你傳入的對象不是input/textarea元素。 – 2016-09-08 15:27:11

3

不,沒有變量存儲刪除的字符。除非您有撤銷/重做歷史記錄,但是很難從該組件中獲取信息。

最簡單的方法是比較輸入字段在刪除/退格鍵被按下之前和之後的內容。

1

你可以嘗試一些與插入位置:

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

測試在Chrome 6的一個例子

+1

小心解釋'(range.offsetLeft - 1)/ 7;'? – 2010-07-06 10:23:09

+0

Err,我不知道,我在谷歌上搜索了一個插入符號位置函數 – Harmen 2010-07-06 10:27:48

+0

插入符號位置函數是狡猾的。不僅僅是那條線,其目的超出了我,而是用於'control.selectionStart && control.selectionEnd'的測試:如果它們都是0,這將返回false,這是不好的,並且會在非IE瀏覽器中導致錯誤。 – 2010-07-06 10:45:44