标签: custom-element

自定义元素v0和v1之间有什么区别?

标题是自我解释的.如果我得到多个简短答案,我会在最后编译它们.

在使用v1甚至v0之前,请参阅caniuse.com.

html web-component custom-element

8
推荐指数
1
解决办法
2069
查看次数

未捕获的DOMException:无法在“ CustomElementRegistry”(聚合物2.0)上执行“定义”

在polymer-cli上运行聚合物初始化时,我遇到了这个问题。

未捕获的DOMException:无法在'CustomElementRegistry'上执行'define'

web-component polymer custom-element polymer-2.x

8
推荐指数
2
解决办法
9005
查看次数

锚标签 <a id="jump"> 在 shadow dom 中带有哈希值

我想在使用 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 时,它可以工作,但不能在内部使用。

html shadow-dom custom-element

7
推荐指数
1
解决办法
1302
查看次数

自定义元素 getRootNode.closest() 函数跨越多个(父)shadowDOM 边界

我花了一些时间进行搜索,但只看到太多常规的“遍历 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)

javascript shadow-dom custom-element native-web-component

7
推荐指数
3
解决办法
1816
查看次数

如何将 JSON 对象传递给角度自定义元素

我使用 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 对象可以传递给我的自定义元素吗?

javascript typescript custom-element angular angular7

7
推荐指数
1
解决办法
6359
查看次数

在 Shadow DOM 中创建单选按钮

当我们要使用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

7
推荐指数
1
解决办法
989
查看次数

是否可以使用由不同版本的 Angular 构建的不同角度元素

我想知道是否可以使用不同版本的 Angular 构建的不同角度元素(自定义元素)。我听说 zone.js 正在污染全局范围。

感谢您的回答。

javascript web-component custom-element angular

7
推荐指数
1
解决办法
1405
查看次数

lit-html 的动态标签不可能?

谁能告诉我为什么我不能在 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

7
推荐指数
3
解决办法
1981
查看次数

JSDoc Typescript 声明:如何自动注册自定义元素?

假设我有一个自定义元素定义,用带有 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)

有一个更好的方法吗?

javascript jsdoc typescript custom-element

7
推荐指数
0
解决办法
424
查看次数

是否可以以编程方式在 Web 组件中插入元素?

是否可以自动或以编程方式插入特定类型的嵌套 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') …

html web-component shadow-dom custom-element html-templates

7
推荐指数
1
解决办法
1028
查看次数