Я пытаюсь добавить некоторый материал jQuery к Gmail с помощью сценария GreaseMonkey. Добавление функциональности jQuery хорошо работает, но проблема состоит в том, что я не могу действительно обнаружить, когда Gmail закончил загружаться.
Это в основном, что происходит:
В этой точке набор JavaScript был загружен в DOM, который, вероятно, обращается к некоторым функциям, которые используют Ajax для загрузки остальной части представления.
Я хотел бы за jQuery сделать материал после шага 8, когда все закончило загружаться.
Кто-либо знает, как/обнаружить это?
Во-первых, вы можете кричать на 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.');
}