我需要我的正则表达式接受箭头键,字母和数字。我收到了字母和数字,但我卡在了箭头键上。到目前为止我有这个。
var patt = /[^a-zA-Z0-9]+/g;
var helper;
$('#name').keyup(function(e){
helper = $('#name').val();
helper = helper.replace(patt,' ');
$('#name').val(helper);
});

感谢您的帮助。
答案 0 :(得分:13)
问题是,当keyup
事件被触发时,您正在替换元素的整个值。这样,光标将始终重置为结束。
要解决此问题,您可以通过访问元素的selectionStart
property来捕获光标的初始位置。然后在替换值之后,您可以简单地将其设置回原来的位置:
以下是普通JS中的一个示例:
document.getElementById('name').addEventListener('input', function() {
var position = this.selectionStart;
this.value = this.value.replace(/[^a-zA-Z0-9]+/g, '');
this.selectionEnd = position;
});
<input id="name" type="text" />
同样,jQuery版本也是一样的。我还将keyup
事件更改为input
事件,以便仅在实际更改值时触发事件。
$('#name').on('input', function(e) {
var position = this.selectionStart;
this.value = this.value.replace(/[^a-zA-Z0-9]+/g, '');
this.selectionEnd = position;
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="name" type="text" />
作为替代方案,您也可以只听取change
事件,然后替换该值;但是,这不会在输入时更新值。
答案 1 :(得分:2)
当您按箭头键时,您正在更改输入的值,因此光标将失去其位置。这与您正在使用的正则表达式无关。
您不应在输入时修改用户输入。而是在.change()
jQuery回调监听器上进行,而不是.keyup()
答案 2 :(得分:0)
另一种方法是在keyup事件回调中执行event.preventDefault();
,这解决了我的问题