在 JavaScript 中,有多种方法用于访问用户的文本选择并创建文本选择(或范围)- 请参见http://www.quirksmode.org/dom/range_intro.html。
根据该页面,您可以通过编程方式创建范围,并访问其中的文本。但是这样做不会更改用户的文本选择,也不会使用户拥有所选的文本(如果他们还没有)。
你能否在 JavaScript 中设置和/或更改用户的文本选择?
在 JavaScript 中,有多种方法用于访问用户的文本选择并创建文本选择(或范围)- 请参见http://www.quirksmode.org/dom/range_intro.html。
根据该页面,您可以通过编程方式创建范围,并访问其中的文本。但是这样做不会更改用户的文本选择,也不会使用户拥有所选的文本(如果他们还没有)。
你能否在 JavaScript 中设置和/或更改用户的文本选择?
是的,你可以在所有浏览器中获取一个或多个 Range
或者一个 TextRange
从用户的选区,并且 Range
和 TextRange
都有改变选区内容的方法。
更新
你可以通过在大多数浏览器中创建一个 Range
并将其添加到 Selection
对象中,或者在 IE <= 8 中创建一个 TextRange
并调用其 select()
方法来设置用户的选择。
例如,要将选择设置为包含元素内容:
function selectElementContents(el) {
if (window.getSelection && document.createRange) {
var sel = window.getSelection();
var range = document.createRange();
range.selectNodeContents(el);
sel.removeAllRanges();
sel.addRange(range);
} else if (document.selection && document.body.createTextRange) {
var textRange = document.body.createTextRange();
textRange.moveToElementText(el);
textRange.select();
}
}
在非IE浏览器中,Selection
对象有几种方法可以用来改变用户的选择。如果您能更具体地说明想要如何更改选择,那么帮助会更容易。
<br>
和 <hr>
)。 - Tim Down<span>Hello World!</span>
上的 selectNodeContents
可视选择 "Hello World!",但其 endOffset 却是 1 而不是 12,这非常不直观。一旦您熟悉了节点、选择和范围的概念,它就完全有意义了。 - Gerrit-KSelection API 可以帮助我们实现这个功能。与其创建一个 new Selection()
对象(看似直觉,但并不起作用),window.getSelection()
总是返回一个 Selection
对象 - 即使用户没有选中任何文本! 然后,可以使用setBaseAndExtent() 方法将特定节点突出显示 - 这将更改用户选择的任何内容(即使未选择任何内容)以匹配您指定的内容。
下面的示例会将这个 StackOverflow 页面中的问题部分进行高亮显示
const selection = window.getSelection()
const headerElement = document.querySelector('#question-header a')
selection.setBaseAndExtent(headerElement,0,headerElement,1)
window.getSelection
将无法工作。 - Paul D. Waitewindow.getSelection
可能会返回 null。 - Charlie Martin