Как я могу обнаружить вставку узла AJAX без использования событий мутации DOM?
Я пытаюсь написать скрипт Greasemonkey, который изменяет ключевые слова в постах Twitter. Проблема в том, что контент "запаздывает" и добавляется по запросу пользователей.
Если бы я добавлял прослушиватели событий к добавленным элементам, я мог бы использовать JQuery delegate()
, Поскольку я просто хочу изменить содержимое при загрузке, это не подходит.
События мутации, кажется, отвечают всем требованиям. Они специфичны для Gecko, но это не имеет большого значения для скрипта Greasemonkey. Проблема в том, что они обесценились и по ряду очень веских причин.
Конечно, я мог бы использовать таймер и опрашивать DOM через регулярные промежутки времени, но это просто кажется странным.
Как я могу обнаружить дополнения к DOM и реагировать на вставленные элементы?
1 ответ
Если вы хотите обнаруживать AJAX-созданные узлы, ваши параметры (помимо событий мутации, которые вы должны исключить):
- Опрос с интервалом или таймером.
- Попытка подключиться к запросам AJAX страницы (если есть).
- Встраивание, угон или замена javascript страницы.
Я сделал все это за один раз, и все, кроме одного, имеют серьезные недостатки:
- Встраивание в javascript страницы не всегда легко (особенно с анонимными функциями), обычно требует сложной деконструкции этого кода и хрупко до чертиков. Javascript страницы изменяется без предварительного уведомления.
- Встраивание запросов AJAX на страницу иногда может быть довольно простым, но передача информации через барьер с песочницей обычно создает больше проблем, чем стоит.
- Работы по опросу чертовски хороши на практике, просты в реализации и обычно дешевы.
Я рекомендую вам использовать утилиту waitForKeyElements() и покончить с ней. Это очень просто в использовании. Например:
// ==UserScript==
// @name Highlight good comments
// @include http://SOME_SITE/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// ==/UserScript==
function highlightGoodComments (jNode) {
if (/beer/i.test (jNode.text () ) ) {
jNode.css ("background", "yellow");
}
}
waitForKeyElements ("#userBlather div.comment", highlightGoodComments);