#javascript #ecmascript-6 #polymer #web-component
#javascript #ecmascript-6 #полимер #веб-компонент
Вопрос:
Мы используем веб-компоненты с синтаксисом ES6.
Полизаполнение веб-компонентов webcomponents-lite.js (который не включает ShadowDOM) не работает в IE 11, тогда как webcomponents.js (который включает в себя ShadowDOM) работает нормально. Для нашего варианта использования в проекте мы хотели бы использовать «пользовательские элементы» без ShadowDOM.
В IE выдается ошибка, если мы используем webcomponents-lite.js — SCRIPT5022: Exception thrown and not caught.
Есть ли какое-либо обходное решение?
РЕДАКТИРОВАТЬ: код, который я пытаюсь запустить в IE с webcomponents-lite.js
HTML: <super-button></super-button>
JS (формат ES6):
class SuperBtn extends HTMLElement {
constructor() {
super();
}
createdCallback() {
this.innerHTML = "Invoke Ultron!";
this.addEventListener('click', () => alert(this.textContent ' has been clicked'));
}
}
document.registerElement("super-button", SuperBtn);
Комментарии:
1. что вы подразумеваете под синтаксисом ES6? Вы можете использовать пользовательские элементы без DOM, используя webcomponents.js в любом случае.
2. да, я имел в виду
class
обозначения. Он работает с webcomponents.js но не с webcomponents-lite.js3. Я добавил проблему в репозиторий web components на github (более усовершенствованным способом). Пожалуйста, посмотрите — github.com/webcomponents/webcomponentsjs/issues/631 .
4. Хорошо, я вижу, что вы используете транспилятор. Я думал, вы используете только JS в браузере. Вы пробовали без super или без конструктора?
5. удаление
super()
илиconstructor
не помогает._inherits()
Метод добавляется из транспилятора при использованииextends
, который нам, очевидно, нужен для HTMLElement. Здесь HTMLElement возвращается как Object вместо function, что, кстати_inherits()
, ожидается методом
Ответ №1:
Да, вы можете объявить пользовательский элемент v1 с оригинальной prototype
нотацией.
Это работает с другим полизаполнением из веб-отражения:
var CEo = function ()
{
console.log( "created" )
return Reflect.construct( HTMLElement, [], CEo )
}
CEo.prototype = Object.create( HTMLElement.prototype )
CEo.prototype.constructor = CEo
CEo.prototype.connectedCallback = function ()
{
console.log( "connected" )
this.innerHTML = "Hello v1"
}
customElements.define( "object-v1", CEo )
Примечание: вам нужно будет использовать полиполнение, подобное методу Babel to get Reflect.construct
.