我正在使用正则表达式从javascript中的文本输入区域中删除无效字符(在IE中运行)。我在每个keyup事件上运行replace函数。但是,这会使光标在每次按键后跳转到文本框的末尾,这使得无法进行内联编辑。
这是实际行动:
有没有人知道怎么做,所以光标不会跳转到输入框的末尾?
答案 0 :(得分:22)
除了gilly3's answer之外,我认为有人可能会发现查看实际的代码段很有用。
在下面的示例中,在JavaScript字符串操作之前,从selectionStart
元素检索input
属性。然后在操作之后将selectionStart
设置回初始位置。
根据您要实现的目标,您还可以代替selectionEnd
访问selectionStart
,并设置范围:setSelectionRange(start, end)
。
document.getElementById('target').addEventListener('input', function (e) {
var target = e.target,
position = target.selectionStart; // Capture initial position
target.value = target.value.replace(/\s/g, ''); // This triggers the cursor to move.
target.selectionEnd = position; // Set the cursor back to the initial position.
});
<p>The method <code>.replace()</code> will move the cursor's position, but you won't notice this.</p>
<input type="text" id="target" />
答案 1 :(得分:14)
您必须手动将光标放回原点。对于IE9,请设置.selectionStart
和.selectionEnd
(或使用.setSelectionRange(start, end)
)。对于IE8及更早版本,请使用.createTextRange()
并在文本范围内调用.moveStart()
。
答案 2 :(得分:0)
我遇到了同样的问题,我发现https://www.sitepoint.com/6-jquery-cursor-functions/有解决方案。这里有6种方法可让您获取/设置输入/文本区域中的光标位置。我相信这也适用于内容可编辑的字段!
这非常有用,因为该错误仅针对IE和Windows 7组合显示。
这是我的之前代码
$body.on('input paste','.replace-special-chars',function () {
let coma = /‚/g;
let doubleQuotes = /[“”]/g;
let singleQuotes = /[‘’]/g;
$(this).val($(this).val().replace(doubleQuotes,'"'));
$(this).val($(this).val().replace(coma,','));
$(this).val($(this).val().replace(singleQuotes,"'"));
$(this).val($(this).val().replace(/[^\x00-\xff]/g, '- '));
});
和我的after代码,这些代码利用了我在上述网站上找到的jquery方法
$body.on('input paste','.replace-special-chars',function () {
let position = $(this).getCursorPosition();
let coma = /‚/g;
let doubleQuotes = /[“”]/g;
let singleQuotes = /[‘’]/g;
$(this).val($(this).val().replace(doubleQuotes,'"'));
$(this).val($(this).val().replace(coma,','));
$(this).val($(this).val().replace(singleQuotes,"'"));
$(this).val($(this).val().replace(/[^\x00-\xff]/g, '- '));
$(this).setCursorPosition(position);
});