Я строю простой пользовательский элемент, используя custom elements polyfill. Я зарегистрировал атрибут «смотрел» (используя observedAttributes()
), и когда я изменяю значение этого атрибута, функция attributeChangedCallback
вызывается дважды.Почему атрибутChangedCallback называется дважды?
Вот HTML код:
<my-component id="compo" foo="bar"></my-component>
<button id="myBtn">Change attribute value</button>
Вот мое определение компонента:
class MyComponent extends HTMLElement {
constructor() {
super();
}
static get observedAttributes() {
return ['foo'];
}
attributeChangedCallback(attrName, oldVal, newVal) {
console.log('[my component] attribute', attrName, 'changed from', oldVal, 'to', newVal);
}
}
window.customElements.define('my-component', MyComponent);
// Change value of the component attribute
$('#myBtn').click(() => $('#compo').attr('foo', 'baz'));
На этой странице, когда я нажимаю на кнопку, у меня есть следующие журналы в console.log
:
[мой компонент] атрибут Foo изменен из бара в БАЗ
[мой компонент] атрибут Foo изменен из бара в БАЗ
Почему attributeChangedCallback
вызывается дважды? Как я могу избежать этого?
JSFiddle этого примера здесь: https://jsfiddle.net/czo1355c/
Спасибо.
я получаю два изменения, но от null -> bar, а затем bar -> baz в примере JSFiddle. – Tom
действительно, но - как объясняется в моем комментарии к @ ikram-shah, проблема, похоже, на полиполке. Chrome v54 + реализует 'customElements' изначально, поэтому polyfill не используется, и функция вызывается только один раз. – romaintaz