在选择中,focusOffset可以在anchorOffset之前吗?

时间:2012-05-22 15:52:01

标签: javascript html selection range

在JavaScript中以编程方式定义范围/选择,是否不可能将该范围内的focusOffset置于anchorOffset之前?那么我们如何定义一个左右选择呢?

JS fiddler链接,例如:http://jsfiddle.net/johncch/ejVab/1/

3 个答案:

答案 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);

猜猜这足以构建正确的选择。