jquery在contenteditable div中设置光标位置

时间:2010-05-20 04:51:04

标签: jquery focus contenteditable caret cursor-position

问题的旧版本如下,在研究了更多之后,我决定重新解释这个问题。像以前一样的问题是,我需要在没有突出显示文本的情况下关注一个可信的div,直接进行焦点突出显示Chrome中的文本。

我意识到人们通过重置textarea中的插入位置来解决textareas中的这个问题。我怎么能用一个满足的元素来做到这一点?我试过的所有插件只适用于textareas。感谢。

问题的老措辞:

  

我有一个令人满意的元素   我想集中注意力,但仅限于此   将光标放在前面   元素,而不是选择   一切。

     带有jquery的

elem.trigger('focus');   选择整个文本中的所有文本   铬中的元素。 Firefox表现得很好   正确地,将插入符号设置为   前面的文字。我怎样才能得到   Chrome可以按我想要的方式运行,或者是   也许不是我正在寻找的重点   对

谢谢大家。

5 个答案:

答案 0 :(得分:29)

也许我误解了这个问题,但是不会做以下事情(假设一个可编辑的<div>带有ID“可编辑”)?计时器就在那里,因为在Chrome中,选择整个元素的本机浏览器行为似乎在focus事件之后触发,从而覆盖了选择代码的效果,除非推迟到焦点事件之后:

var div = document.getElementById("editable");

div.onfocus = function() {
    window.setTimeout(function() {
        var sel, range;
        if (window.getSelection && document.createRange) {
            range = document.createRange();
            range.selectNodeContents(div);
            range.collapse(true);
            sel = window.getSelection();
            sel.removeAllRanges();
            sel.addRange(range);
        } else if (document.body.createTextRange) {
            range = document.body.createTextRange();
            range.moveToElementText(div);
            range.collapse(true);
            range.select();
        }
    }, 1);
};

div.focus();

答案 1 :(得分:20)

  

演示http://so.lucafilosofi.com/jquery-setting-cursor-position-in-contenteditable-div/

      <div id="editable" contentEditable="true">
            <h2>Lorem</h2> <p>ipsum dolor <i>sit</i> 
               amet, consectetur <strong>adipiscing</strong> elit.</p> Aenean.
        </div>

    <script type="text/javascript">
        $(function () {
            $('[contentEditable="true"]').on('click', function (e) {
                if (!$(this).hasClass('editing')) {
                    var html = $(this).html();
                    if (html.length) {
                        var range = rangy.createRange();
                        $(this).toggleClass('editing').html('<span class="content-editable-wrapper">' + html + '</span>');
                        var $last = $(this).find('.content-editable-wrapper');
                        range.setStartAfter($last[0]);
                        range.collapse(false);
                        rangy.getSelection().setSingleRange(range);
                    }
                }
            }).on('blur', function () {
                $(this).toggleClass('editing').find('.content-editable-wrapper').children().last().unwrap();
            });
        });
    </script>

答案 2 :(得分:3)

是的,因为你已经使用了

elem.trigger('focus'); 

尝试使用类或标识要触发触发事件的元素。

答案 3 :(得分:1)

我在围绕DOM讨论之后设法解决了这个问题。

elm.focus();
window.getSelection().setPosition(0);

它可能只适用于WebKit浏览器,但由于它是问题的唯一来源,我添加了一个条件(使用jQuery)

if(!$.browser.webkit) {
    elm.focus();
} else {
    elm.focus();
    window.getSelection().setPosition(0);
}

希望这能解决你的问题。

答案 4 :(得分:0)

在pre或div标签中设置指针位置:

function setCursor(pos) {
    var el = document.getElementById("asd");
    var range = document.createRange();
    var sel = window.getSelection();
    range.setStart(el.childNodes[0], pos);
    range.collapse(true);
    sel.removeAllRanges();
    sel.addRange(range);
    el.focus();
}

$('button').click(function () {
    setCursor(5);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="asd" contenteditable="true" >
asd
two
</div>
<button>Set caret position</button>

来源:https://social.msdn.microsoft.com/Forums/en-US/f91341cb-48b3-424b-9504-f2f569f4860f/getset-caretcursor-position-in-a-contenteditable-div?forum=winappswithhtml5