2010-08-12 66 views
7

我想使用GreaseMonkey腳本向Gmail添加一些jQuery的東西。添加jQuery功能可以正常工作,但問題是我無法真正檢測到Gmail加載完成時的情況。當Gmail使用jQuery和GreaseMonkey完成加載時檢測到

這基本上是發生了什麼:

  1. 我重新整理Gmail,
  2. 裝載窗口開始
  3. 的GM腳本啓動3次,加載窗口中
  4. 東西在加載窗口更改
  5. GM腳本再次啓動
  6. 頁面更改
  7. 的GM腳本啓動最後一次
  8. Gmail檢視載荷和完成

在這一點上一堆的JavaScript已經加載到這可能要求在使用AJAX來加載其他一些功能的DOM的看法。

我想爲jQuery做東西第8步,當一切都完成加載。

有誰知道該怎麼做/檢測到這個?

回答

5

首先,你可以在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.'); 
} 
+0

似乎到目前爲止工作!謝謝。而且,API是更好的方法。希望有一天他們會復活。 – Alec 2010-08-23 20:27:00