【发布时间】:2023-03-31 07:10:02
【问题描述】:
我想以编程方式选择页面上的所有文本,其结果与按下组合键 Ctrl+A 完全相同.
使用document.getSelection().selectAllChildren(body) 的问题在于,选择还将包括用户无法选择的文本节点,即<script> </script> 或在CSS 中定义了user-select:none 的节点:
<div style="-moz-user-select:none">将被选中</div>
在选择对象上有一个方法modify,可以像这样使用:
selection.modify("extend", "forward", "documentboundary");
将选择从文档的开头扩展到其结尾,这将忽略任何脚本或样式元素的内容和带有-moz-user-select:none 的元素 - 不幸的是,Firefox 不允许将documentboundary 作为 3. 参数和word 并没有多大帮助。
有没有快速的方法来完成这个? 只需要在 Firefox 中工作。
编辑(不太好的解决方案):选择第一个文本节点,然后重复使用selection.modify('extend', 'forward', 'line'),而selection.focusNode 不等于最后一个文本节点 - 但取决于长度这需要几秒钟的时间!
编辑: selection.selectAllChildren 将在 Chrome 中按预期工作,其中带有 user-select:none 的文本元素将不会被选择 - 不幸的是,FF 中有不同的行为。
编辑:这不是 this post 的重复,因为我既不处理 contenteditable 元素,也不关心它们;)
【问题讨论】:
-
我没有 ff 要测试,这就是为什么这只是一个评论,而不是一个答案:基本上试试这个:hide-select-show。详细说明: 1. 为不可选择的元素使用一个类 2. $('unselectable').hide() 3. document.getSelection().selectAllChildren($('body').get(0) 4. $('unselectable ').show()
-
@ZPiDER 谢谢,但我不是 HTML+CSS 代码的作者(它用于 FF 扩展)。
-
如果您没有使用类的选项,请使用过滤: $('*').filter(function() { return $(this).css('user-select') == 'none' }).hide() - 当然,您需要存储之前隐藏了哪些元素,因为您不想显示它们。
-
好主意,但我在没有 jQuery 的情况下工作,如果其父节点之一使用
window.getComputedStyle(el).getPropertyValue('-moz-user-select')检查每个文本节点是否有-moz-user-select:none(另请参阅我在 Jake 的回答下的评论)可能需要更多时间使用selection.modify('extend', 'forward', 'line')在从第一个文本节点到最后一个文本节点的循环中手动选择所有用户可选择的文本
标签: javascript selection textselection getselection