我们的团队正在开发原生的V1 Web组件。
一位同事遇到错误,但只在Firefox中运行一个组件的测试。
仅在将textContent
的值设置为undefined
时才会出现错误。
答案 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
设置为text
,null
无效。
我打开了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
设置为undefined
或null
不应该失败,而是将textContent
设置为空字符串: