我正在清理输入字段并手动获取和设置过程中的插入位置。通过一些抽象,这是基本的想法:
<input type="text" onkeyup"check(this)">
和javascript ...
function check(element) {
var charPosition = getCaretPosition(element);
$(element).val( sanitize( $(element).val() ) );
setCaretPosition(element, charPosition);
}
function sanitize(s) {
return s.replace(/[^a-zA-Z0-9\s]/g, '');
}
这个工作正常,除非一个角色确实被消毒了,我的插入位置是一个。基本上我想要一种方法来查看sanitize函数是否实际上已经替换了一个字符(以及在什么索引处),因此我可以在必要时调整charPosition。有什么想法吗?
答案 0 :(得分:3)
嗯,比较之前和之后的值会不会更简单,然后相应地进行补偿? -
charPosition -= beforeVal.length - afterVal.length;
答案 1 :(得分:2)
J-P的回答对您的特定问题最简单。
一般来说,如果您想知道替换的结果,最简单的方法是编写自己的替换函数:
var numReplaced = 0;
function sanitize(s) {
return s.replace(/[^a-zA-Z0-9\s]/g, replacementFunc);
}
function replacementFunc() {
numReplaced += arguments[0].length;
return "";
}
答案 2 :(得分:2)
我个人认为您应该重新考虑将更改为正在输入的数据。这是不寻常的,可能令人困惑。一种更好的技术可能是在视觉上通知用户,并可能禁止模糊或在onblur期间简单消毒。
或者,考虑使用onkeydown并返回false,如果键入了错误的键,这将使键完全短路,并且无需替换字段中的文本。
<input type="text" onkeydown="return check(event)">
虽然您必须手动处理键码,包括修饰符(shift,ctrl,...):
<script>
function check(e) {
var w = e.which;
var k = e.ctrlKey||e.altKey||e.metaKey;
var m = k||e.shiftKey;
return (!k && w>=65&&w<90) // a-z allowing shift
||(!m && w>=48&&w<=57) // 0-9 no modifiers
||(w>=33&&w<=40) // navigation keys
||w==8 // Backspace
||w==9 // Tab
||w==13 // Return
||w==32 // Space
||w==46 // Delete
;
}
</script>