Подтвердить что ты не робот

Можно ли использовать селекторы jQuery с наблюдателями-мутациями DOM?

HTML5 включает в себя концепцию "наблюдателей мутации" для мониторинга изменений в DOM браузера.

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

Но когда вы пишете код для взаимодействия с сторонним сайтом, над которым у вас нет контроля, скажите с помощью Greasemonkey script или пользователя Google Chrome script, вам нужно проверить дерево элементов, которые были переданы, чтобы найти какая информация относится к вам.

Это намного проще с селекторами, так же как работать с любым DOM, чем ходить по дереву вручную, особенно для кросс-браузера.

Есть ли способ использовать селектора jQuery с данными, переданными обратным вызовам наблюдателя-мутанта HTML5?

4b9b3361

Ответ 1

Да, вы можете использовать селектора jQuery для данных, возвращаемых для обратных вызовов наблюдателей-мутаций.

См. этот jsFiddle.

Предположим, что у вас был HTML-код:

<span class="myclass">
    <span class="myclass2">My <span class="boldly">vastly</span> improved</span>
    text.
</span>


И вы устанавливаете наблюдателя, например:

var targetNodes         = $(".myclass");
var MutationObserver    = window.MutationObserver || window.WebKitMutationObserver;
var myObserver          = new MutationObserver (mutationHandler);
var obsConfig           = { childList: true, characterData: true, attributes: true, subtree: true };

//--- Add a target node to the observer. Can only add one node at a time.
targetNodes.each ( function () {
    myObserver.observe (this, obsConfig);
} );

function mutationHandler (mutationRecords) {
    console.info ("mutationHandler:");

    mutationRecords.forEach ( function (mutation) {
        console.log (mutation.type);

        if (typeof mutation.removedNodes == "object") {
            var jq = $(mutation.removedNodes);
            console.log (jq);
            console.log (jq.is("span.myclass2"));
            console.log (jq.find("span") );
        }
    } );
}

Вы заметите, что мы можем jQuery на mutation.removedNodes.


Если вы запустите $(".myclass").html ("[censored!]"); с консоли, вы получите это из Chrome и Firefox:

mutationHandler:
childList
jQuery(<TextNode textContent="\n ">, span.myclass2, <TextNode textContent="\n text.\n ">)
true
jQuery(span.boldly)

который показывает, что вы можете использовать обычные методы выбора jQuery для возвращаемых наборов node.

Ответ 2

У меня нет персональных фрагментов кода для этого, но у меня есть три ресурса, которые могут помочь:

Пример из библиотеки ссылок # 3 'jquery-mutation-summary':

// Use document to listen to all events on the page (you might want to be more specific)
var $observerSummaryRoot = $(document);

// Simplest callback, just logging to the console
function callback(summaries){
    console.log(summaries);
}

// Connect mutation-summary
$observerSummaryRoot.mutationSummary("connect", callback, [{ all: true }]);

// Do something to trigger mutationSummary
$("<a />", { href: "http://joelpurra.github.com/jquery-mutation-summary"}).text("Go to the jquery-mutation-summary website").appendTo("body");

// Disconnect when done listening
$observerSummaryRoot.mutationSummary("disconnect");

Ответ 3

Я работал над очень похожей проблемой для Stack Exchange script, над которой я работаю, и мне нужно было контролировать DOM для изменений. Документы jQuery не имели ничего полезного, но я обнаружил, что событие DOMNodeInserted работает в Chrome:

document.addEventListener("DOMNodeInserted", function(event){
    var element = event.target;

    if (element.tagName == 'DIV') {
        if (element.id == 'seContainerInbox') {
            //alert($('#seContainerInbox').parent().get(0).tagName);
            trimStoredItems();
            $('#seTabInbox').click();
            //   var newCount = getNewCount();
            // if there are new inbox items, store them for later
            storeNewInboxItems();
            applyNewStyleToItems();
        }
    }
});

Я не уверен на 100%, если это работает в Firefox, поскольку я еще не получил этого еще в процессе разработки. Надеюсь, это поможет!

Ответ 4

Я знаю, что это старый вопрос, но, возможно, это может помочь другим в поиске альтернативных решений. Недавно я узнал о Mutation Observers и хотел поэкспериментировать с их использованием вместе с jQuery. Я придумал два возможных подхода и превратил их в плагины. Код доступен здесь.

В первом подходе (jquery.observeWithEvents.js) используется функция jQuery trigger() для запуска события insertNode или removeNode, которое может быть связано с помощью функции jQuery on(). Второй подход (jquery.observeWithCallbacks.js) использует традиционные параметры обратного вызова. Пожалуйста, взгляните на README для примеров и использования.