我正在構建一個簡單的自定義元素,使用custom elements polyfill。我已經註冊了一個屬性「被監視」(使用observedAttributes()
),當我改變這個屬性的值時,函數attributeChangedCallback
被調用兩次。爲什麼attributeChangedCallback調用兩次?
下面是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
以下日誌:
[my component]屬性foo從bar變成baz
[我的組件]屬性FOO從酒吧改爲巴茲
爲什麼attributeChangedCallback
調用兩次?我怎樣才能避免它?
這個例子中的的jsfiddle是在這裏:https://jsfiddle.net/czo1355c/
感謝。
我得到兩個變化,但從null - > bar,然後在你的JSFiddle例子中bar - > baz。 – Tom
的確如此,但是 - 正如我在對@ ikram-shah答案的評論中所解釋的,問題似乎在polyfill上。 Chrome v54 +本身就實現了'customElements',所以不使用polyfill,並且該函數只被調用一次。 – romaintaz