标签: custom-element

在 JavaScript 中设置动态创建元素的“class”属性

我有一个自定义元素,其创建方式如下:

connectedCallback()
{
  var on_off_switch = document.createElement('Div');
  on_off_switch.class = 'switch demo3';

  this.appendChild(on_off_switch);

 }
Run Code Online (Sandbox Code Playgroud)

但我在查看源代码时注意到on_off_switch's class 未设置为switch demo3

所有其他作业都有效,例如on_off_switch.style['background-color'] = 'red'等等。

是否可以设置class附加在自定义元素内的元素的 CSS?

html css custom-element

2
推荐指数
1
解决办法
3643
查看次数

Angular 元素:DOMException:无法在“CustomElementRegistry”上执行“define”

我使用 Angular Elements 创建了两个自定义元素。

<capp-customtag1> is defined in customtag1.js 
<capp-customtag2> is defined in customtag2.js.

I load <capp-customtag1> with <script type="text/javascript" src="assets/customtag1.js"></script>. 

Similarly, for <capp-customtag2>
Run Code Online (Sandbox Code Playgroud)

分别地,它们按预期工作。但是,如果我尝试在同一个项目(一个 Angular 6 项目)中使用它们,当我尝试加载第二个脚本时,我会收到以下错误:

错误 DOMException:无法在“CustomElementRegistry”上执行“define”:此名称已与此注册表一起使用。

对 CustomElementRegistry 的调用是在 customtag1.js 和 customtag2.js 中进行的。

这是我用来在 Angular Element AppModule 构造函数中创建 capp-customtag1 的代码:

const el = createCustomElement(CustomTag1Component, {injector: this.injector});
customElements.define('capp-customtag1', el);
Run Code Online (Sandbox Code Playgroud)

这是在第二个项目的 AppModule 构造函数中创建 capp-customtag2 的代码:

const el = createCustomElement(CustomTag2Component, {injector: this.injector});
customElements.define('capp-customtag2', el);
Run Code Online (Sandbox Code Playgroud)

为什么两个元素具有相同的自定义元素名称?而且,我该如何解决这个问题。

谢谢你。

custom-element angular

2
推荐指数
3
解决办法
6471
查看次数

找出元素或其任何父元素是否显示的高效方法:无

我需要找到一种非常高效的方法来确定自定义元素或其任何父元素是否具有 display: none;

第一种方法:

checkVisible() {
  let parentNodes = [];
  let el = this;
  while (!!(el = el.parentNode)) {
    parentNodes.push(el);
  }
  return [this, ...parentNodes].some(el => el.style.display === 'none') 
}
Run Code Online (Sandbox Code Playgroud)

有什么比这运行得更快的吗?这甚至是一种安全的方法吗?

我需要这个的原因:我们有一个<data-table>自定义元素(原生 webcomponent),它在它的connectedCallback(). 我们有一个应用程序,在单个页面中包含 20-30 个自定义元素,这导致 IE 11 需要大约 15 秒才能呈现页面。

我需要延迟那些<data-table>最初甚至不可见的组件的初始化,所以我需要一种方法来测试connectedCallback()元素是否可见(如果它在最初未显示的 18 个选项卡之一中,则不是)。

javascript web-component custom-element native-web-component

2
推荐指数
1
解决办法
853
查看次数

将 Shadow DOM 附加到自定义元素可以消除错误,但为什么呢?

根据自定义元素规范

该元素不得获得任何属性或子元素,因为这违反了使用createElementcreateElementNS方法的消费者的期望。

在这种情况下,Firefox 和 Chrome 都会正确地抛出错误。但是,当附加影子 DOM 时,不会出现错误(在任一浏览器中)。

火狐浏览器:

NotSupportedError:不支持操作

铬合金:

未捕获的 DOMException:无法构造“CustomElement”:结果不得有子级

没有影子 DOM

function createElement(tag, ...children) {
  let root;

  if (typeof tag === 'symbol') {
    root = document.createDocumentFragment();
  } else {
    root = document.createElement(tag);
  }

  children.forEach(node => root.appendChild(node));

  return root;
}

customElements.define(
  'x-foo',
  class extends HTMLElement {
    constructor() {
      super();

      this.appendChild(
        createElement(
          Symbol(),
          createElement('div'),
        ),
      );
    }
  },
);

createElement('x-foo');
Run Code Online (Sandbox Code Playgroud)

使用影子 DOM

function createElement(tag, ...children) {
  let root;

  if (typeof …
Run Code Online (Sandbox Code Playgroud)

html shadow-dom custom-element

2
推荐指数
1
解决办法
5919
查看次数

单页中使用 Angular 元素开发的多个自定义元素

我在不同的 Angular 元素项目中开发了 2 个自定义元素,当我尝试在单个 html 中使用它们时,出现错误“无法在‘CustomElementRegistry’上执行‘定义’:此名称已与此注册表一起使用”如何关注此链接开发https://medium.freecodecamp.org/how-to-create-angular-6-custom-elements-web-components-c88814dc6e0a

我知道它与加载两次打包在两个自定义元素中的库有关。如何解决这个问题?

谢谢

custom-element angular angular-elements

2
推荐指数
1
解决办法
7090
查看次数

LitElement connectedCallback() 与 firstUpdate()

正如文档所说:

每次将自定义元素附加到文档连接元素时都会触发 connectedCallback

还:

firstUpdated 在您的组件第一次更新和呈现后触发

问题是我无法弄清楚它们之间的区别。那么区别是什么呢?当我应该使用connectedCallback,当firstUpdated生命周期挂钩?

javascript web-component polymer custom-element lit-element

2
推荐指数
1
解决办法
1912
查看次数

自定义元素在谷歌浏览器中不起作用

我正在尝试在我的网站中使用一些自定义元素,并且在 Firefox 中到目前为止效果很好。然而,在谷歌浏览器中,它只是默默地失败 - 我的自定义元素的构造函数从未被调用,并且它也不会抛出错误。

假设这个最小的例子:

<!DOCTYPE html>
<html>
    <head>
        <script>
            class MyElement extends HTMLDivElement {
                constructor(){
                    super();
                    this.style.background = "#00ff00";
                    console.log("Created custom element!");
                }
            }
            function addCustomElement(){
                customElements.define("my-element",MyElement,{extends:"div"});
                console.log("Added MyElement to custom element registry!");
            }
        </script>
    </head>
    <body onload="addCustomElement()">
        <my-element style="display:block;width:100px;height:100px;background:#ff0000"></my-element>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我希望这会创建一个自定义元素类,并在添加到自定义元素注册表后将 DOM 中的MyElement所有元素转换为该类的实例,从而将最初的红色组件变为绿色。my-element在 Firefox 中,这正是发生的情况,但在 google chrome 中,它保持红色。控制台指示该元素已添加到注册表中,但从未调用其构造函数。

我错过了什么吗?这是chrome的问题,还是我做错了什么?我怎样才能让它在那里工作?

html javascript google-chrome custom-element

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

mui 使用入口点插入作用域影子 DOM 样式时选择未设置样式的下拉选项

请注意,这是针对 MUI v5 @mui/material 的,而不是使用 v4 @material-ui/core

最终弄清楚如何在使用情感入口点插入作用域阴影 DOM 样式时显示 @mui/material 样式(请参阅这篇文章如何在 React 自定义元素中为 MUI Material v5 的 MUI Material v5 创建插入点以在阴影 dom 中安装样式) ,事实证明,对于包含 @mui/material 组件的 Demo 组件,选择下拉列表的样式不正确。

这是 stackblitz https://stackblitz.com/edit/react-d8xtdu-s2cufr?file=demo.js

import React from 'react';
import Demo from './demo';
import { ThemeProvider, createTheme } from '@mui/material/styles';
import { StylesProvider, jssPreset } from '@mui/styles';
import { CacheProvider } from '@emotion/react';
import createCache from '@emotion/cache';
import { create } from 'jss';
import { render } from 'react-dom'; …
Run Code Online (Sandbox Code Playgroud)

reactjs custom-element material-ui react-typescript

2
推荐指数
1
解决办法
2093
查看次数

如何让 Vue 和 Vite 与 Web 组件配合使用?

我想将我的Vue 2项目从 webpack 迁移到Vite并且必须使用使用lit-element构建的第三方 Web 组件。

这些组件在运行时抛出错误(通过 vue):

未知的自定义元素:< foo-component > - 您是否正确注册了该组件?对于递归组件,请确保提供“名称”选项。

还有(通过lit-element

无法设置“ShadowRoot”上的“adoptedStyleSheets”属性:无法将值转换为“CSSStyleSheet”。

据我所知,那些第三方 Web 组件仅在其索引文件(内部node_modules)中执行此操作:

import FooComponent from './FooComponent';
customElements.define('foo-component', FooComponent);
Run Code Online (Sandbox Code Playgroud)

所以之前(使用 webpack 设置)我只是导入它们并且一切都可以工作。嗯,实际上 webpacklit-scss-loader也用于这些组件。

我认为 Vite 可能需要一些额外的配置,或者这里可能需要类似于“webpack”加载器的东西,但不确定我必须移动哪个方向。

我做错了什么?

javascript vue.js custom-element vite lit

2
推荐指数
1
解决办法
8356
查看次数

如何正确处理带有子元素的Javascript自定义元素(Web组件)?

我有一个Custom Element应该有很多 HTML 孩子的。我在课堂上初始化它时遇到了这个问题 constructor ' (结果一定没有孩子)。我明白原因并知道如何解决它。但我现在应该如何围绕它设计我的课程呢?请考虑这段代码:

class MyElement extends HTMLElement {
  constructor() {
    super();
  }  
  
  // Due to the problem, these codes that should be in constructor are moved here
  connectedCallback() {
    // Should have check for first time connection as well but ommited here for brevity
    this.innerHTML = `<a></a><div></div>`;
    this.a = this.querySelector("a");
    this.div = this.querySelector("div");
  }
  
  set myText(v) {
    this.a.textContent = v;
  }
  
  set url(v) {
    this.a.href = v;
  }
}

customElements.define("my-el", MyElement);

const frag …
Run Code Online (Sandbox Code Playgroud)

html javascript web-component custom-element

2
推荐指数
1
解决办法
1127
查看次数