当webcomponent polyfill加载时,将“textContent”设置为undefined时,Firefox会抛出异常

时间:2017-12-14 22:12:57

标签: javascript firefox web-component polyfills

我们的团队正在开发原生的V1 Web组件。

一位同事遇到错误,但只在Firefox中运行一个组件的测试。

仅在将textContent的值设置为undefined时才会出现错误。

3 个答案:

答案 0 :(得分:2)

这是由于Shadow DOM polyfill中的following line

  if (text.length > 0 || this.nodeType === Node.ELEMENT_NODE) {
      this.appendChild(document.createTextNode(text));
  }
文件中的

patch-accessors.js :如果text.length设置为textnull无效。

我打开了issue on github

如果您不需要Shadow DOM,则只能导入没有Shadow DOM的polyfill:

<script src="https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/1.0.20/webcomponents-hi-ce.js"></script> 

答案 1 :(得分:1)

我创建了一个初始测试但它没有失败:

    var el = document.querySelector('#outside');
    el.textContent = 'value';
    el.textContent = undefined;
    <span id="outside"></span>

我们摸不着头脑,然后她指出这在她的网络组件中失败了。

所以我加载了polyfill并添加了代码来测试这样的Web组件:

    var el = document.querySelector('#outside');
    el.textContent = 'value';
    el.textContent = undefined;

    // Class for `<my-el>`
    class MyEl extends HTMLElement {
      constructor() {
        super();
      }

      connectedCallback() {
        this.innerHTML = '<span id="inner"></span>';

        var el = this.querySelector('#inner');
        el.textContent = 'value';
        el.textContent = undefined;
      }
    }

    // Define our web component
    customElements.define('my-el', MyEl);
<script src="https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/1.0.20/webcomponents-lite.js"></script>
<span id="outside"></span>
<my-el></my-el>

出乎意料的是,错误发生在Web组件中,而不是在将.textContent设置为外部元素的代码中。

因此,如果您尝试将textContent设置为undefined,则现有的Web Components polyfill会引发错误。

通过以下方式保护您的代码:

el.textContent = newValue || '';

答案 2 :(得分:1)

这是ShadyDOM的有效问题。我提交了Pull Request来解决问题:https://github.com/webcomponents/shadydom/pull/205

textContent设置为undefinednull不应该失败,而是将textContent设置为空字符串: