как узнать, когда смена динамической страницы полностью загружена (из юзерскрипта)?

На facebook.com, когда нажатие на ссылку появляется для загрузки новой страницы, но (я полагаю) на самом деле просто обновляет существующую страницу с новым кодом, как я могу узнать, когда это новое содержимое полностью загружен? Например, когда вы переходите на facebook.com, вы начинаете со своей «домашней» страницы (новостной ленты). Когда вы нажимаете на свое имя на панели навигации, вы попадаете на facebook.com/yourname. Однако на самом деле это не новая страница, так как пользовательский скрипт не перезагружается.

Из-за этого я написал небольшой чекер для своего пользовательского скрипта, который следит за изменением текущего href страницы:

var startURL;
var curURL;

function main() {
    startURL = window.location.href;
    console.log("initial page. src: "+startURL);
    setInterval(checkfornewpage, 500);
}

function checkfornewpage() {
    curURL = window.location.href;

    if(curURL != startURL) {
        console.log("new page. src: "+curURL);
        // do something
        startURL = curURL;
    }
}

main();

Это отлично работает и уведомляет меня, когда страница изменилась. Но при попытке затем получить доступ к элементам на этой новой странице я обнаружил, что возвращаюсь со старой страницы. Я предполагаю, что это связано с тем, что хотя window.location.href изменился, остальная часть страницы загружена не полностью.

Тогда я решил поискать какой-нибудь контент на новой странице, который, как я знаю, изменится, чтобы понять, полностью ли загружен новый контент. Я выбрал классы тега body, потому что список классов для body всегда отличается на каждой новой странице. Я написал функцию для наблюдения за этим, но даже после того, как список классов body полностью изменился, мои запросы по-прежнему выводят старые данные страницы.

Я также пытался вызвать load() для элемента body, но это никогда не срабатывает.

Я не хочу использовать какой-то общий setTimeout, который просто ждет достаточно долго... Я хочу точно знать, когда он загружается, чтобы я мог двигаться вперед немедленно. Идеи?


person mix    schedule 15.06.2012    source источник
comment
Это для пользовательских скриптов Chrome, верно? (У меня есть для этого код FF Greasemonkey, но я еще не перенес его в браузер GrabAll.)   -  person Brock Adams    schedule 16.06.2012
comment
я хочу, чтобы это работало на обоих, но да, я нацелен на хром прямо сейчас   -  person mix    schedule 16.06.2012
comment
Брок, буду признателен за любые подсказки о том, как вы это сделали в FF. Я продолжаю пробовать всевозможные проверки нового контента, но пока ничего не надежно.   -  person mix    schedule 16.06.2012
comment
Используйте утилиту the waitForKeyElements(), аналогичную этому ответу (и другим). При желании можно запустить событие hashchange, но это, вероятно, не обязательно. ... ... Наконец, ваши последние три вопроса кажутся дубликатами. Вы можете удалить один или два и отредактировать выживших, чтобы модератор не ударил вас.   -  person Brock Adams    schedule 16.06.2012
comment
Спасибо за лиды. и точка зрения на обманщиков ... не собиралась переписывать один и тот же вопрос ... в тот момент они казались другими и более развитыми, чем сейчас. я удалил один и попросил удалить другой, так как этот кажется более точным, чем те два.   -  person mix    schedule 16.06.2012