Shadow DOM获取Shadow host的内容

Shadow DOM(二)中,介绍了与Shadow DOM相关的概念,包括Shadow host等等。

本文将重点介绍如何将Light DOM中的内容传到Shadow DOM中。

而在Shadow DOM 与HTML Templates一文的示例中可以看到Shadow host: <div class="host">Hello World!</div>的内容在该节点创建并附加Shadow Root后并没有在浏览器中得到渲染,也就是说Shadow host的内容,这里为“Hello
World!"没能在浏览器中渲染出来,取而代之的是Shadow DOM中的内容得到了渲染,及该例中的template中的内容得到了渲染,然后在浏览器中运行后,只看到了Shadow DOM中的内容。

然后,在实际应用中,这种完全用Shadow DOM替换Light DOM中内容的方式并不是很有用,我们期望实现的可以通过从Shadow host中获取内容,然后使用Shadow DOM提供的结构来展现。类似这样的内容与展现分离,可以让我们在处理页面如何渲染的过程中更加灵活。

为了能够使用我们在Shadow host的内容,我们需要引入一个新的标签,那就是<content>标签。

首先通过一个示例来了解:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Demo</title>
</head>
<body>
    <div class="host">Hello Wrold!</div>
    <template>
        <h2>Hi, my name is winstar, and I can say: <content></content></h2>
    </template>
    <script>
        var host = document.querySelector('.host');
        var root = host.createShadowRoot();
        var tmpl = document.querySelector('template');
        root.appendChild(document.importNode(tmpl.content, true));
    </script>
</body>
</html>

在Chrome浏览器中运行,效果如图:

可以看到,在源代码中的template,包含了<content>标签,而在运行结果中,也可以看到Shadow host中的内容“Hello World!"也被渲染了出来,而且就是<content>标签所在的位置。

通过<content>标签,我们在模板中创建了一个插入点,这个插入点可以投射来自Shadow host中的内容,如本例中的“Hello World!”投射到<content>所在位置,并出现在我们的h2标签中。

插入点的功能非常强大,它允许我们在不手动修改源代码(这里的源代码指的是Shadow host中出现的内容)的基础上也可以改变渲染的顺序,也让开发者可以有选择性地选取哪些内容应该得到渲染。

刚刚说到,插入点可以改变渲染的顺序,有选择性地选取哪些内容应该得到渲染,这个是如何实现的呢?为了实现这一目的,必须让<content>具备选择能力,让它知道选择哪里的内容插入到指定的位置。为了做到这一点,规范赋予了<content>标签具有select属性。这个select属性使用CSS选择器来匹配选择需要渲染的内容。

例如,<content select=".user-name">将在Shadow host中查找任何具有class为user-name的匹配元素,并将所有匹配元素插入到该<content>标签中以被渲染。

改变顺序示例:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Demo</title>
</head>
<body>
    <div class="host">
        <div class="name">winstar</div>
        <div class="age">28</div>
    </div>
    <template>
        <h2><content select=".name"></content></h2>
        <h2><content select=".age"></content></h2>
    </template>
    <script>
        var host = document.querySelector('.host');
        var root = host.createShadowRoot();
        var tmpl = document.querySelector('template');
        root.appendChild(document.importNode(tmpl.content, true));
    </script>
</body>
</html>

运行结果:

在该示例中,可以看到<content>通过select属性分别选取了Shadow host中对应的内容,并且得以被渲染出来。下面我们在不需改内容结构的情况下,调整渲染的顺序。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Demo</title>
</head>
<body>
    <div class="host">
        <div class="name">winstar</div>
        <div class="age">28</div>
    </div>
    <template>
        <h2><content select=".age"></content></h2>
        <h2><content select=".name"></content></h2>
    </template>
    <script>
        var host = document.querySelector('.host');
        var root = host.createShadowRoot();
        var tmpl = document.querySelector('template');
        root.appendChild(document.importNode(tmpl.content, true));
    </script>
</body>
</html>

运行结果:

可以看到,浏览器渲染内容的顺序跟前面确实改变了,但通过【审查元素】可以发现Shadow host的内容(红框中的内容)属性却保持跟原来一模一样。

因此,可以说内容是在Shadow host中的,而决定渲染的是Shadow root/Shadow DOM。

时间: 2024-10-13 23:24:19

Shadow DOM获取Shadow host的内容的相关文章

Shadow DOM 与 HTML Templates

在之前的Web Components系列文章中,简单介绍了Web Components概要,HTML Templates,Shadow DOM,Shadow DOM(二). 本文将在此基础上,介绍Shadow DOM与HTML Templates如何一起协作. 在Shadow DOM(二)中,介绍了如何创建Shadow DOM:通过调用createShadowRoot()方法创建root节点,然后在JavaScript中创建普通的HTML节点, 并将这些节点附到Shadow Root上.但这种方

Shadow DOM(二)

在前一篇博文中,简单地介绍了Shadow DOM是什么. 本文,将重点介绍Shadow DOM能做什么.如何创建Shadow DOM以及Shadow DOM的相关概念. Shadow DOM 能做什么 简单地说,有了Shadow DOM(若浏览器支持该规范),开发者可以封装HTML标签,CSS样式以及JavaScript,提供一个新的作用域空间.Shadow DOM结合后续将介绍的其他Web Components技术,开发者将具有开发出类似<input type="time"&g

shadow dom

初识shadow dom 我们先看个input="range"的表现: what amazing ! 一个dom能表现出这么多样式嘛? 无论是初学者和老鸟都是不肯相信的,于是在好奇心的驱使下,我们打开chrome的开发工具设置 结果发现了input节点里面有我们需要的答案 input节点里面有他表现需要的dom节点,dom节点里面还有些样式,而这些不容易为人知的节点都在一个#shadow-root的节点下面. 来张图了解下结构 document 这个很好理解,就是我们的正常文档 doc

使用shadow dom封装web组件

什么是shadow dom? 首先我们先来看看它长什么样子.在HTML5中,我们只用写如下简单的两行代码,就可以通过 <video> 标签来创建一个浏览器自带的视频播放器控件. <video controls=""> <source src="https://mdn.mozillademos.org/files/2587/AudioTest%20(1).ogg" type="audio/ogg"> </v

Shadow DOM系列6-综述

Web Components 系列主要由自定义元素(Custom Elements).HTML 引入(HTML Imports)和影子 DOM(shadow DOM) 组成,而 Shadow DOM 无疑是当中的重中之重.本文对下面翻译的几篇文章进行综述,总结了 Shadow DOM 术语梳理和结构关系. 术语标注 影子 DOM(shadow DOM):是一种依附于文档原有节点的子 DOM,具有封装性 光明 DOM(light DOM):就是原生的 DOM,为了与影子 DOM 区别采用的名词 影

Shadow DOM系列2-基础

英文链接:Shadow DOM: The Basics, 27 AUGUST 2013 on Web Components, Shadow DOM 在我的上一篇博文里,我介绍了 Shadow DOM 并举例说明为啥它这么重要.今天,我们要干点苦力活--"码"上见分晓!在本文的最后,你将能够创建自己的封装组件--它封装了外部的内容,并重新整理内部结构来产生一个完全不同的东西. 让我们开始吧! 环境支持 为了能尝试下面的实例,建议使用 Chrome 33 或者更高版本的 Chrome. 一

shadow dom 隔离代码 封装

Shadow DOM是指浏览器的一种能力,它允许在文档(document)渲染时插入一棵DOM元素子树,但是这棵子树不在主DOM树中. Shadow DOM 解决了 DOM 树的封装问题. 有了 Shadow DOM,元素就可以和一个新类型的节点关联.这个新类型的节点称为 shadow root.与一个 shadow root 关联的元素称作一个 shadow host.shadow host 的内容不会渲染:shadow root 的内容会渲染. 比如,你拥有如下的标记: <button>H

使用custom elements和Shadow DOM自定义标签

具体的api我就不写 官网上面多  如果不知道这个的话也可以搜索一下 目前感觉这个还是相当好用的直接上码. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"&g

JS之BOM和DOM(来源、方法、内容、应用)

1.Javascript组成 JavaScript的实现包括以下3个部分: 1)核心(ECMAScript):描述了JS的语法和基本对象. 2)文档对象模型 (DOM):处理网页内容的方法和接口 3)浏览器对象模型(BOM):与浏览器交互的方法和接口 ECMAScript扩展知识: ① ECMAScript是一个标准,JS只是它的一个实现,其他实现包括ActionScript. ② "ECMAScript可以为不同种类的宿主环境提供核心的脚本编程能力--",即ECMAScript不与具