3

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

一个 JS 提琴手链接,例如:http: //jsfiddle.net/johncch/ejVab/1/

4

3 回答 3

2

创建“向后”选择的方法有点不明显。它不能通过简单地通过选择addRange()方法选择范围来完成,因为范围本质上是无方向的。您需要使用extend()选择的方法(下面的示例)。

请注意,这在任何版本的 IE 中都不起作用,包括 9:与以前的版本不同,IE 9 确实有标准的选择和范围对象,但在微软开发 IE 9 时,extend()它是非标准的,所以他们没有实现它,这意味着无法在任何尚未发布的 IE 版本中以编程方式创建向后选择。IE 10 没有实现extend(),尽管我在 IE 错误跟踪器上提交了一个错误

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);
}
于 2012-05-22T16:09:12.967 回答
0

您需要交换两个变量:

function makeSelection(a, b) {
    if(b < a) {
        var tmpA = a;
        a = b;
        b = tmpA;
    }
    // ... rest of your code

更新了 jsfiddle演示。

于 2012-05-22T15:57:08.523 回答
0

是关于选择的一个很好的 MDN 文档。anchorOffset/anchorNode 表示选择的“开始”(它开始的地方,比如说,在鼠标拖动期间),而 focusOffset/focusNode 表示选择的“结束”(用户完成拖动的地方)。这对于确定选择的左/右端几乎没有用。要检测它们,您需要Range对象 - 对左选择边界使用 startContainer/startOffset,对右边界使用 endContainer/endOffset。从您的选择中获取范围为

if (window.getSelection() && window.getSelection().rangeCount)
    var range = window.getSelection().getRangeAt(0);

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

于 2012-05-22T16:01:42.980 回答