2010-05-20 4 views
2

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

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

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

ответ

3

Разве они не с помощью 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*/); 
+0

Большинство вещей я проверил выглядели как обычные ссылки, но они добавить материал с параметрами URL GET, а не изменения (то есть его всегда остается как facebook.com/?blahfoo). По какой-то причине я, похоже, не получаю другое исполнение GM, когда это происходит. –

+0

У этого есть '#' на URL? URL страницы может измениться, но не перезагрузит страницу. Нет другого способа сделать это, выполняя скрипты с веб-сайта. – BrunoLM

+0

Может ли перенаправление на серверной стороне также остановить работу GM в этом случае? например загрузить FB fresh, Messages href - facebook.com/?sk=messages, но когда вы нажимаете его, он переходит на facebook.com/#!/sk=messages и GM не запускается. Это объясняет часть проблемы. Конечно, это также возится с моим setTimeout (и я не делаю имя функции как ошибку строки), чтобы проверять наличие элементов. Немного неудобного сайта для скрипта. –