2017-01-18 14 views
3

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/

感謝。

+1

私は2つの変更を取得しますが、あなたのJSFiddleの例では、null - > barからbar - > bazを選択してください。実際には – Tom

+1

ですが、@ ikram-shahの回答に対する私のコメントで説明したように、問題はpolyfillにあるようです。 Chrome v54 +はネイティブに 'customElements'を実装しています。したがって、polyfillは使用されず、関数は一度しか呼び出されません。 – romaintaz

答えて

1

私はあなたのjsfiddleを見直しましたが、実際にはボタンクリックで2回呼び出されるのではなく、がレンダリングされたときに最初に呼び出されます。値はfooです。第2に、あなたがボタンをクリックしたときです。

また、開発ツールを使用して、jsfiddleでそれをデバッグ、および機能を見つけてデバッグする + FはCtrl +Shiftキーを押すことができます。

Screenshot

+0

ありがとうございます。私はJsFiddleを最新バージョンのChromeでテストしましたが、実際には1度だけ呼び出しが行われます。私のプロのコンピュータでは、chrome v53を使用しています。**では、customElements(v54で追加)を実装していないので、polyfillが使用され** ** **そこでは呼び出しが2回行われます。だから問題はpolyfillにあります! – romaintaz

関連する問題