2017-01-18 6 views
3

Я строю простой пользовательский элемент, используя 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/

Спасибо.

+1

я получаю два изменения, но от null -> bar, а затем bar -> baz в примере JSFiddle. – Tom

+1

действительно, но - как объясняется в моем комментарии к @ ikram-shah, проблема, похоже, на полиполке. Chrome v54 + реализует 'customElements' изначально, поэтому polyfill не используется, и функция вызывается только один раз. – romaintaz

ответ

1

Я рассмотрел ваш jsfiddle, и он фактически не вызывается дважды при нажатии кнопки, но сначала вызывается, когда отображается <my-component id="compo" foo="bar"></my-component>, когда вы устанавливаете значение foo; и во-вторых, когда вы нажмете кнопку.

Вы также можете отлаживать его на jsfiddle, с помощью инструментов разработчика и нажмите Ctrl + SHIFT + F найти и отладить функцию.

Screenshot

+0

Спасибо. Я тестировал свой JsFiddle в последней версии Chrome, и действительно, вызов выполняется только один раз. На моем профессиональном компьютере я использую Chrome v53, который ** не реализует customElements (добавлен в v54), поэтому используется полипол и ** там **, вызов выполняется дважды. Так что проблема на полиполке! – romaintaz

Смежные вопросы