2009-10-01 6 views
2

J'utilise progresslistener pour surveiller les actions des utilisateurs sur les pages Web, lorsque l'utilisateur clique sur un lien, j'essaie de vérifier si cette requête redirigera l'utilisateur vers le nouvel emplacement ou s'il s'agit d'un Ajax WebHttpRequest uniquement (Il ne rechargera pas ou ne redirigera pas la page). voici le code que je utilise:Comment filtrer les requêtes asynchrones dans ProgressListener?

ProgressListener.prototype = { 
    QueryInterface: function(aIID) 
    { 
     if (aIID.equals(Components.interfaces.nsIWebProgressListener) || 
      aIID.equals(Components.interfaces.nsISupportsWeakReference) || 
      aIID.equals(Components.interfaces.nsISupports) ) { 
      return this; 
     } 
     throw Components.results.NS_NOINTERFACE; 
    }, 

    onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) { 
     if (!aRequest) return 0; 
     if (aFlag & STATE_IS_NETWORK) { 
      if (aFlag & STATE_START && 
       aFlag & STATE_IS_REQUEST && 
       aFlag & STATE_IS_DOCUMENT) { 

       OnLoadInitiated(aWebProgress, aRequest, this.mBrowser); 

      } else if (aFlag & STATE_STOP && 
         aFlag & STATE_IS_WINDOW && 
         aStatus == 0) { 
       OnLoadComplete(aWebProgress, aRequest, this.mBrowser); 
      } 
     } 
     return 0; 
    }, 

    onLocationChange: function(aProgress, aRequest, aURI) 
    { 
     OnLocationChange(aProgress, aRequest, aURI, this.mBrowser); 
     return 0; 
    }, 

    onProgressChange: function(aWebProgress, aRequest, curSelf, maxSelf, curTot, maxTot) { return 0;}, 
    onStatusChange: function(aWebProgress, aRequest, aStatus, aMessage) { return 0;}, 
    onSecurityChange: function(aWebProgress, aRequest, aState) { return 0;} 
} 

function ProgressListener(aBrowser) { 
    this.mBrowser = aBrowser; 
} 

function OnTabOpen(event) { 
    var doc = event.target.linkedBrowser.contentDocument; 
    var win = doc.defaultView; 

    var gsToolbar = new GSToolbar(); 
    gsToolbar.LoadCount = 0; 
    gsToolbar.JustOpenedTab = true; 

    var browser = event.target.linkedBrowser; 
    browser.GSToolbar = gsToolbar; 

    var pListener = new ProgressListener(browser); 
    browser.ProgressListener = pListener; 

    browser.addProgressListener(pListener, NOTIFY_STATE_DOCUMENT); 
} 

function OnTabMove(event) { 
    var browser = event.target.linkedBrowser; 
} 

function OnTabClose(event) { 
    var browser = event.target.linkedBrowser; 

    browser.removeProgressListener(browser.ProgressListener); 
} 

function OnTabSelect(event) { 
    var browser = event.target.linkedBrowser; 

    var gsToolbar = gBrowser.getBrowserForDocument(gBrowser.selectedBrowser.contentDocument).GSToolbar; 

} 

function InitialWindow() { 
    var num = gBrowser.browsers.length; 

    if (num == 1) { 
     var gsToolbar = new GSToolbar(); 
     gsToolbar.LoadCount = 0; 
     gsToolbar.JustOpenedTab = true; 

     var browser = gBrowser.getBrowserAtIndex(0); 
     browser.GSToolbar = gsToolbar; 

     var pListener = new ProgressListener(browser); 
     browser.ProgressListener = pListener; 

     browser.addProgressListener(pListener, NOTIFY_STATE_DOCUMENT); 
    } 

    var container = gBrowser.tabContainer; 
    container.addEventListener("TabOpen", OnTabOpen, false); 
    container.addEventListener("TabMove", OnTabMove, false); 
    container.addEventListener("TabClose", OnTabClose, false); 
    container.addEventListener("TabSelect", OnTabSelect, true); 
} 

function UnloadWindow() { 

    var num = gBrowser.browsers.length; 

    if (num == 1) { 
     var browser = gBrowser.getBrowserAtIndex(0); 
     browser.removeProgressListener(browser.GSProgressListener); 
    } 

    var container = gBrowser.tabContainer; 
    container.removeEventListener("TabOpen", OnTabOpen, false); 
    container.removeEventListener("TabMove", OnTabMove, false); 
    container.removeEventListener("TabClose", OnTabClose, false); 
    container.removeEventListener("TabSelect", OnTabSelect, false); 

} 

window.addEventListener("load", function(e){ InitialWindow();}, false); 
window.addEventListener("unload", function(e){ UnloadWindow();}, false); 

Y at-il drapeau que je devrais vérifier pour OnStateChange et onLocationChange? Merci.

j'ai lu le document, mais j'ai essayé de restreindre la condition AFLAG & STATE_START & & AFLAG & STATE_IS_REQUEST & & AFLAG & STATE_IS_DOCUMENT & & AFLAG & STATE_IS_WINDOW

mais ne pouvait toujours pas filtrer le asynchrone demandes mon but est de m'assurer que ma barre d'outils ne gère que la requête synchrone (qui provoque le rechargement ou la redirection de toute la page) et passe tous les appels asynchrones comme les requêtes Ajax.

Il semble que je doive ajouter une condition à l'événement onStateChange et onLocationChange, mais j'ai essayé peut-être des combinaisons de ces drapeaux, jusqu'à présent, aucun d'entre eux n'atteint l'objectif.

Quelle est la meilleure façon de gérer cela?

Merci beaucoup pour votre aide.

Répondre

3

OK, j'ai reçu une réponse de l'autre endroit.

Comparez DOMwindow.top.location.href et aURI.spec dans onLocationChange, si ceux-ci sont identiques, il s'agit d'un appel synchrone, sinon asynchrone.

Questions connexes