Есть слушатель изменения DOM JavaScript / jQuery?

Запрос MSSQL

select datetable.Date 
from (
    select DATEADD(day,-(a.a + (10 * b.a) + (100 * c.a)),getdate()) AS Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
     union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a

    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
     union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b

    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4
     union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) datetable
where datetable.Date between '2014-01-20' and '2014-01-24' 
order by datetable.Date DESC

Выход

Date
-----
2014-01-23 12:35:25.250
2014-01-22 12:35:25.250
2014-01-21 12:35:25.250
2014-01-20 12:35:25.250
366
задан Mike B. 6 March 2019 в 18:23
поделиться

5 ответов

Несколько лет спустя, теперь официально существует лучшее решение. Наблюдатели мутации DOM4 являются заменой устаревших событий мутации DOM3. Они в настоящее время реализованы в современных браузерах как MutationObserver (или как префикс WebKitMutationObserver в старых версиях Chrome):

MutationObserver = window.MutationObserver || window.WebKitMutationObserver;

var observer = new MutationObserver(function(mutations, observer) {
    // fired when a mutation occurs
    console.log(mutations, observer);
    // ...
});

// define what element should be observed by the observer
// and what types of mutations trigger the callback
observer.observe(document, {
  subtree: true,
  attributes: true
  //...
});

В этом примере прослушиваются изменения DOM при document и всего его поддерева, и оно будет запускать изменения атрибутов элемента, а также структурные изменения. Черновик спецификации имеет полный список допустимых свойств прослушивателя мутаций :

childList

  • Устанавливается в true, если следует наблюдать мутации у детей-мишеней.

атрибутов

  • Установите на true, если должны наблюдаться мутации в атрибутах цели.

CharacterData

  • Установите на true, если должны наблюдаться мутации в данных цели.

поддерево

  • Установите на true, если нужно наблюдать мутации не только цели, но и потомков цели.

attributeOldValue

  • Устанавливается в true, если для attributes установлено значение true и значение атрибута цели перед записью мутации.

characterDataOldValue

  • Устанавливается в true, если для characterData установлено значение true и данные цели перед записью мутации.

attributeFilter

  • Устанавливается в список локальных имен атрибутов (без пространства имен), если необходимо наблюдать не все мутации атрибутов.

(Этот список действителен по состоянию на апрель 2014 года; вы можете проверить спецификации на наличие изменений.)

443
ответ дан apsillers 6 March 2019 в 18:23
поделиться

Редактировать

Этот ответ устарел. См. Ответ апсиллеров .

Так как это расширение Chrome, вы можете также использовать стандартное событие DOM - DOMSubtreeModified. Смотрите поддержку этого события во всех браузерах. Он поддерживается в Chrome с 1.0.

$("#someDiv").bind("DOMSubtreeModified", function() {
    alert("tree changed");
});

См. Рабочий пример здесь .

203
ответ дан Bhargav Rao 6 March 2019 в 18:23
поделиться

Другой подход в зависимости от того, как вы меняете div. Если вы используете JQuery для изменения содержимого div с помощью его метода html (), вы можете расширить этот метод и вызывать функцию регистрации каждый раз, когда помещаете html в div.

(function( $, oldHtmlMethod ){
    // Override the core html method in the jQuery object.
    $.fn.html = function(){
        // Execute the original HTML method using the
        // augmented arguments collection.

        var results = oldHtmlMethod.apply( this, arguments );
        com.invisibility.elements.findAndRegisterElements(this);
        return results;

    };
})( jQuery, jQuery.fn.html );

Мы просто перехватываем вызовы html (), вызываем функцию регистрации с этим, которая в контексте относится к целевому элементу, получающему новое содержимое, затем мы передаем вызов исходному jquery.html () функция. Не забудьте вернуть результаты оригинального метода html (), потому что JQuery ожидает его для цепочки методов.

Для получения дополнительной информации о переопределении и расширении метода, проверьте http://www.bennadel.com/blog/2009-Using-Self-Executing-Function-Arguments-To-Override-Core-jQuery-Methods .htm , где я и написал функцию замыкания. Также ознакомьтесь с руководством по плагинам на сайте JQuery.

27
ответ дан Seth Malaki 6 March 2019 в 18:23
поделиться

В дополнение к «необработанным» инструментам, предоставляемым API MutationObserver , существуют «удобные» библиотеки для работы с мутациями DOM.

Рассмотрим: MutationObserver представляет каждое изменение DOM в терминах поддеревьев. Так что, если вы, например, ожидаете вставки определенного элемента, он может быть глубоко внутри дочерних элементов mutations.mutation[i].addedNodes[j].

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

Хорошей удобной библиотекой, которая решает такие проблемы, является mutation-summary (заявление об отказе: я не автор, я просто довольный пользователь), которая позволяет вам задавать запросы на интересующие вас вопросы. и получите именно это.

Пример базового использования из документов:

var observer = new MutationSummary({
  callback: updateWidgets,
  queries: [{
    element: '[data-widget]'
  }]
});

function updateWidgets(summaries) {
  var widgetSummary = summaries[0];
  widgetSummary.added.forEach(buildNewWidget);
  widgetSummary.removed.forEach(cleanupExistingWidget);
}
6
ответ дан Xan 6 March 2019 в 18:23
поделиться

Многие сайты используют AJAX для динамического добавления / показа / изменения контента. Иногда он используется вместо навигации внутри сайта, поэтому текущий URL-адрес изменяется программно, и в этом случае браузер не выполняет автоматически скрипты содержимого, поскольку страница не извлекается полностью с удаленного сервера.


Обычные JS-методы обнаружения изменений страницы доступны в скрипте контента .

<час>

Специфичные расширения: обнаруживать изменения URL на странице фона / страницы события .

Существует расширенный API для работы с навигацией: webNavigation , webRequest , но мы будем использовать простой chrome.tabs.onUpdated прослушиватель событий, который ] отправляет сообщение скрипту содержимого:

  • manifest.json:
    объявляет фон / страница события
    ] объявлять скрипт содержания
    добавить "tabs" разрешение . ​​

  • background.js

    var rxLookfor = /^https?:\/\/(www\.)?google\.(com|\w\w(\.\w\w)?)\/.*?[?#&]q=/;
    chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
        if (rxLookfor.test(changeInfo.url)) {
            chrome.tabs.sendMessage(tabId, 'url-update');
        }
    });
    
  • content.js

    chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
        if (msg === 'url-update') {
            doSomething();
        }
    });
    
40
ответ дан wOxxOm 6 March 2019 в 18:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: