javascript - 使用 Javascript 移动光标位置?

标签 javascript contenteditable caret

我希望将插入符恰好移动到其当前位置之前的四个空格,以便我可以正确插入制表符。我已经在插入符号的位置插入了 HTML,但是当我插入 HTML 时,插入符号被留下了。在过去的一个小时左右的时间里,我一直在研究各种方法来做到这一点,而且我已经尝试了很多方法,但我无法让它们中的任何一种为我工作。这是我尝试过的最新方法:

function moveCaret(input, distance) {
    if(input.setSelectionRange) {
        input.focus();
        input.setSelectionRange(distance, distance);
    } else if(input.createTextRange) {
        var range = input.createTextRange();
        range.collapse(true);
        range.moveEnd(distance);
        range.moveStart(distance);
        range.select();
    }
}

它什么都不做——不移动插入符号,不抛出任何错误或任何东西。这让我感到困惑。是的,我知道上面的方法集(应该)将插入符号设置在从指定节点(即 input)开始的某个位置,但即使这样也行不通。那么,我究竟做错了什么,我该如何做对呢?


编辑:基于 o.v.提供,我设法拼凑了一些东西,最终做了一些事情:抛出错误。耶!这是新代码:

this.moveCaret = function(distance) {
    if(that.win.getSelection) {
        var range = that.win.getSelection().getRangeAt(0);
        range.setStart(range.startOffset + distance);
    } else if (that.win.document.selection) {
        var range = that.win.document.selection.createRange();
        range.setStart(range.startOffset + distance);
    }
}

现在,这给出了错误 Uncaught Error: NOT_FOUND_ERR: DOM Exception 8。有什么想法吗?

最佳答案

您拥有的代码片段用于文本输入和文本区域,而不是 contenteditable 元素。

如果您的所有内容都在一个文本节点中并且选择完全包含在其中,则以下内容将适用于所有主流浏览器,包括 IE 6。

演示:http://jsfiddle.net/9sdrZ/

代码:

function moveCaret(win, charCount) {
    var sel, range;
    if (win.getSelection) {
        // IE9+ and other browsers
        sel = win.getSelection();
        if (sel.rangeCount > 0) {
            var textNode = sel.focusNode;
            var newOffset = sel.focusOffset + charCount;
            sel.collapse(textNode, Math.min(textNode.length, newOffset));
        }
    } else if ( (sel = win.document.selection) ) {
        // IE <= 8
        if (sel.type != "Control") {
            range = sel.createRange();
            range.move("character", charCount);
            range.select();
        }
    }
}

关于javascript - 使用 Javascript 移动光标位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10778291/

相关文章:

javascript - Highcharts 系列数据不会因 Angular 路线变化而持续存在

javascript - 在 IE 中禁用带有 'contentEditable' 标志的元素的自动 URL 检测

javascript - 如何在可内容编辑列表项(不同缩进)之间移动插入符号,同时保持插入符号 x 偏移量?

java - 如何在新添加的文本末尾自动显示插入符号到 java 中的 textArea?

javascript - 从客户端的目录获取文件列表

javascript - 根据带下划线的嵌套数组对象中的条件查找数组索引

contenteditable 元素的 JavaScript 事件

c# - WPF TextBox 始终将焦点放在文本末尾,除非按下箭头键

javascript - 解释变量 "leaking"是怎样的?

javascript - 将 HTML 标签插入到 contentEditable div 中