Как да определите дали селекция в DIV с възможност за редактиране на съдържание е отляво надясно или от дясно наляво

В DIV с възможност за редактиране на съдържание искам да определя дали потребителят е направил избор отляво надясно или отдясно наляво. Някой има ли решение за Javascript за браузърите Firefox, Chrome, Safari, Opera? И когато е възможно, също един за IE?

<div id="editor" contenteditable>
Selection from Cursor end | here <strong>over bold</strong> to Cursor start | here.
</div>

Подготвих кода в jsFiddle тук: http://jsfiddle.net/ecUka/

Благодаря предварително :-)


person Max    schedule 29.09.2012    source източник


Отговори (1)


Ето една функция, която използва факта, че настройването на края на диапазона на DOM да бъде в по-ранна точка в документа от началото на диапазона ще свие диапазона.

Демо: http://jsfiddle.net/97MDR/17/

Код:

function isSelectionBackwards() {
    var backwards = false;
    if (window.getSelection) {
        var sel = window.getSelection();
        if (!sel.isCollapsed) {
            var range = document.createRange();
            range.setStart(sel.anchorNode, sel.anchorOffset);
            range.setEnd(sel.focusNode, sel.focusOffset);
            backwards = range.collapsed;
        }
    }
    return backwards;
}

Работи във всички основни браузъри с изключение на IE ‹ 9, който не поддържа същите API за обхват и избор като другите браузъри.

За IE ‹ 9 просто няма нищо в API за избор, което да ви каже за посоката на избор. Най-доброто, което мога да предложа, е използването на selectionchange< /a> събитие, за да следите предварително избрания диапазон и да видите кой край се е променил всеки път, когато се задейства. Изглежда, че работи в следния пример, но не е тестван освен това, така че използвайте на свой собствен риск.

Демонстрация: http://jsfiddle.net/97MDR/18/

Допълнителен код:

var selectedRange, selectionBackwards;

document.onselectionchange = function(evt) {
    evt = evt || window.event;
    var sel = document.selection;
    if (sel && sel.type !== "Control") {
        if (sel.type == "Text") {
            // Selection is not collapsed, so compare range end points
            var newRange = sel.createRange();
            if (selectedRange) {
                var startChanged = (newRange.compareEndPoints("StartToStart", selectedRange) != 0);
                var endChanged = (newRange.compareEndPoints("EndToEnd", selectedRange) != 0);

                if (startChanged && !endChanged) {
                    selectionBackwards = true;
                } else if (endChanged && !startChanged) {
                    selectionBackwards = false;
                } else if (startChanged && endChanged) {
                    // Both ends have changed, which is confusing.
                    // I suspect this can happen when the selection snaps
                    // to words. In this case we can tell nothing, so leave
                    // selectionBackwards alone.
                } else {
                    // Neither end has changed, so we can tell nothing.
                }
            }

            selectedRange = newRange;
        } else {
            // Selection is collapsed
            selectionBackwards = false;
        }
    }
};
person Tim Down    schedule 29.09.2012
comment
Благодаря ви, точно това търся :-) Някой има ли решение и за Internet Explorer версии 6, 7 и 8? - person Max; 30.09.2012
comment
@Max: Освен ако няма нещо много неясно, което никога не съм открил след известно търсене, това не е възможно в 6-8. Просто няма нищо в JavaScript API, което може да се използва за получаване на посоката на избор. - person Tim Down; 30.09.2012
comment
@Max: Може да успеете да направите нещо, като наблюдавате selectionchange събитие (напр. проследяване на предварително избрания диапазон и виждане кой край се е променил) - person Tim Down; 30.09.2012
comment
@Max: Измислих нещо, което изглежда работи в много ограничения тестов случай, върху който го пробвах. Вижте актуализирания ми отговор. - person Tim Down; 30.09.2012
comment
Проверката на range.collapsed изглежда по-проста от compareDocumentPosition. - person webprogrammer; 17.04.2020