2010-07-06 123 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