有什么方法可以将自定义元素的模板标记和样式保留在 JavaScript 字符串之外?

2024-01-25

这是使用自定义元素的示例开发者.google.com https://developers.google.com/web/fundamentals/web-components/customelements:

let tmpl = document.createElement('template');
tmpl.innerHTML = `
  <style>:host { ... }</style> <!-- look ma, scoped styles -->
  <b>I'm in shadow dom!</b>
  <slot></slot>
`;

customElements.define('x-foo-shadowdom', class extends HTMLElement {
  constructor() {
    super(); // always call super() first in the constructor.

    // Attach a shadow root to the element.
    let shadowRoot = this.attachShadow({mode: 'open'});
    shadowRoot.appendChild(tmpl.content.cloneNode(true));
  }
  ...
});

虽然这有效,但我发现这种方法奇怪地丑陋。 HTML 和 CSS 应驻留在 .html 和 .css 文件中,而不是作为 Javascript 字符串。

同时我不知道如何将这些内容移动到.html或.css文件中?

嗯,是的,我可以填充主 HTML 文件,即index.html, with <template>可能使用过的所有自定义元素的标签 - 但这是否违背了自定义元素的目的?

<link rel="import">可能很有希望,但是它已被删除 https://developer.mozilla.org/en-US/docs/Web/Web_Components/HTML_Imports.

还有其他选择吗?

(或者我认为原始解决方案丑陋是错误的?)


你可以使用fetch()获取自定义元素内容的 HTML 文件。

customElements.define('x-foo-shadowdom', class extends HTMLElement {
    constructor() {
        super()
        this.attachShadow( {mode: 'open'} )
    }

    async connectedCallback() {
        let res = await fetch( 'x-foo.html' )
        this.shadowRoot.innerHTML = await res.text()
    }
}

注意:因为fetch() and text()是异步的,你必须添加async before connectedCallback() and await在方法调用之前。

您还可以简单地使用以下命令获取单独的 CSS 内容<link>在 HTML 代码中。


我认为原始解决方案丑陋是错误的吗?

是的,它很丑。 如果您想使用模板文字,则无需将其放入<template>元素并克隆它。

相反,直接使用模板文字:

shadowRoot.innerHTML =  `
  <style>:host { ... }</style> <!-- look ma, scoped styles -->
  <b>I'm in shadow dom!</b>
  <slot></slot>
`;

请注意,模板文字与单独的 HTML 相比有一个优势:您可以轻松使用插入变量。增量 CLIC 计数器的示例:

customElements.define( 'click-counter', class extends HTMLElement {
  connectedCallback() {
    let count = 0
    let sh = this.attachShadow( { mode: 'open' } )    
    this.onclick = () => sh.innerHTML = `<button>${count++}</button>`
    this.click() 
  }
} )
<click-counter></click-counter>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有什么方法可以将自定义元素的模板标记和样式保留在 JavaScript 字符串之外? 的相关文章

  • 如何更改引导弹出窗口箭头边框颜色而不填充它?

    我想更改弹出箭头的边框颜色 当我应用边框颜色时 箭头本身填充了颜色 我只想为弹出框主体的箭头边框提供颜色 p Click on button to see Popover p a href class btn btn primary pop
  • NodeJS 无法加载 css 文件

    所以我正在尝试制作一个 NodeJS 服务器 并且我尝试保留尽可能少的附加组件 但是 我遇到了一个问题 我似乎无法加载任何内容CSS我调用的文件HTML文件 该调用似乎确实由服务器处理 但它不会显示在浏览器中 My 网络服务器 js fil
  • Angular-Datatables + Angular-xeditable:取消可编辑行

    当组合 Angular DataTables 和 Angular XEditable 时 添加新行时会取消可编辑行 这是jsfiddle https jsfiddle net faj61h5d 10 示例操作如下 1 这是初始状态 2 将第
  • Bootstrap:下拉菜单无法通过 jQuery 单击打开

    我正在创建一个包含多行的表 所有行都有一个 选项 按钮 该按钮应该显示下拉上下文菜单 为了使代码更短 我使用了一个div以便将其重用为上下文菜单的通用标记 我正在使用 Bootstrap 5 1 3 和 jQuery 3 6 0 以下是我的
  • 有没有办法在 TypeScript 2+ 中全局添加类型定义?

    我有一堆简单的 ts files 不是项目 即独立的 ts 脚本 他们使用一些 Node js 功能 TypeScript 和节点类型定义通过安装 npm install g typescript npm install g types n
  • Relay 中的嵌套片段数据始终相同

    我是 Relay 新手 并且遇到了片段上嵌套数据的问题 当我在 graphiql 中进行测试时 以下查询返回正确的数据 因此我确信我的架构是正确的 viewer customers name billing address city 但是
  • 正则表达式 - 避免表达式中出现字符串

    我正在尝试创建一个应该匹配以下情况的正则表达式 如果单词完全匹配 first second third 那么匹配应该失败 但如果它周围有任何字符 那么应该匹配该字符串 我还需要避免字符串中的某些字符集 如果这些字符是字符串的一部分 则匹配结
  • 禁用任何类型的浏览器窗口滚动?

    有没有办法禁用滚动 不仅仅是滚动条 还有浏览器窗口的全部功能 根据您对 Keit 的回答 您不想在打开灯箱时滚动处于活动状态 如果是这种情况 您可以使用以下 css 在打开灯箱的同时向正文添加一个类 这个解决方案的好处是它保留了滚动 空间
  • 将 std::pair const 转换为 std::pair const 安全吗?

    理论上或实践上 安全吗reinterpret cast a std pair
  • 页面不会居中对齐

    我遇到了 CSS 问题 http www luukratief design nl dump parallax index html http www luukratief design nl dump parallax index htm
  • CryptoJS 和 Pycrypto 一起工作

    我正在使用 CryptoJS v 2 3 加密 Web 应用程序中的字符串 并且需要在服务器上使用 Python 对其进行解密 因此我使用 PyCrypto 我觉得我错过了一些东西 因为我无法让它工作 这是JS Crypto AES enc
  • Google 地图 v3 中标准缩放控件的样式

    有没有一种简单的方法可以在 Google Maps JavaScript API v3 中设置缩放控件的样式 我想要的只是改变标准图像 http maps gstatic com intl en ALL mapfiles mapcontro
  • 有不同图像尺寸的缩略图 Bootstrap

    我想要包含不同大小和不同文本量的图像的缩略图 但我希望它们都具有相同的大小 像这样来自 Bootstrap 站点的示例 http getbootstrap com components thumbnails custom content 下
  • Tween JS 基础知识之三个 JS 立方体

    我是 Tween JS 的新手 尝试使用 Tween 制作一个向右移动的简单动画 下面是我在 init 函数中的代码 我使用的是三个 JS var geometry new THREE CylinderGeometry 200 200 20
  • 获取 2 个日期之间的月份名称

    我有两个约会from and to 我想获取这两个日期之间的所有月份名称 以下是我的代码 var monthNames January February March April May June July August September
  • 如何在 JavaScript 中设置/更新 String 对象的值

    我有一个具有一些属性的对象字符串对象 var obj foo new String bar 我在用字符串对象因为我需要在对象上存储额外的子属性 同时仍然能够获取字符串值 obj foo baz baz obj foo gt bar 我觉得问
  • C++ 模板参数数量错误(2,应该是 1)

    我使用 C 并行快速排序程序进行了测试 如下所示 首先使用列表作为容器 然后我转移到通用容器类型 但它报告了标题错误 可以帮忙解决这个问题吗 include
  • 响应式菜单:悬停子菜单显示错误

    简而言之 我根据教程创建了一个响应式菜单 当您将鼠标悬停在投资组合按钮上时 菜单应该显示子菜单 而在移动模式下 您需要按该按钮才能显示子菜单 效果很好 问题是该教程有一个错误 如果您在桌面模式下按组合按钮 子菜单将不会再次显示 除非您按 单
  • Javascript / jQuery - 转换特殊 html 字符

    我有一个pre元素中包含一些 html 代码 该代码中有特殊字符 例如 lt 所以它不会破坏页面 然后我有一个 javascript 函数 它获取此 pre 元素的内容 突出显示它 使用 codemirror 并用突出显示的文本替换元素内容
  • 我可以防止将 Leaflet 地图平移到世界边缘之外吗?

    有没有办法限制平移到世界边缘之外 在这幅画中 棕色是世界 灰色是虚空 我想让它不可能像这样平移 Leaflet 允许您控制地图抵抗被拖出边界的程度maxBoundsViscosity选项 值 0 到 1 将其设置为最大值会完全禁用拖动出界

随机推荐

  • 熊猫辅助轴

    我有以下数据框 Date A B 0 2017 05 31 17453139 5 865738 1 2017 06 30 17425164 5 272728 2 2017 07 31 17480789 4 843094 当我运行这个时 df
  • OpenCV PS 3 眼

    我在 Ubuntu 10 10 上 尝试从 ps3eye 相机捕获视频 afaik OpenCV 使用 v4l 从网络摄像头捕获 gucview cheese vlc 都可以访问和使用相机 但是当使用 opencv 捕获时 我得到空白帧 D
  • PHP 检测重复文本

    我有一个网站 用户可以在其中输入有关自己的描述 大多数用户会编写适当的内容 但有些用户只是多次复制 粘贴相同的文本 以创建大量文本的外观 例如 爱一个 和平爱一个 和平爱一个 和平爱一个 和平爱一个 和平爱一个 和平 有没有好的方法可以用
  • vue 2生命周期-如何在Destroy之前停止?

    我可以添加一些东西吗beforeDestroy以防止损坏组件 或者有什么办法可以防止损坏组件 我的情况是 当我通过 vue route 更改 spa 页面时 我首先使用 watch 路由 但我发现这不会触发 因为组件只是销毁了 As 贝尔明
  • 如何在 R 中相对于中心按顺时针顺序对点进行排序?

    我有一个带有 X 和 Y 坐标的数据集 我试图找出一种方法来从中心沿 R 的顺时针 或逆时针 方向对它们进行排序 假设以纬度和经度的中位数为中心 样本数据 df lt structure list name c A B C D E F G
  • 复制省略法

    从复制省略法的标准定义来看 在 C 计算机编程中 复制省略是指消除不必要的对象复制的编译器优化技术 让我们考虑以下代码 include
  • java初学者if/else if问题

    尝试设置 String 变量的代码块似乎出了问题 因为无论我运行程序时做什么 对话框总是显示 otto txt 有谁知道我在这里做错了什么 谢谢 猎食 import java awt FlowLayout import java awt e
  • 如何用 python 显式绘制 y 轴

    I used pp yscale log 在我的 python 脚本中绘制一个以对数刻度显示 y 刻度的图形 然而 图中并没有出现y轴 有没有办法在python中显式显示y轴 leg pp legend series labels loc
  • 适用于 iPhone 的 Flex 应用程序

    是否可以使用 Adob e Flex AIR 为 iPhone 制作应用程序 有教程 指点吗 不 我不相信你能做到 尽管 iPhone 支持 Flash 的传闻已经有一段时间了 但它仍然未能实现 预计到达时间 看来现在这是可能的 http
  • RestSharp 序列化为 JSON,对象未按预期使用 SerializeAs 属性

    我在用休息锐利 通过 NuGet 的版本 104 4 调用 Rest Web 服务 我设计了一组与 API 中公开的资源相匹配的对象 POCO 但是 我的对象属性名称与发布数据时 Rest 服务所期望的名称不匹配 因此当我向 Rest 服务
  • Swagger 永久授权令牌

    我正在 ASP NET Core MVC 中开发 Web api 我想知道是否有一种方法可以使swagger中的授权令牌持久化 这样就不需要每次运行应用程序时都手动进行授权 这将使测试变得更容易 您可以使用persistAuthorizat
  • 如何在 WinDbg 扩展中基于转储文件内存创建对象?

    我负责开发一个大型应用程序 并经常使用 WinDbg 根据客户提供的 DMP 文件来诊断问题 我为 WinDbg 编写了一些小扩展 事实证明它们对于从 DMP 文件中提取信息非常有用 在我的扩展代码中 我发现自己以相同的方式一遍又一遍地手动
  • 强制 iOS 设备改变方向

    首先 我很抱歉再次提出同样的问题 这个问题已经在这个论坛上被问过很多次了 但是 我的问题是我已经尝试了所有建议的解决方案 但仍然没有解决我的问题 我有一个ViewControllerA在肖像模式下和ViewControllerB在横向模式下
  • Google 地图 API v3 - GIcon 未定义

    我知道 v2 到 v3 存在一些问题 我可以在这里做什么来解决它 v3 不支持 GIcon Google Map icon object var gMapIcon new GIcon G DEFAULT ICON change to new
  • 使用 data.table 包进行条件二进制连接和引用更新

    这是我现实生活中的问题 我觉得可以很容易地解决 但我在这里遗漏了一些明显的东西 我有两个大数据集TK and DFT library data table set seed 123 TK lt data table venue id rep
  • 远程调试符号文件格式

    有谁知道远程调试符号文件的文件格式 项目 gt 选项 gt 链接 gt 包括远程调试符号 None
  • 在Python中声明编码[重复]

    这个问题在这里已经有答案了 我想使用以下代码在 python 中分割字符串 means a b c lst means split 但我收到此错误消息 SyntaxError 文件 dict py 第 2 行中存在非 ASCII 字符 xd
  • 使用 Autofac 解析 MVC5 应用程序中的 IOwinContext

    我使用时遇到问题MembershipReboot使用新的 ASP MVC5 模板和Autofac 我使用默认的 MVC5 模板来设置站点 然后尝试连接MembershipReboot框架作为模板附带的 ASP Identity 框架的替代品
  • 如何使用 JavaScript 将引导图标添加到画布上?如果有办法的话

    这是我到目前为止所尝试过的 ctx setAttribute class glyphicon glyphicon time 但是也 var icon document createElement span icon className gl
  • 有什么方法可以将自定义元素的模板标记和样式保留在 JavaScript 字符串之外?

    这是使用自定义元素的示例开发者 google com https developers google com web fundamentals web components customelements let tmpl document