【问题标题】:Cursor moves to the beginning of a text field光标移动到文本字段的开头
【发布时间】:2010-11-23 23:27:56
【问题描述】:

我在使用 IE8(并且只有 IE)时遇到了一定的问题,当我关注一个包含文本的输入字段时,光标会移动到该字段的开头。我正在尝试将光标设置在末尾。我搜索了一下,找到了以下解决方案:

function setSelectionRange(input, selectionStart, selectionEnd) {
    input = document.getElementsByTagName("input")[0];
    if (input.createTextRange) {
        var range = input.createTextRange();
        range.collapse(true);
        range.moveEnd('character', selectionEnd);
        range.moveStart('character', selectionStart);
        range.select();
    }
}

这里的“输入”只是一个输入字段,属于一个类(var inputElement = this.input;)。问题在于“setSelectionRange”和“createTextRange”。难道我做错了什么? createTextRange 是否只为 TextArea 定义?

@Edit:在将输入更改为 document.getElementsByTagName("input")[0];我可以转到“createTextRange”分支,但它仍然不会改变光标的位置。

@Edit2:我稍微更改了代码,现在我从文档中获取输入并进入 if 分支。但随后浏览器向我显示:

Unexpected call to method or property access.

在这条线上var range = input.createTextRange();

@Edit3:回答詹姆斯的问题。我有一个班级,在那个班级中,整个事情都与一个有输入的 jsp 相关联。在这个类中,我为与 jsp inputElement.focus(onInputFocus) 的输入表单关联的字段设置了一个焦点处理程序,然后我有这样的事情:

function onInputFocus() {
    isFocused = true;
    valueDivElement.hide();
    labelElement.html(labelFocus);
    if (currentData.selectedEntityCode) {
        inputElement.val(currentData.selectedEntityCode);
        inputElement.attr('title', currentData.selectedEntityCode);
    } else {

    }

    var input = document.getElementsByTagName("input")[0];
    input.value = input.value;
}

整个类显然要大得多,这不是我的代码,但我猜这是执行的最后一件事。

【问题讨论】:

  • 此函数适用于<input type="text"> 元素。您确定您传递的元素是 DOM 输入元素吗?
  • 是的,我仔细检查了它。现在的问题是“var range = input.createTextRange();”不知道为什么。它进入该分支,但在该行失败,其余部分未执行。
  • 如果那里失败了,错误信息是什么?你把重点放在哪里?
  • 我添加了收到的错误消息。我没有将焦点放在任何地方。
  • 我只收到带有单选框/复选框的错误消息。是否可以使用 jsfiddle 创建 bug 的演示?

标签: javascript jquery internet-explorer internet-explorer-8


【解决方案1】:

抱歉,我在这里遗漏了什么?您是想将光标设置到末尾,还是突出显示范围?您的问题似乎暗示前者,但解决方案实现了后者。

如果你只是想把光标设置到末尾,那么上面的函数就没有必要了。设置焦点后,只需执行以下操作:

input.value = input.value; //assumes input is a DOM element.

查看这个 JSFiddle:http://jsfiddle.net/7vdv6/

编辑:

据我所知,有一大堆东西可能会分散您的输入注意力:

isFocused = true;
valueDivElement.hide();
labelElement.html(labelFocus);
if (currentData.selectedEntityCode) {
    inputElement.val(currentData.selectedEntityCode);
    inputElement.attr('title', currentData.selectedEntityCode);
} else {

}

如果在最后两行之间添加 focus() 会发生什么:

var input = document.getElementsByTagName("input")[0];
input.focus();
input.value = input.value;

你也得到了 jQuery 和标准 JavaScript 的混乱组合。例如,你可以使用$("input:first"),为什么还要使用document.getElementsByTagName("input")[0]??

【讨论】:

  • 是的,我只是想将光标设置在末尾。我已经尝试过“input.value = input.value;”但不知何故,它没有工作,光标仍然自动转到开头。
  • 你什么时候打电话? IE。这是你做的最后一件事吗?你能告诉我们它周围的代码吗?
猜你喜欢
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 2019-11-14
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 2014-01-11
  • 2023-02-20
相关资源
最近更新 更多