Запрос 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
Несколько лет спустя, теперь официально существует лучшее решение. Наблюдатели мутации 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 года; вы можете проверить спецификации на наличие изменений.)
Редактировать
Этот ответ устарел. См. Ответ апсиллеров .
Так как это расширение Chrome, вы можете также использовать стандартное событие DOM - DOMSubtreeModified
. Смотрите поддержку этого события во всех браузерах. Он поддерживается в Chrome с 1.0.
$("#someDiv").bind("DOMSubtreeModified", function() {
alert("tree changed");
});
См. Рабочий пример здесь .
Другой подход в зависимости от того, как вы меняете 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.
В дополнение к «необработанным» инструментам, предоставляемым 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);
}
Многие сайты используют AJAX для динамического добавления / показа / изменения контента. Иногда он используется вместо навигации внутри сайта, поэтому текущий URL-адрес изменяется программно, и в этом случае браузер не выполняет автоматически скрипты содержимого, поскольку страница не извлекается полностью с удаленного сервера.
MutationObserver ( документы ) для буквального обнаружения изменений DOM:
Прослушиватель событий для сайтов, которые сигнализируют об изменении содержимого путем отправки события DOM:
pjax:end
на document
используется многие сайты на основе pjax, например GitHub, message
на window
, например, используемый. Поиск Google в браузере Chrome, spfdone
в document
, используемом Youtube, Периодическая проверка DOM через setInterval :
Очевидно, что это будет работать только в тех случаях, когда вы ожидаете появления определенного элемента, идентифицируемого его идентификатором / селектором, и не позволит вам универсально обнаруживать новый динамически добавляемый контент, если вы не изобретаете какой-либо метод снятия отпечатков пальцев с существующего содержимого. .
Скрытие History API внутри внедренного сценария DOM :
document.head.appendChild(document.createElement('script')).text = '(' +
function() {
// injected DOM script is not a content script anymore,
// it can modify objects and functions of the page
var _pushState = history.pushState;
history.pushState = function(state, title, url) {
_pushState.call(this, state, title, url);
window.dispatchEvent(new CustomEvent('state-changed', {detail: state}));
};
// repeat the above for replaceState too
} + ')(); this.remove();'; // remove the DOM script element
// And here content script listens to our DOM script custom events
window.addEventListener('state-changed', function(e) {
console.log('History state changed', e.detail, location.hash);
doSomething();
});
] Прослушивание hashchange , popstate событий:
window.addEventListener('hashchange', function(e) {
console.log('URL hash changed', e);
doSomething();
});
window.addEventListener('popstate', function(e) {
console.log('State changed', e);
doSomething();
});
[1135]
Существует расширенный 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();
}
});