当前位置:首页 > JavaScript

js实现光标

2026-02-02 11:21:03JavaScript

光标操作基础方法

在JavaScript中操作光标通常涉及DOM元素的selection和range对象。通过这两个核心API可以精确控制光标位置、选中文本范围等行为。

获取当前光标位置:

const selection = window.getSelection();
const range = selection.getRangeAt(0);
const cursorPosition = range.startOffset;

设置光标到元素末尾:

const element = document.getElementById('editable');
const range = document.createRange();
range.selectNodeContents(element);
range.collapse(false); // true为开头,false为末尾
const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);

输入框光标控制

对于<input><textarea>元素,可以使用更简单的selection API:

获取光标位置:

const input = document.querySelector('input');
const startPos = input.selectionStart;
const endPos = input.selectionEnd;

设置光标位置:

input.setSelectionRange(3, 5); // 选中第3到第5个字符
input.focus(); // 需要先获取焦点

富文本编辑器光标处理

在contenteditable元素中操作光标更复杂,需要处理跨节点的情况:

插入文本到光标处:

function insertTextAtCursor(text) {
    const selection = window.getSelection();
    if (selection.rangeCount) {
        const range = selection.getRangeAt(0);
        range.deleteContents();
        const textNode = document.createTextNode(text);
        range.insertNode(textNode);
        // 移动光标到插入内容之后
        range.setStartAfter(textNode);
        range.collapse(true);
        selection.removeAllRanges();
        selection.addRange(range);
    }
}

保存与恢复光标位置

需要先保存光标状态:

function saveCursorPosition(editableDiv) {
    const selection = window.getSelection();
    const range = selection.getRangeAt(0);
    const preSelectionRange = range.cloneRange();
    preSelectionRange.selectNodeContents(editableDiv);
    preSelectionRange.setEnd(range.startContainer, range.startOffset);
    const start = preSelectionRange.toString().length;
    return { start, end: start + range.toString().length };
}

恢复光标位置:

function restoreCursorPosition(editableDiv, savedPos) {
    const charIndex = 0;
    const range = document.createRange();
    range.setStart(editableDiv, 0);
    range.collapse(true);

    let nodeStack = [editableDiv], node, foundStart = false;

    while (!foundStart && (node = nodeStack.pop())) {
        if (node.nodeType === 3) {
            const nextCharIndex = charIndex + node.length;
            if (!foundStart && savedPos.start >= charIndex && savedPos.start <= nextCharIndex) {
                range.setStart(node, savedPos.start - charIndex);
                foundStart = true;
            }
            charIndex = nextCharIndex;
        } else {
            let i = node.childNodes.length;
            while (i--) {
                nodeStack.push(node.childNodes[i]);
            }
        }
    }

    const selection = window.getSelection();
    selection.removeAllRanges();
    selection.addRange(range);
}

常见光标操作场景

移动光标到特定元素:

function moveCursorToElement(element) {
    const range = document.createRange();
    range.selectNodeContents(element);
    range.collapse(false);
    const selection = window.getSelection();
    selection.removeAllRanges();
    selection.addRange(range);
}

获取当前选中文本:

const selectedText = window.getSelection().toString();

删除光标前的字符:

js实现光标

function deleteBeforeCursor() {
    const selection = window.getSelection();
    if (!selection.rangeCount) return;

    const range = selection.getRangeAt(0);
    if (range.startOffset === 0) return;

    const newRange = range.cloneRange();
    newRange.setStart(range.startContainer, range.startOffset - 1);
    newRange.deleteContents();
}

这些方法覆盖了JavaScript中光标操作的主要场景,实际应用中可能需要根据具体需求进行调整组合。

标签: 光标js
分享给朋友:

相关文章

js 实现vue

js 实现vue

实现 Vue 的核心功能 在 JavaScript 中实现 Vue 的核心功能需要模拟数据绑定、虚拟 DOM 和响应式系统。以下是一个简化版的实现思路: 响应式系统 通过 Object.define…

css3结合js制作

css3结合js制作

CSS3 结合 JavaScript 制作动态效果 CSS3 和 JavaScript 结合可以实现丰富的动态效果,包括动画、交互和响应式设计。以下是几种常见的实现方式: CSS3 动画与 Java…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: functio…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 c…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…