您可以在 JavaScript 中设置和/或更改用户的文本选择吗?

IT技术 javascript textselection
2021-02-10 12:03:14

在 JavaScript 中,有多种方法可以访问用户的文本选择和创建文本选择(或范围)——请参阅http://www.quirksmode.org/dom/range_intro.html

根据该页面,您可以以编程方式创建一个范围,并访问其中的文本。但是这样做不会改变用户的文本选择,或者让用户选择一些文本,如果他们还没有的话。

您可以在 JavaScript 中设置和/或更改用户的文本选择吗?

2个回答

是的。在所有的浏览器,你可以得到一个或多个RangeS或ATextRange从用户的选择,都RangeTextRange对改变区域的内容的方法。

更新

您可以通过在大多数浏览器中创建 a并将其Range添加到Selection对象中以及通过在 IE <= 8 中创建 aTextRange并调用其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();
    }
}

Selection对象还有多种方法可用于在非 IE 浏览器中更改用户的选择。如果您可以更具体地了解如何更改选择,那么帮助会更容易。

请注意,这range.selectNodeContents(el);可能会导致range.endOffset/selection.focusOffset如果el不是纯文本元素的意外值例如,传递 aspan很可能会导致endOffset=1同时传递跨度的text子项将导致正确的偏移量。有关更多信息,请参阅此 SO 答案
2021-03-16 12:03:14
@TimDown:如果您还可以在此处添加非 IE 方法,那将非常有帮助。
2021-03-22 12:03:14
啊,是的,抱歉,我没有很好地表达这个问题——我实际上是想在用户还没有文本选择时设置他们。
2021-03-23 12:03:14
@Techsin:是的,但仅限于 Firefox。调用addRange()您要选择的每个范围。
2021-03-23 12:03:14
是否可以同时选择不同的范围。我希望能够选择不连续的文本的多个部分。
2021-04-05 12:03:14

2021 年更新

选择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)
也是2021年的兄弟。
2021-03-17 12:03:14
我敢打赌有人还在使用它。
2021-03-19 12:03:14
浏览器支持看起来不错,但window.getSelection如果您仍然需要支持 IE 8 则不起作用。
2021-03-21 12:03:14
这很好,除非您需要支持任何版本的 IE,包括 11。自 2010 年我的回答以来唯一发生变化的相关事情是对 的更广泛的浏览器支持setBaseAndExtent(),它最初仅作为 WebKit,但从未在 IE 中实现。在我的创建范围和选择范围的答案中,更迂回的方式适用于 IE >= 9。
2021-03-24 12:03:14
@PaulD.Waite 说到 2021 年 - IE8?
2021-04-13 12:03:14