使用jQuery和GreaseMonkey检测Gmail何时完成加载

时间:2010-08-12 21:02:19

标签: jquery gmail greasemonkey

我正在尝试使用GreaseMonkey脚本向Gmail添加一些jQuery内容。添加jQuery功能工作正常,但问题是我无法真正检测到Gmail何时完成加载。

这基本上就是这样:

  1. 我刷新Gmail
  2. 加载窗口启动
  3. 在加载窗口期间,GM脚本启动3次
  4. 加载窗口中的某些内容发生了变化
  5. GM脚本再次启动
  6. 页面更改
  7. GM脚本最后一次启动
  8. Gmail视图加载和完成
  9. 此时已经将一堆JavaScript加载到DOM中,这些JavaScript可能会调用一些使用AJAX来加载视图其余部分的函数。

    我希望jQuery在步骤8之后做一些事情,当一切都已完成加载时。

    有谁知道怎么做/检测这个?

1 个答案:

答案 0 :(得分:5)

首先,你可以向谷歌大吼大叫,修复他们的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.');
}