Сценарий Greasemonkey не выполняется при использовании необычной загрузки контента - PullRequest
2 голосов
/ 20 мая 2010

Я пытаюсь написать сценарий Greasemonkey для Facebook, и у меня возникают некоторые проблемы с загружаемой загрузкой страниц / контента, которую они делают (я не совсем понимаю - многие ссылки на самом деле просто меняют GET, но Я думаю, что они делают какое-то перенаправление на сервер, чтобы URL тоже выглядел одинаково для браузера?). По сути, единственный необходимый тест - это поставить GM_log() самостоятельно в сценарии. Если вы щелкнете по Facebook, даже с шаблоном facebook.com/*, он часто не выполняется. Могу ли я что-нибудь сделать, или в «Greasemonkey» исправлена ​​идея «загрузки страницы», и FB «обманывает» ее, не используя один URL?

Если я попытаюсь выполнить некоторые базовые манипуляции с контентом, например:

    GM.log("starting");
    var GM_FB=new Object;
    GM_FB.birthdays = document.evaluate("//div[@class='UIUpcoming_Item']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    for (i = GM_FB.birthdays.snapshotLength - 1; i >= 0; i--) {
       if (GM_FB.birthdayRegex.test(GM_FB.birthdays.snapshotItem(i).innerHTML)) {
          GM_FB.birthdays.snapshotItem(i).setAttribute('style','font-weight: bold; background: #fffe88');
       }
    }

Результатом является то, что иногда только ручное обновление страницы будет работать. Вытягивание консоли Firebug и принудительное выполнение кода работает нормально. Обратите внимание, что это происходит не из-за поздней загрузки определенных частей DOM: я добавил код позже, чтобы дождаться соответствующих элементов и , что принципиально, сообщение никогда не регистрируется для определенных переходов. Например, когда я переключаюсь с сообщений на ленту новостей и обратно.

1 Ответ

3 голосов
/ 20 мая 2010

Разве они не используют ajax для загрузки контента в div ?Вы можете найти элемент, который обновляется, например, с помощью Firebug .

Когда вы что-то щелкаете, и URL меняется, но с URL-адресом # и после этого некоторого текста, это означает, что текст - это не путь, это параметр, браузер не изменит вашу страницу, поэтому, поскольку GreaseMonkey внедряет скрипт на страницу, он загружается, поэтому не будет вводиться снова, потому что страница не перезагружается.Как в вашем примере, URL facebook.com/#!/sk=messages не перемещается от facebook.com/, он не вызовет событие window.load.Таким образом, вам нужно найти, какой элемент изменяется, и добавить прослушиватель событий для этого элемента. Вы можете использовать Firebug, как я упоминал ранее.

После того, как вы узнаете, какой элемент получает контент, вы должныдобавьте прослушиватель событий к этому элементу, а не к странице (GreaseMonkey добавляет только к событию загрузки окна).

Таким образом, в вашем GM-сценарии у вас будет ("код воздуха")

document.getElement('dynamic_div').addEvent('load', /*your script*/);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...