2010-08-12 9 views
7

Estoy tratando de agregar algo de jQuery a Gmail usando un script de GreaseMonkey. Agregar la funcionalidad de jQuery funciona bien, pero el problema es que realmente no puedo detectar cuándo Gmail ha terminado de cargarse.Detecta cuando Gmail ha terminado de cargarse usando jQuery y GreaseMonkey

Esto es básicamente lo que sucede:

  1. restauro Gmail
  2. La ventana de carga comienza
  3. El guión GM comienza 3 veces, durante la ventana de carga
  4. Algo en la ventana de carga cambia
  5. El script GM se inicia una vez más
  6. La página cambia
  7. El guión GM comienza por última vez
  8. Gmail visión cargas y termina

En este punto, un montón de JavaScript se ha cargado en el DOM que llama, probablemente, en algunas funciones que utilizan AJAX para cargar el resto de la vista.

Me gustaría que jQuery haga las cosas después de paso 8, cuando todo haya terminado de cargarse.

¿Alguien sabe cómo hacer/detectar esto?

Respuesta

5

Primero, puedes gritarle a Google para arreglar su API gmail-greasemonkey, que parece romperse más cada día. Específicamente, registerViewChangeCallback() facilitaría una solución pero parece haber dejado de funcionar correctamente.

Una solución alternativa sería retrasar el encendido de los cambios del documento principal. El siguiente código parece para que funcione para mí, en Firefox. Puede necesitar ajustes para el contenido de 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

Parece estar trabajando hasta ahora! Gracias. Y sí, la API sería una mejor manera. Con suerte, resucitarán eso algún día. – Alec

Cuestiones relacionadas