Обновление:
Этот вопрос и ответ очень старый и DOMSubtreeModified
устарел .
Я больше не рекомендую этот подход.Вместо этого см .:
Старый ответ:
Да, поскольку вы используете Firefox, вы можете отключить событие DOMSubtreeModified
.
Для этого сначала оберните часть кода текущего скрипта в функцию;например:
// ==UserScript==
// @name Facebook Fixer
// ==/UserScript==
function LocalMain ()
{
//--- Do all of your actions here.
}
LocalMain (); //-- Fire GM script once, normally.
Далее найдите узел, который содержит недавно загруженные сообщения.Скажем, вы обнаружите, что это div
с идентификатором "All_posts_go_here" (я не пользуюсь Facebook, не забудьте найти правильный узел и не используйте body
, браузер будетот медленного до ползания).
После того, как вы определили правильный узел, вы можете установить прослушиватель событий.Но вам также нужна небольшая задержка, потому что изменения узла происходят сотни раз, и вам нужно подождать, пока текущий пакет не будет сделан.
Итак, собрав все это вместе, код выглядит так:
if (window.top != window.self) //don't run on frames or iframes
return;
function LocalMain ()
{
//--- Do all of your actions here.
}
LocalMain (); //-- Fire GM script once, normally.
var PostsChangedByAJAX_Timer = '';
//--- Change this next line to find the correct element; sample shown.
var PostContainerNode = document.getElementById ('All_posts_go_here');
PostContainerNode.addEventListener ("DOMSubtreeModified", PageBitHasLoaded, false);
function PageBitHasLoaded (zEvent)
{
/*--- Set and reset a timer so that we run our code (LocalMain() ) only
AFTER the last post -- in a batch -- is added. Adjust the time if needed, but
half a second is a good all-round value.
*/
if (typeof PostsChangedByAJAX_Timer == "number")
{
clearTimeout (PostsChangedByAJAX_Timer);
PostsChangedByAJAX_Timer = '';
}
PostsChangedByAJAX_Timer = setTimeout (function() {LocalMain (); }, 555);
}
Остерегайтесь, я предполагаю, что узел не является iframe.Если это так, то может потребоваться другой подход.