В последнее время я работаю с пользовательскими элементами HTML5 и наткнулся на неприятную проблему. Учитывая следующее тело HTML во всех примерах:
<body>
<h2>Foo elements.</h2>
<foo-element>One!</foo-element>
<foo-element>Two!</foo-element>
</body>
И вот этот скрипт, прикрепленный к шапке страницы для регистрации пользовательского элемента:
var HTMLFooElement = document.registerElement('foo-element', {
prototype: Object.create(HTMLDivElement.prototype, {
createdCallback: { value: function() {
console.log('[CALLBACK] created: ', this);
}},
attachedCallback: { value: function() {
console.log('[CALLBACK] attached: ', this);
}}
})
});
Приложение будет работать, как и ожидалось, на Chromium версии 41.0.2272.76: объявленные пользовательские элементы будут вызывать оба обратных вызова, выводя в консоль 4 строки.
[CALLBACK] created: <foo-element>One!</foo-element>
[CALLBACK] attached: <foo-element>One!</foo-element>
[CALLBACK] created: <foo-element>Two!</foo-element>
[CALLBACK] attached: <foo-element>Two!</foo-element>
Но теперь у меня был такой вариант использования, когда я должен отложить определение attachedCallback
на будущее:
var HTMLFooElement = document.registerElement('foo-element', {
prototype: Object.create(HTMLDivElement.prototype, {
createdCallback: { value: function() {
console.log('[CALLBACK] created: ', this);
}},
})
});
HTMLFooElement.prototype.attachedCallback = function() {
console.log('[CALLBACK] attached: ', this);
};
Оказывается, эта версия не будет запускать attachedCallback
, и "прикрепленные" строки журнала не будут напечатаны (jsfiddle) . На данный момент функция, безусловно, будет во всех моих пользовательских элементах в качестве члена, поскольку весь код был выполнен до того, как была обработана body
часть DOM. И независимо от этого результат один и тот же при создании и добавлении новых элементов в JavaScript после загрузки документа.
Меня сбивает с толку то, что поздние определения обратного вызова жизненного цикла после регистрации пользовательского тега не применяются. Что я должен сделать, чтобы определить обратный вызов жизненного цикла после вызова registerElement
и действительно сделать его эффективным?
registerElement()
- person wahwahwah   schedule 24.03.2015