Я не думаю, что это возможно с MutationObserver
. Ничто в MutationRecord не предоставляет нового значения, и поскольку MuationObserver выполняется в микрозадаче, а не полностью синхронно после изменения, значение, которое можно извлечь из элемента внутри наблюдателя обратный вызов, возможно, был изменен после изменения, которое вызвало наблюдателя, как вы видите.
const observer = new MutationObserver(records => {
for (const record of records) {
if (record.type !== 'attributes') continue
console.log(div.dataset.foo);
console.log(record);
}
});
observer.observe(div, { attributes: true });
div.setAttribute('data-foo', 'foo');
div.setAttribute('data-foo', 'bar');
<div id="div"></div>
Хотя это возможно при использовании синхронного наблюдателя (прослушайте событие DOMAttrModified
на элементе), они устарел и медленен.
Если вы знаете, как атрибут будет изменен, вы могли бы пропатчить этот метод, чтобы он сначала прошел через вашу собственную logi c. Например, с setAttribute
:
div.setAttribute = (...args) => {
console.log(`Setting ${args[0]} from ${div.getAttribute(args[0])} to ${args[1]}`);
return HTMLElement.prototype.setAttribute.apply(div, args);
};
div.setAttribute('data-foo', 'foo');
div.setAttribute('data-foo', 'bar');
<div id="div"></div>