I would like to select all text on a page programmatically with the exact same result as if I would press key combo Ctrl+A.
The problem with using document.getSelection().selectAllChildren(body)
is that the selection will also include text nodes that are not selectable by the user, i.e. <script> </script>
or nodes for which there is user-select:none
defined in CSS:
<div style="-moz-user-select:none">
Will be selected</div>
There is the method modify
on selection objects that could be used like this:
selection.modify("extend", "forward", "documentboundary");
to extend a selection from the beginning of a document to its end which will ignore any script or style element contents and elements with -moz-user-select:none
- unfortunately Firefox does not allow documentboundary
as 3. argument and word
does not help much.
Is there a fast way to accomplish this? Only needs to work in Firefox.
EDIT (not-so-good-solution): Select first text node, then use selection.modify('extend', 'forward', 'line')
repeatedly while selection.focusNode
is not equal to the last text node - but depending on the length of the document this takes up to several seconds!
EDIT: selection.selectAllChildren
will work as intended in Chrome where text elements with user-select:none
won't be selected - unfortunately there is a different behavior in FF.
EDIT: This is not a duplicate of this post since I'm neither addressing contenteditable
elements nor am I concerned about them;)
It seems to me the most efficient way is to move what you want selected into its own selectable div, and selectAllChildren of that. I tried this on a google search, several stack overflow questions, and a few random sites. In every case the results were instantaneous and exactly the same has a 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();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With