custom elements polyfillを使用して、単純なカスタム要素を作成しています。私は属性を登録しています(observedAttributes()
を使用しています)。この属性の値を変更すると、attributeChangedCallback
という関数が2回呼び出されます。ここで attributeChangedCallbackが2回呼び出されるのはなぜですか?
<my-component id="compo" foo="bar"></my-component>
<button id="myBtn">Change attribute value</button>
は私のコンポーネント定義である:ここで
は、HTMLコードである私は、ボタンをクリックすると、そのページに
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
で次のログを持っています:
[my component]属性fooがbarからbazに変更されました
は、[私のコンポーネント]属性fooが
attributeChangedCallback
が2回呼び出され、なぜ
をBAZするバーから変わったのか?どうすればそれを避けることができますか?
この例のJSFiddleはここにある:https://jsfiddle.net/czo1355c/
感謝。
私は2つの変更を取得しますが、あなたのJSFiddleの例では、null - > barからbar - > bazを選択してください。実際には – Tom
ですが、@ ikram-shahの回答に対する私のコメントで説明したように、問題はpolyfillにあるようです。 Chrome v54 +はネイティブに 'customElements'を実装しています。したがって、polyfillは使用されず、関数は一度しか呼び出されません。 – romaintaz