WebComponents: пользовательский элемент Firefox не отображается - PullRequest
1 голос
/ 22 апреля 2019

Я использую функцию «пользовательских элементов» веб-компонентов и должен поддерживать старые браузеры (Firefox v60), поэтому вместо загрузки полифайлов через webcomponent-loader.js, который загружает все полифилы. ленивый загруженный пользовательский элемент polypill, основанный на обнаружении признаков

(function() {
if(!window.customElements){
var ce = document.createElement('script');
ce.type = 'text/javascript';
ce.async = true;
ce.src = 'https://unpkg.com/@webcomponents/custom-elements@1.2.4/custom-elements.min.js';
/**

     * loading "customElement" polyfills wont't fire "WebComponentsReady" event, it will be called when we use
     * "webcomponent-loader.js" but it will load other polyfills("shadow-dom"), so loading the "customElements" polyfill alone
     * based on feature detection and firing "WebComponentsReady" event manually.
     */
  ce.onload = function() {
      document.dispatchEvent(
          new CustomEvent('WebComponentsReady', {bubbles: true}));
  };
  var st = document.getElementsByTagName('script')[0];
  st.parentNode.insertBefore(ce, st);
}
})()

и событие WebComponentsReady запускается вручную при загрузке. Зарегистрированный элемент, как показано ниже

let registerElement = () => {
 if(!window.customElements.get(“wc-button")){
   window.customElements.define(‘wc-button', WCButton);
 }
};

if(window.customElements){
  registerElement();
 } else {
  document.addEventListener('WebComponentsReady', registerElement);
}

WebComponentsReadygot сработало, и в обратном вызове слушателя был вызван для определения / регистрации элемента, но элемент не отображается и не загружается на странице в firefox60.6.1esr (64-битная версия)

Ответы [ 2 ]

2 голосов
/ 22 апреля 2019

webcomponents-loader.js делает функцию обнаружения для вас вместо ожидания события WebComponentsReady вы делаете

<script src="https://unpkg.com/@webcomponents/webcomponentsjs/webcomponents-loader.js"></script>
<script>
window.WebComponents.waitFor(() => {
   // do stuff that needs the polyfill
})
</script>

Для получения дополнительной информации:

0 голосов
/ 22 апреля 2019

HTMLElement может быть расширен только в том случае, если реализованы пользовательские элементы (либо изначально с полифилом).

Как следствие, вы должны определить класс <wc-button> пользовательских элементов только после загрузки полифайла.

В вашем примере:

let registerElement = () => {
    if(!window.customElements.get("wc-button")){
         //define the WCButton class here
         class WCButton extends HTMLElement {
             //...
         }
         window.customElements.define(‘wc-button', WCButton);
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...