标签: shadow-dom

将 jQuery 与 Shadow dom 结合使用

这里我用 Shadow dom 创建了元素。

/* some preparing code */
this.createShadowRoot();  // creates shadow root, this refers to element
Run Code Online (Sandbox Code Playgroud)

稍后在代码中我将访问我创建的影子 dom。这些工作:

this.shadowRoot.getElementById("...")
this.shadowRoot.querySelector("...")
Run Code Online (Sandbox Code Playgroud)

然而这并没有:

$("...", this.shadowRoot)
Run Code Online (Sandbox Code Playgroud)

这是为什么?作为目前他的工作的临时解决方案:

$("...", this.shadowRoot.children)
Run Code Online (Sandbox Code Playgroud)

有没有更好/更优雅的方法来使用 jQuery 处理影子根?

请注意,我使用的 jQuery 版本是 2.1.1,并且我只处理 Chrome。


编辑:this.shadowRoot.children在顶层查找节点时显然不起作用。

html javascript jquery shadow-dom

3
推荐指数
1
解决办法
7837
查看次数

有没有办法使用 querySelector 来获取一个开放的 shadow dom

假设我创建并插入了一个这样的元素

<template id="react-web-component">
  <span>template stuff</span
  <script src="/static/js/bundle.js" type="text/javascript"></script>
</template>
<script>
  (function (window, document) {
    const doc = (document._currentScript || document.currentScript).ownerDocument;
    const proto = Object.create(HTMLElement.prototype, {
      attachedCallback: {
        value: function () {
          const template = doc.querySelector('template#react-web-component').content;
          const shadowRoot = this.attachShadow({ mode: 'open' });
          shadowRoot.appendChild(template.cloneNode(true));
        },
      },
    });
    document.registerElement('react-web-component', { prototype: proto });
  })(window, document);
</script>
<react-web-component></react-web-component>
Run Code Online (Sandbox Code Playgroud)

现在我想使用 aquerySelector来访问我的元素的开放阴影 dom。像这样:

document.querySelector('react-web-component::shadow')
Run Code Online (Sandbox Code Playgroud)

但这不起作用。有没有其他办法?

编辑以回应@Supersharp 的回答

对不起,我没有说清楚。我使用的 webpackstyle-loader只接受一个 CSS 选择器,它与 一起使用document.querySelector,所以我要的是一个我可以用这种方式使用的 CSS 选择器。

javascript shadow-dom html5-template

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

Shadow dom 隐藏了innerHTML

创建带有 shadow dom 的自定义元素并设置元素的 innerHTML 时,它不会显示。为什么?有没有办法防止这种情况发生?

//JS代码

export default class VideoPlayer extends DomElement {
   constructor() {
      super();
      const mountPoint = document.createElement('div');
      this.attachShadow({ mode: 'open' }).appendChild(mountPoint);
  }
}
window.customElements.define('video-player', VideoPlayer);
Run Code Online (Sandbox Code Playgroud)

//HTML代码

<video-player>Why is this text hidden?</video-player>
Run Code Online (Sandbox Code Playgroud)

javascript innerhtml web-component shadow-dom custom-element

3
推荐指数
1
解决办法
1107
查看次数

如何在#shadow-root ( shadow DOM ) 中重新设计元素

以下代码是来自 chrome 开发工具的视图

<textarea>
   #shadow-root (user-agent)
     <p> This I want to restyle </p>
 <textarea>
Run Code Online (Sandbox Code Playgroud)

如果我想在 shadow DOM 中重新设置元素的样式,我必须使用什么 CSS 选择器?

谢谢你

html css shadow-dom

3
推荐指数
1
解决办法
3089
查看次数

为什么宿主元素上的伪类必须在宿主函数内部?

我不明白为什么在对主机本身起作用时,像这样的伪类:focus-within需要在:host()函数括号内。为什么不能:host:focus-within div?更奇怪的是它在:host另一个:host().

class MyElementFail extends HTMLElement {

	constructor(...args) {
		super(...args)

		this.attachShadow({mode: 'open'}).innerHTML = `
		<style>
    :host{
      display: block;
      padding: 20px;
      background-color: salmon;
    }
    :host div{
      background-color: white;
    }
    /*This part is different:*/
		:host:focus-within div{
			background-color: green;
		}
		</style>
    <input type="text" value="click in here"/>
		<div>
    Change to green
		</div>`
	}
}
window.customElements.define('my-element-fail', MyElementFail);


class MyElement extends HTMLElement {

	constructor(...args) {
		super(...args)

		this.attachShadow({mode: 'open'}).innerHTML = `
		<style>
    :host{
      display: block;
      padding: 20px; …
Run Code Online (Sandbox Code Playgroud)

html css web-component shadow-dom custom-element

3
推荐指数
1
解决办法
578
查看次数

web 组件 shadow dom 中的 rem

我们知道我们可以将font-sizeon设置htmlrem普通 DOM 节点的基础,我使用这个技巧使我的应用程序的字体更加灵活,可以通过 js 动态更改。

然而,当我创建一个 web 组件时,我发现rem里面的 shadow DOM 总是指 16px,即使我尝试*{ font-size:72px }在 shadow DOM 内部添加一个样式。16px 是常见的浏览器默认字体大小。

这是一个简单的演示:https : //jsfiddle.net/qmacwb6r/

<html>
<head>
<script>
var template =`
<style>
* {
    font-size: 72px;
}
div {
    font-size:2rem;
}
</style>
<div>
    I am 2rem = 2*broser default
</div>
`
class TestTemplate extends HTMLElement {
    constructor(){
        super();
        this.rt = this.attachShadow({mode:"open"});
        this.rt.innerHTML = template;
    }
}
customElements.define("test-component", TestTemplate);
</script>
</head>
<body>
<test-component></test-component>
</body> …
Run Code Online (Sandbox Code Playgroud)

javascript css font-size web-component shadow-dom

3
推荐指数
1
解决办法
1956
查看次数

如何遍历 shadow DOM 中的元素

我有

div id=outer
  #shadowRoot
    div id=inner
    button
Run Code Online (Sandbox Code Playgroud)

在按钮的点击处理程序中,我想引用 div“inner”。在非 shadowDom 世界中,这将是document.getElementById('inner'),但在 shadow DOM 世界中等价物是什么?

注意。这是从自定义元素内部访问。我不是想从外面刺穿 shadow DOM。

html javascript web-component shadow-dom

3
推荐指数
1
解决办法
1024
查看次数

StencilJS 检查命名槽是否为空

我有一个带有两个命名插槽的 stencilJS 组件。有没有办法确定插槽是否已分配值?例如,下面的代码片段显示了“ logo ”和“ menu ”的命名槽。如果两个命名槽都不为空,我如何检查组件内部?理想情况下,我想从组件内部和 componentWillMount() 期间进行检查。谢谢你。

  <koi-menu breakpoint="768" userToggled="false">
      <div class="logo__header " slot="logo"><img src="assets/images/logo.png" /></div>

      <ul class="nav__wrapper list mw8-ns center-m" slot="menu">
        <li class="nav__listitem"><a class="ttu nav__link" href="???">Why Live Grit</a></li>
        <li class="nav__listitem"><a class="ttu nav__link" href="???">Clients</a></li>
        <li class="nav__listitem"><a class="ttu nav__link" href="???">Our Programs</a></li>
        <li class="nav__listitem"><a class="ttu nav__link" href="???">Our Story</a></li>
      </ul>

  </koi-menu>
Run Code Online (Sandbox Code Playgroud)

web-component shadow-dom stenciljs

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

如何将自定义 css 应用于 ionic 4 组件?

我经常遇到不知道要为离子组件更改什么 css 的问题。例如,我有一个使用 ionic 勾勒轮廓的按钮,我最初的猜测是用类似的东西覆盖其轮廓/边框颜色。

border: 1.2px solid #697954; 
Run Code Online (Sandbox Code Playgroud)

但这没有用,所以我基本上只需要浏览论坛帖子,直到我发现它改变了

--border-color
Run Code Online (Sandbox Code Playgroud)

这似乎是寻找如何覆盖离子组件 css 变量的一种非常低效的方法。

我在哪里可以找到 css ionic 用于其组件的确切内容,以便我可以轻松地覆盖它们而无需翻阅论坛帖子?我在 github 上检查了 ionic core.css,但这并没有给我我想要的信息。

众所周知,我的边框颜色已正确完成,但我需要更改 onclick 背景颜色和 onclick 文本颜色。我不想再通过论坛挖掘。

css sass shadow-dom ionic-framework ionic4

3
推荐指数
1
解决办法
2918
查看次数

用于约束验证的自定义 Web 组件表单元素

只有一些 HTMLElements 支持约束验证 api(例如,HTMLButtonElement)。我想创建一个自定义的 web 组件,它也支持约束验证 api。

下面给出了所需结果的示例:

<form>
  <input name="title" required>
  <custom-form-component></custom-form-component>
</form>
<script>
  const form = document.querySelector('form');
  form.checkValidity();
</script>
Run Code Online (Sandbox Code Playgroud)

custom-form-component可以调用setCustomValidity其自身上(基于相应用户输入上下文)和验证本身真或假。因此,form.checkValidity()对于 的结果,对 的调用应该返回真或假custom-form-component

正如我从文档中发现的(例如在 MDN 上),仅对于某些元素,可以附加影子根。表单元素是不可能的。但是,只有表单元素支持约束验证 api。

具体问题:如何实现支持约束验证api的自定义Web组件?

web-component shadow-dom native-web-component constraint-validation

3
推荐指数
1
解决办法
683
查看次数