Скрипт Greasemonkey для работы с динамически загружаемыми постами в Facebook - PullRequest
2 голосов
/ 05 мая 2011

Я написал скрипт Greasemonkey, и он влияет на первые загруженные посты в Facebook.но после того, как вы прокрутите вниз ленту новостей, скрипт не будет работать с вновь загруженными сообщениями.

Есть ли способ повторно запустить сценарий для этих сообщений или что-то в этом роде?кто-нибудь может мне помочь?

1 Ответ

7 голосов
/ 05 мая 2011

Обновление:
Этот вопрос и ответ очень старый и 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.Если это так, то может потребоваться другой подход.

...