在一个令人满意的DIV中,我想确定,如果用户从左到右或从右到左进行选择。有人为浏览器Firefox,Chrome,Safari,Opera提供了Javascript解决方案吗?如果可能的话,还有一个用于IE?
<div id="editor" contenteditable>
Selection from Cursor end | here <strong>over bold</strong> to Cursor start | here.
</div>
我在jsFiddle中准备了代码:http://jsfiddle.net/ecUka/
提前感谢: - )
答案 0 :(得分:8)
这是一个函数,它使用以下事实:将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&lt; 9,它不支持与其他浏览器相同的Range和Selection API。
对于IE&lt; 9,选择API中根本没有任何内容可以告诉您选择方向。我能建议的最好的方法是使用selectionchange
事件来跟踪之前选择的范围,并在每次触发时查看哪一端发生了变化。它似乎在以下示例中起作用,但除此之外没有进行任何测试,因此使用风险自负。
演示: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;
}
}
};
答案 1 :(得分:0)
range.setStart(anchorNode, anchorOffset);
range.setEnd(focusNode, focusOffset);
if(range.collapsed == false){
colsole.log('forward Selected');
}else{
colsole.log('backward Selected');
}