使用window.getSelection获取选择/突出显示中的所有元素

时间:2018-04-16 22:39:47

标签: javascript wysiwyg contenteditable rich-text-editor

我可以获得单个元素或共同的祖先元素,但我无法弄清楚如何获取所有突出显示的元素。

这是一个获得共同祖先的演示。

console.clear();
document.querySelector('div').addEventListener('mouseup', () => {
  const selection = window.getSelection();
  const elem = selection.getRangeAt(0).commonAncestorContainer.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>

由于rangeCount总是只有1,而我从选择和其他孩子看到的对象没有所选项目的数组或nodeList(我注意到),我不知道该怎么做。

那么我怎么知道哪些元素被选中/突出显示?

1 个答案:

答案 0 :(得分:1)

虽然您将获得后代元素的副本而不是对实际元素的引用,但除了共同的祖先父节点之外,您还可以使用Range的var _ = Describe("Handlers/CartContentsHandler", func() { var url url.URL BeforeEach(func() { url = serverURL + "/cart-contents" }) It("Makes a GET request", func() { # .... }) }) 方法(即使在IE11中也支持)使用ES5语法):

cloneContents()
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.commonAncestorContainer.parentNode);

});