dom - 提取扁平化 DOM 的工具

标签 dom shadow-dom

较新浏览器中的 DevTools 显示光影 DOM。但似乎缺少的是“复制扁平 DOM”,它捕获 #shadow-root 以及根元素。

我已经整理出了如何在 DevTools 中显示 Shadow DOM,但复制元素仅复制 light DOM。

有什么建议吗?

最佳答案

1) 复制 shadowRoot.innerHTML<template>元素。

2) 对于每个 <slot>元素,通过 assignedNodes() 获取分布式内容方法并替换 <slot> (与 replaceChild() )由它。

var sh = host.attachShadow({mode:'open'})
sh.innerHTML = `<h4>Shadow DOM</h4> Content: <div><slot name="node1"></slot></div>`
		
function slotContent( slot )
{
  var frag = document.createDocumentFragment()			
  var nodes = slot.assignedNodes( { flatten:true } ) 
  for ( let node of nodes )
  {
    frag.appendChild( node.cloneNode( true ) )	
  }
  return frag
}

function flatten()
{
  var template = document.createElement( 'template' )
  template.innerHTML = host.shadowRoot.innerHTML			
  var slots = Array.from( host.shadowRoot.querySelectorAll( 'slot' ) )
  var slots2 = Array.from( template.content.querySelectorAll( 'slot' ) )
  for ( var i in slots )
  {
    var frag = slotContent( slots[i] )
    slots2[i].parentNode.replaceChild( frag, slots2[i] )
  }	
  console.log( template.innerHTML )
}
<div id=host>
  <span slot=node1>Distributed Node</span>
</div>
<button onclick=flatten()>Flatten</button>

关于dom - 提取扁平化 DOM 的工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43956150/

相关文章:

javascript - Firefox 中的 shadow dom <slot> 标签

javascript - 在javascript中单击元素外部时如何删除元素?

javascript - Webcomponents Polyfill 不工作

javascript - 如何停止 DOM javascript 事件处理程序

javascript - `onselectionchange` 的 HTML5 事件

css - 直接在 polymer 中设计元素样式是不好的做法吗?

javascript - 如何遍历 shadow DOM 中的元素

web-component - Web 组件和影子根

html - Shadow DOM 和自定义样式

javascript - 是否可以指示浏览器首先绘制页面的哪些元素?