标题是自我解释的.如果我得到多个简短答案,我会在最后编译它们.
在使用v1甚至v0之前,请参阅caniuse.com.
在polymer-cli上运行聚合物初始化时,我遇到了这个问题。
未捕获的DOMException:无法在'CustomElementRegistry'上执行'define'
我想在使用 shadow DOM 的自定义元素中使用带有哈希 URL 的锚元素。我希望浏览器向下滚动到该锚点,但它没有这样做(至少是 Chrome)。
细节:
我有一个像这样的 index.html:
...
<a href="#destinationInsideShadowDOM">Jump</a>
...
<my-custom-element></my-custom-element>
...
Run Code Online (Sandbox Code Playgroud)
另一个用于自定义元素的 html 文件,其中包含锚点:
<template id="my-custom-element">
...
<a id="destinationInsideShadowDOM"></a>
...
</template>
Run Code Online (Sandbox Code Playgroud)
当我单击 index.html 中的链接时,我希望浏览器向下滚动到该锚点。
当我将锚点移动到自定义元素之外的 index.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) 我使用 CUSTOM_ELEMENTS_SCHEMA 在 angular 7 中创建了一个自定义元素。我的 app.module.ts 如下:
export class AppModule {
constructor(private injector: Injector) {}
ngDoBootstrap() {
this.registerCustomElements();
}
registerCustomElements() {
const HeaderElement = createCustomElement(AppComponent, {
injector: this.injector
});
const FooterElement = createCustomElement(BcAngFooterComponent, {
injector: this.injector
});
customElements.define("header-element", HeaderElement);
customElements.define("footer-element", FooterElement);
}
}
Run Code Online (Sandbox Code Playgroud)
我在 app.component.html 中引用了这些自定义元素,如下所示:
<footer-element footer-data="footerInputData"></footer-element>
Run Code Online (Sandbox Code Playgroud)
这个 footerInputData 在我的 app.component.ts 文件中作为字符串引用。
export class AppComponent {
footerInputData: any = {title: "Page Title"};
}
Run Code Online (Sandbox Code Playgroud)
在我的自定义元素的 HTML 中,我使用插值来显示作为输入传递给它的数据。
<div class="nav-list-wrap">
{{footerData}}
</div>
Run Code Online (Sandbox Code Playgroud)
当页面加载时,我没有看到显示的对象。相反,它显示的是“footerInputData”。
如何让我的自定义元素从我的 app.component.ts 文件中获取数据,而不是将数据显示为字符串。
另外,JSON 对象可以传递给我的自定义元素吗?
当我们要使用Shadow Dom创建自定义单选按钮作为 Web 组件时,就会出现问题。
通常,当我们使用单选按钮时,我们通常会为分组的单选框赋予相同的名称,如下所示。
<input type="radio" name="size" id="small" value="small">
<input type="radio" name="size" id="large" value="large">
Run Code Online (Sandbox Code Playgroud)
但是如果我们定义一些自定义元素(比如 cus-radio) -> 我们会以一种方式将名称和 ID 作为输入(来自父元素)并将它们放在自定义元素中。这将完全适用于正常情况。
但我的问题是影子 dom!当我们在 shadow dom 内创建元素时,其中的属性是可访问的或与外部 dom(主 dom)连接。那么,如果它的 name 和 id 属性在父 dom 中不可访问或通用,我们如何开发自定义单选按钮?
例子:-
我们将像这样开发我们的自定义元素(像角度元素中的伪代码)
radio.html:-
<input type="radio" [name]="name" [id]="id" ...>
Run Code Online (Sandbox Code Playgroud)
TS/逻辑文件:-
...
component cus-radio {
@Input() name: string;
@Input() id: string;
...
Run Code Online (Sandbox Code Playgroud)
无论我们在哪里使用它:-
<cus-radio [id]="'small'" [name]="'size'" value="small">
<cus-radio [id]="'large'" [name]="'size'" value="large">
Run Code Online (Sandbox Code Playgroud)
预期的行为应该是(就像在正常 dom 中发生的那样),这两个无线电输入必须相互关联并存在于两个相互理解中,就像一个被检查了另一个必须取消检查等。但在 shadow dom 中它没有。因为那些 name 和 id 在没有引用父 dom(主 dom)的 shadow …
javascript web-component shadow-dom custom-element angular-elements
我想知道是否可以使用不同版本的 Angular 构建的不同角度元素(自定义元素)。我听说 zone.js 正在污染全局范围。
感谢您的回答。
谁能告诉我为什么我不能在 lit-html 的html方法中使用变量?
const h1 = 'h1';
return html`
<${h1} class="a-heading ${classes}">
<slot></slot>
</${h1}>
`;
Run Code Online (Sandbox Code Playgroud)
如果我替换${h1}为h1没有问题的作品。
javascript web-component custom-element lit-element lit-html
假设我有一个自定义元素定义,用带有 JSDoc 注释的 JavaScript 编写:
my-element.js:
/** @element my-element */
export class MyElement extends HTMLElement { }
customElements.define('my-element', MyElement);
Run Code Online (Sandbox Code Playgroud)
和一个声明文件,使用declarationand生成allowJs:
my-element.d.ts:
/** @element my-element */
export class MyElement extends HTMLElement { }
Run Code Online (Sandbox Code Playgroud)
我希望打字稿自动将元素添加到HTMLElementTagNameMap.
我当前的解决方法是使用构建后脚本将其连接到声明文件:
echo "declare global { interface HTMLElementTagNameMap { 'my-element': MyElement; } }" >> my-element.d.ts
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
是否可以自动或以编程方式插入特定类型的嵌套 Web 组件或元素,而无需为其指定slot属性?
考虑这样的结构:
<parent-element>
<child-element>Child 1</child-element>
<child-element>Child 2</child-element>
<p>Content</p>
</parent-element>
Run Code Online (Sandbox Code Playgroud)
有了<parent-element>这样的 Shadow DOM:
<div id="child-elements">
<slot name="child-elements">
<child-element>Default child</child-element>
</slot>
</div>
<div id="content">
<slot></slot>
</div>
Run Code Online (Sandbox Code Playgroud)
预期的结果是:
<parent-element>
<#shadow-root>
<div id="child-elements">
<slot name="child-elements">
<child-element>Child 1</child-element>
<child-element>Child 2</child-element>
</slot>
</div>
<div id="content">
<slot>
<p>Content</p>
</slot>
</div>
</parent-element>
Run Code Online (Sandbox Code Playgroud)
换句话说,我想强制<child-element>s 只允许在<parent-element>类似于<td>元素中只允许在一个<tr>元素中使用。我希望它们被放置在<slot name="child-elements">元素中。必须在slot它们中的每一个上指定一个属性以将它们放置在 的特定插槽中<parent-element>似乎是多余的。同时, 中的其余内容<parent-element>应该自动插入到第二个<slot>元素中。
我首先搜索了一种在注册父元素时定义它的方法,尽管CustomElementRegistry.define()目前仅支持extends作为选项。
然后我想,也许有一个功能允许手动插入元素,即类似的东西childElement.slot('child-elements') …
custom-element ×10
javascript ×6
shadow-dom ×4
html ×3
angular ×2
typescript ×2
angular7 ×1
jsdoc ×1
lit-element ×1
lit-html ×1
polymer ×1
polymer-2.x ×1