2023 年 3 月更新
注意:这是有效的,因为在下一个刻度中,lightDOM 中的N 个(不是全部!)DOM 元素将被解析。
对于 (app.) N > 1000你会遇到麻烦,因为延迟将在解析所有 N 个元素之前结束。
因此,要么添加(大约 20 行)代码来实际检查所有 lightDOM 是否已解析。(但是由于您的 DOM 正在遭受 Obesitas 的困扰,因此您可能还会遇到其他性能问题)
或者只是保持 lightDOM中N 个 DOM 元素的数量较小。
当然,您稍后在解析之后添加的任何 DOM都不会影响任何内容(当不触发时)connectedCallback
2021 年 3 月更新:
FireFox 错误已修复,现在的行为与 Chromium 和 Safari 相同。
这意味着等待 JS EventLoop 为空(带有setTimeout或requestAnimationFrame)现在connectedCallback是一个跨浏览器方法
connectedCallback(){
setTimeout(()=>{
// can access lightDOM here
}); // ,0 not required
}
Run Code Online (Sandbox Code Playgroud)
事件循环到底是什么?- 菲利普·罗伯茨 …
我想更改隐藏在影子根中的元素的属性。由于项目的性质,我无法直接引用 JS 中的文档,我只能使用自定义类(不适用于影子根)或 jQuery,但我不知道如何编写指向该文件的路径元素。
该元素没有“部分”,因此我无法在选择器中使用它。
我已经尝试过的 - 我选择了shadow上方的最后一个元素并引用了它的shadowRoot,然后我尝试通过它的id找到封装的元素。我正在devtool中测试它,到目前为止还没有成功。
$("#root_ptcschartline-7-bounding-box".shadowRoot).find("#chart-line")
.css('padding','100px');
Run Code Online (Sandbox Code Playgroud)
html 片段:

我花了一些时间进行搜索,但只看到太多常规的“遍历 DOM”博客或仅提升一个级别的答案getRootnode()
伪代码:
HTML
<element-x>
//# shadow-root
<element-y>
<element-z>
//# shadow-root
let container = this.closest('element-x');
</element-z>
</element-y>
</element-x>
Run Code Online (Sandbox Code Playgroud)
标准element.closest()功能并没有捅破阴影边界;
所以this.closest('element-x')返回null因为没有 <element-x>内<element-z>shadowDom
目标:
<element-x>从后代内部查找<element z>(任何嵌套级别)
必需的:
A(递归).closest()函数,走了(阴影)DOM小号和认定<element-x>
注意:元素可能有也可能没有 ShadowDOM(参见<element y>:仅 lightDOM)
我可以而且明天会自己做;只是想知道是否有聪明的头脑已经做到了。
资源:
这是以下答案中的未缩小代码:
closestElement(selector, base = this) {
function __closestFrom(el) {
if (!el || el === document || el === window) return …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用 Web 组件,我似乎无法弄清楚为什么我的 attributeChangedCallback 没有触发;
我一直在将它与我创建的组件进行比较,其中一切都正常工作。
我检查过的事情:
但是,如果我尝试在 attributeChangedCallback 中执行任何操作(示例只是记录名称),它不会触发。
我确信我错过了一些非常简单的东西?
class HamburgerMenu extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: "open" });
this.shadowRoot.innerHTML = `
<svg xmlns="http://www.w3.org/2000/svg" width="164" height="102" fill="none">
<g stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="20">
<path id="top" d="M10 92L154 92"/>
<path id="middle" d="M10 50.8L154 50.8"/>
<path id="bottom" d="M10 10L154 10"/>
</g>
</svg>`;
this.svg = this.shadowRoot.querySelector("svg");
this.svg.addEventListener("click", this.toggleStatus.bind(this));
}
static get observedAttributes() {
return ["isOpen"];
} …Run Code Online (Sandbox Code Playgroud)我对组件开发很陌生,并且正在努力打印一个简单的 hello world。有人能帮我吗?
重现步骤:
1. now-cli login --host stack.service-now.com
2. now-cli project --name nowjedi-hello -- description 'A web component printing Hello World'
3. npm install
4. now-cli develop --open
Run Code Online (Sandbox Code Playgroud)
返回:
SyntaxError: Failed to execute 'define' on 'CustomElementRegistry': "299742-nowjedi-hello" is not a valid custom element name
Run Code Online (Sandbox Code Playgroud)
我正在关注“开发你的组件”。知道发生了什么吗? https://developer.servicenow.com/dev.do#!/guide/orlando/now-experience/cli/development-flow/。
是否有安全原因阻止<use>元素在数据 URI 图像中工作?我尝试过这样的事情:
const svg = document.querySelector("svg");
const img = document.querySelector("img");
img.src = "data:image/svg+xml;charset=UTF-8," + encodeURI(svg.outerHTML);Run Code Online (Sandbox Code Playgroud)
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect id="foo" width="100" height="100"/>
<use xlink:href="#foo" x="10" y="10"/>
</svg>
<img src=""/>Run Code Online (Sandbox Code Playgroud)
如果我直接访问数据 URI,Chrome 和 Firefox 都会给出如下错误消息:
<use>数据 URI 中包含元素的损坏图像示例:
<img src="data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20xmlns:xlink=%22http://www.w3.org/1999/xlink%22%20width=%22110%22%20height=%22110%22%3E%0A%20%20%3Crect%20id=%22foo%22%20width=%22100%22%20height=%22100%22/%3E%0A%20%20%3Cuse%20xlink:href=%22#foo%22%20x=%2210%22%20y=%2210%22/%3E%0A%3C/svg%3E%0A"/>Run Code Online (Sandbox Code Playgroud)
shadow-dom ×3
css ×2
javascript ×2
callback ×1
class-method ×1
components ×1
html ×1
jquery ×1
reactjs ×1
svg ×1
webpack ×1