【发布时间】:2011-02-01 12:37:38
【问题描述】:
我希望能够找出用户在浏览器中当前选择的文本中存在哪些 DOM 元素。
document.getSelection() 会给我们当前选择的文本。但是我们如何确定这个文本选择中包含哪些 DOM 元素呢?
【问题讨论】:
标签: javascript dom browser
我希望能够找出用户在浏览器中当前选择的文本中存在哪些 DOM 元素。
document.getSelection() 会给我们当前选择的文本。但是我们如何确定这个文本选择中包含哪些 DOM 元素呢?
【问题讨论】:
标签: javascript dom browser
window.getSelection() 给你一个Selection 对象。使用selection.rangeCount 和selection.getRangeAt() 获取一个Range 对象,表示您想要的选择。
现在您可以从range.startContainer/startOffset 和range.endContainer/endOffset 中获取选择中的第一个和最后一个节点。然后,您可以在树上走来走去,以拾取这两个位置之间的所有元素,例如。使用来自this answer 的getElementsBetweenTree() 函数。
不幸的是,IE 的TextRange 模型与 W3 和 HTML5 标准完全不同,而且总体上更糟。它几乎不会轻易放弃开始和结束位置,也不是以任何可靠的方式。你得到的只是parentElement 告诉你共同的祖先,从那里你只能根据创建一个新的范围来猜测范围在哪里,然后在上面调用moveToElementText,然后用选择范围调用compareEndPoints。如果您需要知道确切的文本选择,然后根据 moveStart/moveEnding 范围和比较来猜测,这一点都不好玩。
【讨论】:
TextRangeUtils.convertToDOMRange。)它不会完全替代 Range,因为 IE TextRanges 不会像 Range 应该的那样尊重元素边缘周围的范围边界,但这可能很好一般情况下就够了。
|<div><em>Text</em></div> 与 <div>|<em>Text</em></div> 与 <div><em>|Text</em></div>)