【问题标题】:Content Editable DIV Clicking/caret Setting内容可编辑的 DIV 单击/插入符号设置
【发布时间】:2012-09-03 10:18:46
【问题描述】:

我有一个标准的内容可编辑 div:

<div id="profileBody" class="customInputDiv" contentEditable='true' autocomplete="off"></div>

基本上我想检测光标在某个事件上的下落(最好是在onclickkeydown 或按钮上工作的代码)。

类似这样:
onkeydown - 将插入符号位置保存在 div 中,然后设置插入符号位置。

这听起来有点傻,但这是必需的,因为在某些事件中我会稍微更改内容,并且在更改光标位置时会非常烦人。

我讨厌在没有我尝试过的示例的情况下提出问题,但是如果您阅读以前的问题,我总是会非常详细地提供我尝试过的内容,只是在这里遇到了死胡同!

function setCaret() {
    var el = document.getElementById("editable");
    var range = document.createRange();
    var sel = window.getSelection();
    range.setStart(el.childNodes[2], 5);
    range.collapse(true);
    sel.removeAllRanges();
    sel.addRange(range);
    el.focus();
}
​

也许是解析来自window.getSelection(); 的数据的好方法?

找到:http://jsfiddle.net/s5xAr/3/ 但我不想要 -- 只是希望它使用函数获取插入符号位置并设置它,例如

getCaretPOS();
//do something
setCaretPOS();

此代码将设置它,但获取它似乎是问题..

【问题讨论】:

    标签: javascript jquery cursor dom-events contenteditable


    【解决方案1】:

    要获取插入符号的位置,请使用此函数:

    function getCaretPosition(editableDiv) {
        var caretPos = 0, containerEl = null, sel, range;
        if (window.getSelection) {
            sel = window.getSelection();
            if (sel.rangeCount) {
                range = sel.getRangeAt(0);
                if (range.commonAncestorContainer.parentNode == editableDiv) {
                    caretPos = range.endOffset;
                }
            }
        } else if (document.selection && document.selection.createRange) {
            range = document.selection.createRange();
            if (range.parentElement() == editableDiv) {
                var tempEl = document.createElement("span");
                editableDiv.insertBefore(tempEl, editableDiv.firstChild);
                var tempRange = range.duplicate();
                tempRange.moveToElementText(tempEl);
                tempRange.setEndPoint("EndToEnd", range);
                caretPos = tempRange.text.length;
            }
        }
        return caretPos;
    }
    

    这应该适用于大多数浏览器(当然,离开 IE)。你似乎已经覆盖了 IE setCaret 函数。

    该函数来自another SO answer. 也请查看 cmets。

    Demo

    【讨论】:

    • console.log($('#' + mainContent)[0].selectionStart);执行返回未定义的操作时
    • @LiamMcCann 哦,是的,没有意识到这不适用于contenteditables。我会看看能不能找到适合他们的东西。
    • @LiamMcCann Rangy 看起来像一个可以帮助您的库。看看有没有。
    • 该功能来自我的答案,并且有缺点。见stackoverflow.com/a/3976125/96100
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2020-07-24
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 2011-10-07
    • 2014-03-10
    相关资源
    最近更新 更多