Mimic Ctrl+A with JavaScript(用JavaScript模拟Ctrl+A)
问题描述
我希望以编程方式选择页面上的所有文本,其结果与我按组合键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
元素,也不关心它们;)
推荐答案
在我看来,最有效的方法是将您想要选择的内容移动到它自己的可选目录中,然后选择该目录的所有子项。我在谷歌搜索、几个堆栈溢出问题和几个随机站点上尝试了这一方法。在每种情况下,结果都是瞬时的,并且完全相同的结果是ctrl+A
。
function selectAll() {
var sel = window.getSelection();
var body = document.querySelector("body");
// Place the children in an array so that we can use the filter method
var children = Array.prototype.slice.call(body.children);
// Create the selectable div
var selectable = document.createElement("div");
// Style the selectable div so that it doesn't break the flow of a website.
selectable.style.width = '100%';
selectable.style.height = '100%';
selectable.margin = 0;
selectable.padding = 0;
selectable.position = 'absolute';
// Add the selectable element to the body
body.appendChild(selectable);
// Filter the children so that we only move what we want to select.
children = children.filter(function(e) {
var s = getComputedStyle(e);
return s.getPropertyValue('user-select') != 'none' && e.tagName != 'SCRIPT'
});
// Add each child to the selectable div
for (var i = 0; i < children.length; i++) {
selectable.appendChild(children[i]);
}
// Select the children of the selectable div
sel.selectAllChildren(selectable);
}
selectAll();
这篇关于用JavaScript模拟Ctrl+A的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:用JavaScript模拟Ctrl+A
基础教程推荐
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- 动态更新多个选择框 2022-01-01
- 在for循环中使用setTimeout 2022-01-01
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- 悬停时滑动输入并停留几秒钟 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- 我什么时候应该在导入时使用方括号 2022-01-01
- 响应更改 div 大小保持纵横比 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01