Ето една функция, която използва факта, че настройването на края на диапазона на 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