сбросить позицию курсора в редактируемом контенте после смены dom - PullRequest
2 голосов
/ 13 июня 2011

Я увеличиваю текст, пока он написан, например, например. подсветка синтаксиса через промежутки вокруг kewords, в contentediatable области.

У меня есть общая проблема, когда курсор прыгает к началу состязания. Я попробовал решение Нико Бернса на Установить позицию курсора на contentEditable

, оно работало в примере, но не для моего кода, возможно, потому что я меняю DOM внутри самого contenteditable.

полный код по адресу: http://pastie.org/2060277

output.addEventListener('keyup',augmentInput,false);
        output.addEventListener('keydown',saveCursorPos,false);
        output.addEventListener('mousedown',saveCursorPos,false);
        output.addEventListener('keyup',restoreCursorPos,false);

        function saveCursorPos(e){
            //var selection = window.getSelection();
            savedRange = window.getSelection().getRangeAt(0);
            console.log("save "+e.type,savedRange);
        }

        function restoreCursorPos(e){
        document.getElementById("output").focus();

            if (savedRange != null) {
                var s = window.getSelection();

                if (s.rangeCount > 0){
                    s.removeAllRanges();
                }

                s.addRange(savedRange);
                console.log("range !=0 "+e.type, savedRange);
            }

            else {
                window.getSelection().addRange(savedRange);
                console.log("range ==0 "+e.type, savedRange);
            }
        }

поразительный:

  • то, что Range сохраняется как следует при щелчке мыши (в отношении самого внутреннего элемента, в котором находится курсор, с правильным смещением), но не в том случае, если он сохраняется при нажатии клавиши (чем в отношении самого contenteditable, startOffset всегда 0 , неважно где был курсор)
  • Если я запрещаю сохранение курсора при нажатии клавиши и просто использую указатель мыши, чтобы сохранить диапазон, к которому он восстанавливается, как если бы он никогда не сохранялся должным образом или изменялся: ссылка на сам contenteditable, startOffset всегда 0. Поэтому мне интересно объект диапазона изменяется, например отражающие изменения в DOM?

1 Ответ

1 голос
/ 13 июня 2011

Диапазоны реагируют на изменения в DOM, и есть правила, регулирующие это . Отражены ли изменения, влияющие на выбранные диапазоны, в выборе, не указано, а поведение браузера меняется.

Если вы вносите большие изменения в DOM, я бы предложил использовать другой подход, например, тот, который использовался при выборе модуль сохранения / восстановления в моем Rangy библиотека, которая вставляет временные невидимые элементы маркера в DOM в начале и конце выделения.

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