是否可以保留自定义元素的内部 html?

2024-03-09

使用自定义元素,我想对自定义元素内的元素进行样式设置,但是当我定义该元素时,除了影子 dom 之外的所有内容都会消失。

如何将内容从元素移动到 Shadow dom?我已经有一个包装元素(<div class="wrapper">)在阴影内,但尝试使用

wrapper.innerHTML = this.innerHTML;

不起作用。

HTML

<site-card>
  <section title>
    ...
  </section>
  <section body>
    ...
  </section>
  <section actions>
    <button class="modern small">Action</button>
    <button class="modern small">Action 2</button>
  </section>
</site-card>

JS

"use strict";
class cardElement extends HTMLElement {
    constructor() {
        super();
        var shadow = this.attachShadow({mode: 'open'});
        var wrapper = document.createElement('div');
        wrapper.setAttribute('class','wrapper');
        wrapper.innerHTML = this.innerHTML;
        var style = document.createElement('style');
        style.textContent = ... /* CSS removed to shorten. */
        shadow.appendChild(style);
        shadow.appendChild(wrapper);
    };
};
customElements.define('site-card', cardElement);

如果你想从自定义元素外部控制CSS,那么只需使用<slot>. <slot>将子元素嵌入到槽中,但将 CSS 控制留给元素外部。

class cardElement extends HTMLElement {
  constructor() {
    super();
    var shadow = this.attachShadow({mode: 'open'});
    var wrapper = document.createElement('slot');
    var style = document.createElement('style');
    style.textContent = `
    [title] {
      background-color: #060;
      color: #FFF;
    }
    [body] {
      background-color: #600;
      color: #FFF;
    }
    [actions] {
      background-color: #006;
      color: #FFF;
    }
    `;
    shadow.appendChild(style);
    shadow.appendChild(wrapper);
  };
};
customElements.define('site-card', cardElement);
[title] {
  background-color: #0F0;
  color: #000;
}
[body] {
  background-color: #F00;
  color: #000;
}
[actions] {
  background-color: #00F;
  color: #000;
}
<site-card>
  <section title>
    This is the title
  </section>
  <section body>
    This is the body
  </section>
  <section actions>
    <button class="modern small">Action</button>
    <button class="modern small">Action 2</button>
  </section>
</site-card>

如果你想从元素内部控制 CSS,那么你需要迁移子元素。但这可以not在构造函数中完成。规范的这一部分 https://w3c.github.io/webcomponents/spec/custom/#custom-element-conformance解释了构造函数的限制。

你需要把孩子搬到connectedCallback

class cardElement extends HTMLElement {
  constructor() {
    super();
    var shadow = this.attachShadow({mode: 'open'});
    this._wrapper = document.createElement('div');
    var style = document.createElement('style');
    style.textContent = `
    [title] {
      background-color: #060;
      color: #FFF;
    }
    [body] {
      background-color: #600;
      color: #FFF;
    }
    [actions] {
      background-color: #006;
      color: #FFF;
    }
    `;
    shadow.appendChild(style);
    shadow.appendChild(this._wrapper);
  };
  
  connectedCallback() {
    while(this.firstElementChild) {
      this._wrapper.appendChild(this.firstElementChild);
    }
  }
};
customElements.define('site-card', cardElement);
[title] {
  background-color: #0F0;
  color: #000;
}
[body] {
  background-color: #F00;
  color: #000;
}
[actions] {
  background-color: #00F;
  color: #000;
}
<site-card>
  <section title>
    This is the title
  </section>
  <section body>
    This is the body
  </section>
  <section actions>
    <button class="modern small">Action</button>
    <button class="modern small">Action 2</button>
  </section>
</site-card>

我建议避免使用innerHTML因为这将清除可能已经存在的任何事件处理程序等。实际上可能会更慢,具体取决于直系子代的数量。它还可能会弄乱任何可能是自定义元素的子元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以保留自定义元素的内部 html? 的相关文章

随机推荐

  • 使用 JavaCV 相当于 Java 中的 OpenCV 语句

    我想知道如何使用 JavaCV 在 OpenCV 中构造以下 C 语句 float p float cvGetSeqElem circles i int radius cvRound p 2 使用 cvHoughCircles 获取检测到的
  • Unity3D 的良好全局异常处理策略是什么?

    我正在考虑做一些 Unity3D 脚本编写的东西 并且我想建立全局异常处理系统 这不适用于在游戏的发布版本中运行 其目的是捕获用户脚本和编辑器脚本中的异常 并确保将它们转发到数据库进行分析 并向相关开发人员发送电子邮件 以便他们可以修复他们
  • 即使应用程序未运行,也可保持 FirebaseMessagingService 活动并显示带有数据负载的通知的服务

    我正在使用 FCM 通知的应用程序中工作 当应用程序运行 前台或后台 时 通知会收到 但是当我从最近的应用程序中清除该应用程序时 我不会收到任何我正在使用 FirebaseMessagingService 的通知 所以我想创建一个服务 即使
  • 对SVG viewBox、宽度、高度等感到困惑

    如果我对 SVG 的理解是正确的 那么以下两个 SVG 描述将产生相同的图像 但事实并非如此 注意 这两个代码列表仅在其坐标值方面有所不同svg标签 更具体地说 对于每个 x y第一个列表中的 对有一个 x 205 y 55 在第二个列表中
  • 如何将字节字符串拆分为单独的部分

    我一直在尝试创建波形图像 并且从 wav文件使用song wave open and song readframes 1 返回 b x00 x00 x00 x00 x00 x00 我怎样才能把它分成三个独立的部分 例如b x00 x00 b
  • C 中的图形函数

    为什么我运行代码时什么也看不到 我用的是DOSBox include
  • 如何获取当前应用程序区域设置?

    我需要获取当前区域设置 不是用户区域设置 而是我的应用程序区域设置 假设我的应用程序有两种本地化 在项目设置中 英语 默认 和法语 如果用户在 iPhone 上设置法语 那么我的应用程序将显示法语界面 如果用户在 iPhone 上设置德语
  • @Injectable(providedIn: 'root') 的语义?

    只是想确保我理解的语义 Injectable providedIn root 在 Angular 6 之前 如果我们从 NPM 导入包含服务的模块 我们会在应用程序模块中声明该模块 以便整个应用程序都可以访问该服务 像这样的事情 impor
  • 建立新的 Java 开发中心

    我正在建立一个 Java 开发商店 目前只是我自己作为唯一的开发人员 但希望随着业务的增长需要雇用其他人 显然 我希望将其设置正确 以便随着更多人的加入 他们可以立即提高工作效率 请帮助建议我想做的事情以及完成这些事情的工具 这是我认为我需
  • Django 模型继承 - 在查询中只需要父类的实例

    假设我有 2 个模型 一个是另一个的父模型 如何查询 Django 中所有不是餐厅的地点 Place objects all 将包括所有餐厅 对吗 我想将孩子排除在结果之外 谢谢你 class Place models Model name
  • 将多个不相邻列复制到数组

    我正在尝试将多个不相邻 不连续 的 Excel 列复制到数组中 但它不起作用 以下是我尝试过的 Public Function Test Dim sh As Worksheet Set sh Application Sheets MyWor
  • Response.End 之后关闭窗口

    例如我有一个表格ListView即处于编辑模式 发生了一些事情 导致列表视图正在使用的表不再可用 我只想在用户点击 保存 时能够关闭窗口 In Page Load 我检查桌子是否可用 如果没有 我打电话RegisterClientScrip
  • Visual Studio 设计器中的抽象 UserControl 继承

    abstract class CustomControl UserControl protected abstract int DoStuff class DetailControl CustomControl protected over
  • Django:如果用户是工作人员,如何排除表单字段?

    如果用户不是员工 如何排除表单字段 我尝试了这个 但没有成功 给出了一个错误 global name user is not defined class PostForm ModelForm class Meta model Photo e
  • API 来比较 AST? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有一个开源java api允许比较java源代码的两个抽象语法树 我想看看两个语法树之间的差异 类
  • 关键字 CONSTRAINT 在此 CREATE TABLE 语句中起什么作用

    我正在学习如何将 sqlite3 与 python 一起使用 我所关注的教科书中的示例是一个数据库 其中每个国家 地区记录都有一个地区 国家 地区和人口 书上说 以下代码片段使用 CONSTRAINT 关键字来指定 表中没有两个条目是 所创
  • 使用 Javascript 的 8 位异或校验和

    我正在尝试模仿 Windows 应用程序格式化消息并发送通过 USB 通过 UART 传输到显示该消息的设备 该应用程序计算checksum并将其粘贴到消息后面 否则设备将不会接受该命令 校验和不是 crc8 校验和 但它是什么 使用 US
  • 使用 powershell 从路径获取最新创建的文件夹

    如何使用 Windows PowerShell 从路径获取最新创建的文件夹 我有路C temp我想在此路径中找到最近创建的文件夹 PowerShell 主要与管道一起工作 因此您编写的大部分内容将包括创建表示某些信息的对象 以及过滤和操作它
  • 查找最近一小时内产生的记录

    我有一个smalldatetime字段命名myTime创建记录时进行记录 我需要选择过去一小时内创建的记录的语法 我认为会是 and DATEDIFF hh datePart hh myTime DatePart hh GETDATE lt
  • 是否可以保留自定义元素的内部 html?

    使用自定义元素 我想对自定义元素内的元素进行样式设置 但是当我定义该元素时 除了影子 dom 之外的所有内容都会消失 如何将内容从元素移动到 Shadow dom 我已经有一个包装元素 div class wrapper 在阴影内 但尝试使