Напоследък работя с персонализирани елементи на 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