在 JavaScript 中以编程方式定义范围/选择时,范围内的 focusOffset 是否不可能在 anchorOffset 之前?那么我们如何定义从右到左的选择呢?
一个 JS 提琴手链接,例如:http: //jsfiddle.net/johncch/ejVab/1/
在 JavaScript 中以编程方式定义范围/选择时,范围内的 focusOffset 是否不可能在 anchorOffset 之前?那么我们如何定义从右到左的选择呢?
一个 JS 提琴手链接,例如:http: //jsfiddle.net/johncch/ejVab/1/
创建“向后”选择的方法有点不明显。它不能通过简单地通过选择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);
}
您需要交换两个变量:
function makeSelection(a, b) {
if(b < a) {
var tmpA = a;
a = b;
b = tmpA;
}
// ... rest of your code
更新了 jsfiddle演示。
这是关于选择的一个很好的 MDN 文档。anchorOffset/anchorNode 表示选择的“开始”(它开始的地方,比如说,在鼠标拖动期间),而 focusOffset/focusNode 表示选择的“结束”(用户完成拖动的地方)。这对于确定选择的左/右端几乎没有用。要检测它们,您需要Range对象 - 对左选择边界使用 startContainer/startOffset,对右边界使用 endContainer/endOffset。从您的选择中获取范围为
if (window.getSelection() && window.getSelection().rangeCount)
var range = window.getSelection().getRangeAt(0);
猜猜这足以建立正确的选择。