【问题标题】:is there no way to create a reversed (i.e. right-to-left) selection from JavaScript?有没有办法从 JavaScript 创建一个反向(即从右到左)选择?
【发布时间】:2014-11-03 18:24:58
【问题描述】:

我正在尝试在文本中创建从右到左的选择,但似乎 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,则不会创建任何选择。

有人知道怎么做吗?

【问题讨论】:

  • 从左到右和从右到左的范围有什么区别?据我所见,唯一的区别是能够使用向左的箭头扩展选择。
  • @Juan:我可能遗漏了一些细微之处,但和你一样,我能看到的主要区别是箭头键的行为(所有箭头键,带或不带 Shift 和 Ctrl 修饰键)。此外,在某些环境和浏览器中,除了选择之外,插入符号还会显示在选择的焦点处(即用户停止选择的点)。

标签: javascript selection range


【解决方案1】:

通过Selection 对象的extend() 方法,可以在除IE 之外的所有主要浏览器的最新版本中。这是一个从 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 级别 2 范围和 HTML5 文本选择(现在迁移到 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 完全不同,也不支持以编程方式创建向后选择。

【讨论】:

  • 嗨蒂姆,这不符合我的预期,或者我错过了一些东西:使用extend 后,选择正确显示在我的屏幕上,但如果我这样做document.getSelection() @987654335 @ 小于 focusOffset,这意味着插入符号位于所选内容的右侧而不是左侧。您知道在使用extend 后是否有一些改进,以便正确设置锚点和焦点?如果我手动进行向后选择,我可以看到 focusOffset 是 _before_(smaller) anchorOffset 这就是我想要的。我在单个文本节点中工作。
  • @sjahan:哪个浏览器?我刚刚在 Firefox 中试了一下,还不错。
  • 那是使用 Chrome!实际上,我以不同的方式解决了我的问题,不需要我应用/检查选择,所以这不是一个真正的问题 :) 但肯定的是,在 Chrome 上,如果我以编程方式进行向后选择,如果我用@检查它987654340@已转转发!它仅在以编程方式完成时发生,使用鼠标,它被正确地向后设置。可能在 extend 实现中存在差异!
  • @sjahan:在 Ubuntu 上的 Chrome 上也适用于我。如果在 Chrome 中更改了 extend() 行为,我会感到非常惊讶,因为它是在 W3C Selection specification 中指定的。
  • @sjahan:可能。我已经修改了你的小提琴,使它可以工作:jsfiddle.net/krg728ud
猜你喜欢
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
相关资源
最近更新 更多