IE11 在编辑值时将光标移动到输入的开头
IE11 moves cursor to beginning of input when editing value
我在一个项目中遇到了一个非常奇怪的问题。长话短说,我有记录利率的输入字段,因此在模糊时附加 %,在焦点时删除。它适用于除 IE11 之外的所有浏览器。出于某种原因,它会将光标移动到输入的开头,这对于快速浏览和输入值的人来说很烦人。
这是一个简化的例子:
$('#test').val('default');
$('#test').focus(function() {
var value = $(this).val().slice(0, -1);
$(this).val(value);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="test" />
同样,这只发生在 IE11 中(在旧版本的 IE 中工作正常)。以前有人 运行 处理过这个问题吗?重新分配值后,我尝试再次强制聚焦,但这并没有解决问题。如有任何提示,我们将不胜感激。
您可以尝试在 appending/removing %
标记时手动设置插入符位置,使用这两个函数(它们非常通用,如果您需要为所有浏览器设置插入符位置,则应该适用于每个浏览器其他时间):
function getCaretPosition(element) {
var caretPos = 0;
if (element.type === 'text' || element.type === 'tel') {
if (document.selection) { // IE Support
element.focus();
var Sel = document.selection.createRange();
Sel.moveStart('character', -element.value.length);
caretPos = Sel.text.length;
} else if (element.selectionStart || element.selectionStart === '0') {// Firefox support
caretPos = element.selectionStart;
}
}
return caretPos;
}
function setCaretPosition(element, position) {
if (element.type === 'text' || element.type === 'tel') {
if (element.setSelectionRange) {
element.focus();
element.setSelectionRange(position, position);
} else if (element.createTextRange) {
var range = element.createTextRange();
range.collapse(true);
range.moveEnd('character', position);
range.moveStart('character', position);
range.select();
}
}
}
并且仅在使用 IE11 时调用它们:)另外,如果你愿意,你可以使这些函数更具体,删除 FF 的部分:)
这个问题可以通过以下方式解决:
- 获取对输入元素的引用
- 添加
onfocus
事件处理程序
然后将 onfocus
处理程序中的选择范围设置为输入值的末尾,如下所示:
const onFocus = (el) => {
const { value } = el.value
el.setSelectionRange(value.length, value.length);
}
<input type='text' onfocus='onFocus(this)' />
如果您使用的是 ReactJS,here 就是解决方案。
我在一个项目中遇到了一个非常奇怪的问题。长话短说,我有记录利率的输入字段,因此在模糊时附加 %,在焦点时删除。它适用于除 IE11 之外的所有浏览器。出于某种原因,它会将光标移动到输入的开头,这对于快速浏览和输入值的人来说很烦人。
这是一个简化的例子:
$('#test').val('default');
$('#test').focus(function() {
var value = $(this).val().slice(0, -1);
$(this).val(value);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="test" />
同样,这只发生在 IE11 中(在旧版本的 IE 中工作正常)。以前有人 运行 处理过这个问题吗?重新分配值后,我尝试再次强制聚焦,但这并没有解决问题。如有任何提示,我们将不胜感激。
您可以尝试在 appending/removing %
标记时手动设置插入符位置,使用这两个函数(它们非常通用,如果您需要为所有浏览器设置插入符位置,则应该适用于每个浏览器其他时间):
function getCaretPosition(element) {
var caretPos = 0;
if (element.type === 'text' || element.type === 'tel') {
if (document.selection) { // IE Support
element.focus();
var Sel = document.selection.createRange();
Sel.moveStart('character', -element.value.length);
caretPos = Sel.text.length;
} else if (element.selectionStart || element.selectionStart === '0') {// Firefox support
caretPos = element.selectionStart;
}
}
return caretPos;
}
function setCaretPosition(element, position) {
if (element.type === 'text' || element.type === 'tel') {
if (element.setSelectionRange) {
element.focus();
element.setSelectionRange(position, position);
} else if (element.createTextRange) {
var range = element.createTextRange();
range.collapse(true);
range.moveEnd('character', position);
range.moveStart('character', position);
range.select();
}
}
}
并且仅在使用 IE11 时调用它们:)另外,如果你愿意,你可以使这些函数更具体,删除 FF 的部分:)
这个问题可以通过以下方式解决:
- 获取对输入元素的引用
- 添加
onfocus
事件处理程序
然后将 onfocus
处理程序中的选择范围设置为输入值的末尾,如下所示:
const onFocus = (el) => {
const { value } = el.value
el.setSelectionRange(value.length, value.length);
}
<input type='text' onfocus='onFocus(this)' />
如果您使用的是 ReactJS,here 就是解决方案。