在JavaScript中以编程方式定义范围/选择,是否不可能将该范围内的focusOffset置于anchorOffset之前?那么我们如何定义一个左右选择呢?
JS fiddler链接,例如:http://jsfiddle.net/johncch/ejVab/1/
答案 0 :(得分:2)
创建“向后”选择的方式略显不明显。只需通过选择addRange()
方法选择一个范围就无法完成,因为范围本质上是无方向的。您需要使用选择的extend()
方法(例如下面的例子)。
注意这在IE的任何版本中都不起作用,包括9:与以前的版本不同,IE 9确实有标准选择和范围对象,但在微软开发IE 9时,extend()
是非标准的所以他们没有实现它,这意味着没有办法在任何版本的IE中以编程方式创建向后选择。 IE 10没有实现extend()
,尽管我提交了bug on the IE bug tracker。
function selectRangeBackwards(range) {
var sel = window.getSelection();
var endRange = range.cloneRange();
endRange.collapse(false);
sel.removeAllRanges();
sel.addRange(endRange);
sel.extend(range.startContainer, range.startOffset);
}
答案 1 :(得分:0)
您需要交换两个变量:
function makeSelection(a, b) {
if(b < a) {
var tmpA = a;
a = b;
b = tmpA;
}
// ... rest of your code
更新jsfiddle演示。
答案 2 :(得分:0)
This是关于选择的优秀MDN文档。 anchorOffset / anchorNode表示选择的“开始”(例如,在鼠标拖动期间它开始),而focusOffset / focusNode表示选择的“结束”(用户完成拖动的位置)。这对于确定选择的左/右端几乎没有用。要检测它们,您需要Range对象 - 使用startContainer / startOffset作为左选择边界,使用endContainer / endOffset作为右边界。获取您选择的范围
if (window.getSelection() && window.getSelection().rangeCount)
var range = window.getSelection().getRangeAt(0);
猜猜这足以构建正确的选择。