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

发布于 2024-10-02 02:22:29 字数 306 浏览 7 评论 0原文

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

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

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

In JavaScript, there are various methods for accessing the user’s text selection, and creating text selections (or ranges) — see http://www.quirksmode.org/dom/range_intro.html.

As per that page, you can programmatically create a range, and access the text within that. But doing this doesn’t change the user’s text selection, or make the user have some selected text if they don’t already.

Can you set and/or change the user’s text selection in JavaScript?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦冥 2024-10-09 02:22:29

是的。在所有浏览器中,您都可以从用户的选择中获取一个或多个 RangeTextRange,并且 RangeTextRange 有更改范围内容的方法。

更新

您可以通过创建 Range 并将其添加到大多数浏览器中的 Selection 对象以及创建 TextRange 来设置用户的选择 并在 IE <= 8 中调用其 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 中用户的选择浏览器。如果您可以更具体地说明您想要如何更改选择,那么会更容易提供帮助。

Yes. In all browsers you can get one or more Ranges or a TextRange from the user's selection, and both Range and TextRange have methods for changing the contents of the range.

UPDATE

You can set the user's selection by creating a Range and adding it to the Selection object in most browsers and by creating a TextRange and calling its select() method in IE <= 8.

For example, to set the selection to encompass the contents of an element:

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

There are also several methods of the Selection object that can be used to change the user's selection in non-IE browsers. If you can be more specific about how you want to change the selection then it will be easier to help.

烟沫凡尘 2024-10-09 02:22:29

2021 更新

Selection API 执行此操作。 window.getSelection() 始终返回一个 Selection,而不是创建一个 new Selection()(这看起来很直观,但不起作用)对象 - 即使用户没有突出显示任何内容!然后,您可以使用 setBaseAndExtent() 来制作特定的节点被突出显示 - 这将更改用户选择的任何内容(即使没有选择任何内容)以匹配您指定的内容。

下面的示例突出显示了此 StackOverflow 页面中的问题

const selection = window.getSelection()
const headerElement = document.querySelector('#question-header a')
selection.setBaseAndExtent(headerElement,0,headerElement,1)

Update 2021

The Selection API does this. Rather than making a new Selection() (which seemed intuitive, but doesn't work), window.getSelection() always returns a Selection object - even if nothing is highlighted by the user! You can then use setBaseAndExtent() to make a particular node be highlighted - this will change whatever is selected by the user (even if nothing is selected) to match what you specify.

The example below highlights the question in this StackOverflow page

const selection = window.getSelection()
const headerElement = document.querySelector('#question-header a')
selection.setBaseAndExtent(headerElement,0,headerElement,1)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文