Как вы получаете трассировку стека для запущенного MutationObserver? - программирование
Подтвердить что ты не робот

Как вы получаете трассировку стека для запущенного MutationObserver?

Во-первых, это не "Как создать наблюдателя мутации"? и я видел API.

Мне было интересно, знает ли кто-нибудь способ показать "источник", когда произошла мутация. Скорее всего, это будет какое-то обходное решение - я не вижу упоминания об этом в документах API.

Я пытаюсь выяснить, где элемент получает свой display в style, установленный в none.

Мой код выглядит следующим образом:

var observer = new MutationObserver(function(mutations) {
    mutations.forEach(function (mutation) {
        if (mutation.attributeName === "style") {
            var extendedMutation = _.extend({}, mutation, {
                newValue: $(mutation.target).attr("style")
            });

            console.log(extendedMutation);
        }
      });
});

observer.observe(row.element[0], { attributes: true, attributeOldValue: true });

У меня есть события мутации сервера, и они выглядят так:

{
    addedNodes: NodeList[]

    attributeName: "style"

    attributeNamespace: null

    newValue: "display: none;"

    nextSibling: null

    oldValue: ""

    previousSibling: null

    removedNodes: NodeList[]

    target: li#d526d311-e6e0-4ef1-a3a1-f8686bbb468f.group

    type: "attributes"

}

Я просто хотел бы знать, где в источнике JS он исходит! Любые идеи?

Обратите внимание, что я попробовал ctrl + f, но безрезультатно.

Отладочный/Исключительный вывод (также проверенный WebkitMutationObserver для Chrome также тот же результат):

http://i.imgur.com/jYeqCPX.png

4b9b3361

Ответ 1

Я знаю, что этот поток довольно старый, но, как и сейчас, инструмент из Chrome для отслеживания асинхронного вызова, я хотел бы упомянуть об этом.

Хронология вызова вызова Async, которая, как я думаю, выполнит обратную трассировку асинхронного вызова. Этот параметр можно найти в вкладке Инструменты разработчика → вкладка "Стек вызовов". И, включив опцию Async и положив точку останова на функцию обратного вызова MutationObserver, мы увидим полный стек вызовов.

Надеюсь, что это поможет.

Ответ 2

API MutationObserver асинхронен, как и Ajax. Рассмотрим пример в Chrome:

var xhr = new XMLHttpRequest();
xhr.open("GET", "/");
xhr.onload = function() { debugger; };
xhr.send();

Как вы, вероятно, знаете, onload не запускается до тех пор, пока текущая функция не будет выполнена. Таким образом, когда вызов debugger в onload выполняется, стек вызовов функции обязательно очищается, а обработчик onload работает в новом стеке.

Вы хотите знать, где происходит мутация свойства, но вы не можете получить эту информацию из трассировки стека - это было бы похоже на попытку узнать, где был вызван xhr.send(), с точки зрения onload обработчик.