2010-08-12 12 views
7

Próbuję dodać trochę rzeczy jQuery do Gmaila za pomocą skryptu GreaseMonkey. Dodanie funkcjonalności jQuery działa dobrze, ale problem polega na tym, że naprawdę nie mogę wykryć, kiedy Gmail został załadowany.Wykryj, kiedy Gmail zakończył ładowanie za pomocą jQuery i GreaseMonkey

To jest w zasadzie to, co się dzieje:

  1. odświeżam Gmail
  2. Okno ładowania rozpoczyna
  3. Skrypt GM rozpoczyna się 3 razy, podczas okna załadunku
  4. Coś w oknie ładowania zmienia
  5. Skrypt GM rozpoczyna się jeszcze raz
  6. Strona zmienia
  7. Skrypt GM rozpoczyna się po raz ostatni
  8. Gmail zobacz obciążeń i kończy

W tym momencie grono JavaScript został załadowany do DOM że prawdopodobnie wzywa niektórych funkcji, które używają AJAX załadować resztę widoku.

Chciałbym dla jQuery robić rzeczy po kroku 8, kiedy wszystko zakończeniu ładowania.

Czy ktoś wie, jak to zrobić/wykryć?

Odpowiedz

5

Po pierwsze, możesz krzyczeć na Google, aby poprawić ich interfejs API gmail-greasemonkey - który wydaje się łamać więcej każdego dnia. W szczególności, registerViewChangeCallback() może ułatwić rozwiązanie, ale wydaje się, że przestał działać poprawnie.

Obejście problemu polegałoby na opóźnieniu zwolnienia głównych zmian w dokumencie. Poniższy kod wydaje się być do pracy dla mnie, w Firefoksie. Może wymagać ulepszenia zawartości 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

Wydaje się działać do tej pory! Dzięki. I tak, API byłby lepszy sposób. Mam nadzieję, że pewnego dnia wrócą. – Alec