有没有办法从JavaScript创建反向(即从右到左)选择?

时间:2011-01-26 04:42:43

标签: javascript selection range

我正在尝试在文本中创建一个从右到左的选择,但似乎DOM Range API不允许我这样做。 (我在规范中没有看到任何关于这一点 - 不是我仔细阅读它 - 但所有实现似乎同意不支持它。)

例如,给出一个非常小的文档:

data:text/html,<div> this is a test </div>

我可以使用此脚本启用编辑并创建正常选择(例如从书签中添加,但为了清晰起见添加了换行符):

javascript:document.designMode='on';
var r=document.createRange(),d=document.getElementsByTagName('div')[0]; 
r.setStart(d.firstChild, 3); 
r.setEnd(d.firstChild, 7); 
window.getSelection().addRange(r); void(0);

但是,如果我交换3和7,则不会创建任何选择。

有没有人知道这样做的方法?

1 个答案:

答案 0 :(得分:6)

除了IE之外,所有主流浏览器的最新版本都可以通过Selection对象的extend()方法实现。这是一个从Range创建向后选择的函数:

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);
}

这在任何版本的IE中都不可能(包括版本11)。虽然IE 9及更高版本确实实现了DOM Level 2 Range和HTML5 Text Selection(现已迁移到WHATWG Range spec),但是当它们实现它时,版本的版本为did not include extend(),因此IE 9不支持它(有关向后选择的进一步讨论,另请参阅this bug)。

以下是在IE错误跟踪器中实现extend()的请求:https://connect.microsoft.com/IE/feedback/details/737106/implement-missing-extend-method-of-selection

在早期版本的IE中,选择API完全不同,并且不支持以编程方式创建向后选择。