【问题标题】:Encapsulation of web components and event binding to shadow DOM elements封装 web 组件和事件绑定到 shadow DOM 元素
【发布时间】:2014-04-18 20:06:53
【问题描述】:

在开始使用 Polymer 之前,我开始详细学习 Web 组件。

我正在研究一个简单的示例,使用两个 <button> 和一个 <input type="text"> 元素创建一个旋转按钮。

模板是:

<template id="tplSpinButton">
  <style type="text/css">
    .spin-button > * {
      display: inline;
      text-align: center;
      margin: 0;
      float: left;
    }
  </style>
  <div class="spin-button">
    <content select=".up-spin-button"></content>
    <content select=".display-spin-button"></content>
    <content select=".down-spin-button"></content>
  </div>
</template>

而宿主元素为:

<article>
  <spin-button>
    <button class="up-spin-button">&#43;</button>
    <input class="display-spin-button" type="text" value="0" size="2"/>
    <button class="down-spin-button">&#45;</button>
  </spin-button>
</article>

还有 JS 代码

var template = document.querySelector('#tplSpinButton');
var host = document.querySelector('article spin-button');
var articleShadowRoot = host.createShadowRoot();
articleShadowRoot.appendChild(document.importNode(template.content,true));

var counterBox = document.querySelector('.display-spin-button');
var upHandler = document.querySelector('.up-spin-button');
var downHandler = document.querySelector('.down-spin-button');
upHandler.addEventListener('click', function(e){
    var count = parseInt(counterBox.value);
    counterBox.value = count + 1;
}, false);

downHandler.addEventListener('click', function(e){
    var count = parseInt(counterBox.value);
    counterBox.value = count - 1;
}, false);

document.registerElement('spin-button', {
    prototype: Object.create(HTMLElement.prototype)
});

在实验过程中,我了解到 JS/ 代码不能像 &lt;style&gt; 在 shadow DOM 中那样工作,它是 &lt;template&gt; 的一部分 在上面的示例中,我添加了插入点 (&lt;content&gt;),然后将事件侦听器附加到分布式元素。

  • 有没有办法封装事件监听器的实现?
  • 有什么方法可以将控件和元素移动到shadow dom,然后以任何方式附加事件监听器?

【问题讨论】:

    标签: html web-component shadow-dom


    【解决方案1】:

    有没有办法封装事件监听器的实现?

    您可以将其作为元素原型的一部分,并在 lifecycle callback 中构建它。

    有什么方法可以将控件和元素移动到shadow dom,然后以任何方式附加事件监听器?

    使用getDistributedNodes 选择投影到内容标签中的元素。

    这是a jsbin,它说明了这两个概念。希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 2019-09-06
      • 2017-06-20
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多