2010-08-12 11 views
7

Sto provando ad aggiungere alcuni elementi jQuery a Gmail usando uno script GreaseMonkey. L'aggiunta della funzionalità jQuery funziona correttamente, ma il problema è che non riesco a rilevare quando Gmail ha terminato il caricamento.Rileva quando Gmail ha terminato il caricamento usando jQuery e GreaseMonkey

Questo è fondamentalmente ciò che accade:

  1. rinfresco Gmail
  2. La finestra di caricamento inizia
  3. Lo script GM inizia per 3 volte, durante la finestra di caricamento
  4. Qualcosa nella finestra di caricamento cambia
  5. Lo script GM inizia ancora una volta
  6. La pagina cambia
  7. Lo script GM avvia per l'ultima volta
  8. Gmail vista carichi e termina

A questo punto un gruppo di JavaScript è stato caricato nel DOM che, probabilmente, invita alcune funzioni che utilizzano AJAX per caricare il resto della vista.

Mi piacerebbe che jQuery facesse roba dopo il passaggio 8, quando tutto ha finito di caricare.

Qualcuno sa come fare/rilevare questo?

risposta

5

In primo luogo, puoi urlare a Google per correggere l'API gmail-greasemonkey, che sembra interrompersi di più ogni giorno. Nello specifico, registerViewChangeCallback() faciliterebbe una soluzione ma sembra che abbia smesso di funzionare correttamente.

Una soluzione alternativa consiste nel ritardare l'attivazione delle modifiche al documento principale. Il seguente codice sembra funzionare per me, su Firefox. Potrebbe essere necessario modificare i contenuti di 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

Sembra funzionare finora! Grazie. E sì, l'API sarebbe un modo migliore. Speriamo che riescano a resuscitarlo un giorno. – Alec

Problemi correlati