admin管理员组文章数量:1321596
I can get a single element, or mon ancestor element, but I can't figure out how to get all elements that are being highlighted.
Here's a demo of getting the mon ancestor.
console.clear();
document.querySelector('div').addEventListener('mouseup', () => {
const selection = window.getSelection();
const elem = selection.getRangeAt(0)monAncestorContainer.parentNode;
console.log(elem);
});
<div contenteditable="true">
<header>
<h1>Rich Text Editing Development</h1>
<p>I'm <strong><em>really</em> annoyed</strong> with trying to figure out this answer.</p>
</header>
</div>
I can get a single element, or mon ancestor element, but I can't figure out how to get all elements that are being highlighted.
Here's a demo of getting the mon ancestor.
console.clear();
document.querySelector('div').addEventListener('mouseup', () => {
const selection = window.getSelection();
const elem = selection.getRangeAt(0).monAncestorContainer.parentNode;
console.log(elem);
});
<div contenteditable="true">
<header>
<h1>Rich Text Editing Development</h1>
<p>I'm <strong><em>really</em> annoyed</strong> with trying to figure out this answer.</p>
</header>
</div>
Since rangeCount
is always only 1, and the objects I see from selection and other children don't have an array or nodeList of selected items (that I noticed), I don't know what to do.
So how do I know which elements are being selected/highlighted?
Share Improve this question edited Apr 17, 2018 at 14:34 Native Dev asked Apr 16, 2018 at 22:39 Native DevNative Dev 7,4023 gold badges42 silver badges41 bronze badges2 Answers
Reset to default 9Though you'll get a copy of the descendant elements instead of references to the real ones, you can use the cloneContents()
method of a Range, in addition to the mon ancestor parent node (even supported in IE11 if using ES5 syntax):
document.addEventListener('mouseup', () => {
console.clear();
const selection = window.getSelection();
if (!selection.rangeCount) return;
const range = selection.getRangeAt(0);
console.log('Selected elements:');
range.cloneContents().querySelectorAll('*').forEach(e => console.log(e));
console.log('Selected text/elements parent:');
console.log(range.monAncestorContainer.parentNode);
});
<div contenteditable="true">
<header>
<h1>Rich Text Editing Development</h1>
<p>I'm <strong><em>really</em> annoyed</strong> with trying to figure out this answer.</p>
</header>
</div>
In case anyone needs text nodes, you can use the accepted answer with a small tweak:
...
const elements = range.cloneContents().childNodes;
...
Otherwise when just a text node is selected, querySelectorAll
will return an empty list.
本文标签: javascriptGet all elements in selectionhighlight using windowgetSelectionStack Overflow
版权声明:本文标题:javascript - Get all elements in selectionhighlight using window.getSelection - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1742107231a2421077.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论