jquery Установка позиции курсора в contenteditable div - PullRequest
35 голосов
/ 20 мая 2010

Старая версия вопроса приведена ниже, после более подробного изучения я решил перефразировать вопрос.Проблема, как и раньше, заключается в том, что мне нужно сфокусировать contenteditable div без выделения текста, а прямая фокусировка выделяет текст в Chrome.

Я понимаю, что люди решили эту проблему в текстовых областях, сбросив положение каретки втекстовое поле.Как я могу сделать это с contenteditable элементом?Все плагины, которые я пробовал, работают только с textareas.Спасибо.

Старая формулировка вопроса:

У меня есть contenteditable элемент, который я хочу сфокусировать, но только в том случае, если поместить курсор впереди элемента, авыделение всего.

elem.trigger('focus'); с помощью jquery выделяет весь текст во всем элементе в chrome.Firefox ведет себя корректно, устанавливая курсор в начале текста.Как заставить Chrome вести себя так, как я хочу, или, может быть, это не то, что мне нужно.

Спасибо всем.

Ответы [ 5 ]

29 голосов
/ 01 июня 2010

Может быть, я неправильно понимаю вопрос, но разве не сработает следующее (предположим, что редактируемый <div> с идентификатором "editable")? Таймер есть, потому что в 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();
20 голосов
/ 27 мая 2010

демо : 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>
3 голосов
/ 20 мая 2010

Да, это происходит потому, что вы использовали

elem.trigger('focus'); 

, пытаясь использовать класс или определить элемент, для которого вы хотите запустить событие триггера.

1 голос
/ 09 июня 2010

Мне удалось решить эту проблему после небольшой прогулки по DOM.

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

Вероятно, он работает только в браузерах WebKit, но поскольку это единственный источник проблемы, я добавил условное выражение (с использованием jQuery)

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

Надеюсь, это решит вашу проблему.

0 голосов
/ 29 января 2018

Установить позицию указателя в теге 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...