Определите, когда Gmail завершил загрузку, используя jQuery и GreaseMonkey. - PullRequest
7 голосов
/ 13 августа 2010

Я пытаюсь добавить некоторые вещи jQuery в Gmail, используя скрипт GreaseMonkey.Добавление функциональности jQuery работает нормально, но проблема в том, что я не могу точно определить, когда Gmail завершил загрузку.

Это в основном то, что происходит:

  1. Я обновляю Gmail
  2. Окно загрузки начинается
  3. Сценарий GM запускается 3 раза, во время окна загрузки
  4. Что-то в окне загрузки меняется
  5. Сценарий GM запускается еще раз
  6. Изменения страницы
  7. Последний раз запускается скрипт GM
  8. Загрузка и завершение просмотра Gmail

На данный момент группа JavaScript имеетбыл загружен в DOM, который, вероятно, вызывает некоторые функции, использующие AJAX для загрузки остальной части представления.

Я бы хотел, чтобы jQuery делал вещи после шага 8, когда все имеетЗакончила загрузку.

Кто-нибудь знает, как это сделать / обнаружить?

1 Ответ

5 голосов
/ 13 августа 2010

Во-первых, вы можете кричать на Google, чтобы исправить их gmail-greasemonkey API - который, кажется, ломается с каждым днем.В частности, registerViewChangeCallback() облегчило бы решение, но, похоже, оно перестало работать правильно.

Обходной путь может заключаться в задержке запуска основных изменений документа.Следующий код , кажется, работает для меня, в Firefox.Возможно, потребуется настроить контент iFrame.

//
// ==UserScript==
// @name            Fire on page finished (with AJAX mods)
// @namespace       Gmail
// @description     This script shows one way to wait for an AJAX-heavy page to load.
// @include         http://mail.google.com/*
// @include         https://mail.google.com/*
// ==/UserScript==
//

if (window.top != window.self)  //don't run on frames or iframes
    return;


var zGbl_PageChangedByAJAX_Timer = '';


window.addEventListener ("load", LocalMain, false);


function LocalMain ()
{
    if (typeof zGbl_PageChangedByAJAX_Timer == "number")
    {
        clearTimeout (zGbl_PageChangedByAJAX_Timer);
        zGbl_PageChangedByAJAX_Timer  = '';
    }

    document.body.addEventListener ("DOMNodeInserted", PageBitHasLoaded, false);
}


function PageBitHasLoaded (zEvent)
{
    if (typeof zGbl_PageChangedByAJAX_Timer == "number")
    {
        clearTimeout (zGbl_PageChangedByAJAX_Timer);
        zGbl_PageChangedByAJAX_Timer  = '';
    }
    zGbl_PageChangedByAJAX_Timer      = setTimeout (function() {HandlePageChange (); }, 666);
}


function HandlePageChange ()
{
    removeEventListener ("DOMNodeInserted", PageBitHasLoaded, false);

    alert ('Page has finished loading.');
}
...