2010-01-13 3 views
2

Je dois l'utiliser dans mon extension firefox. J'ai déjà essayé l'écouteur d'événement window.onload, et vérifiez si l'url courante == old url, et c'est une bonne idée, mais ça ne marche pas quand la page charge le pdf.Comment puis-je vérifier si l'URL de l'onglet actuel du navigateur est modifiée?

J'ai vu la fonction de hachage changé aussi, mais cela ne fonctionne qu'avec ff 3.6; Je ai besoin de travailler au moins avec ff 3.

Donc, j'ai besoin d'un écouteur d'événement qui vérifie si document.location change.

Merci

Répondre

2

Par exemple, vous pouvez utiliser:

var mainWindow = window 
    .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
    .getInterface(Components.interfaces.nsIWebNavigation) 
    .QueryInterface(Components.interfaces.nsIDocShellTreeItem).rootTreeItem 
    .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
    .getInterface(Components.interfaces.nsIDOMWindow); 

mainWindow.getBrowser().addEventListener("DOMContentLoaded", 
         your_function, false); 

Mais, le point est, vous devez ajouter l'auditeur au navigateur, pas la fenêtre.

EDIT
Voir https://developer.mozilla.org/En/Code_snippets/Tabbed_browser pour plus d'informations sur l'accès au navigateur de contextes différents, ainsi que d'autres informations utiles.

EDIT
Juste pour ajouter un peu plus de détails ....

function your_function(event) { 
    if (event.originalTarget instanceof HTMLDocument) { 
    var doc = event.originalTarget; 
     // if it's just a frame element, then return and wait for the 
     // main event to fire. 
     if (event.originalTarget.defaultView.frameElement) 
      return; 

     // now you can use doc.location however you want 
    } 
} 

Notez que cela répondra aux pages dans un onglet ouvert, pas un onglet spécifique.


Pour un onglet spécifique, vous pouvez utiliser quelque chose comme ceci:

var newTabBrowser = gBrowser.getBrowserForTab(gBrowser.addTab("http://www.google.com/")); 
newTabBrowser.addEventListener("load", function() { 
    newTabBrowser.contentDocument.body.innerHTML = "<div>hello world</div>"; 
}, true); 

adds ci-dessus un nouvel onglet et ajoute ensuite un auditeur. Cependant, pour tous les onglets, vous aurez besoin de quelque chose comme ce qui suit. Et puis ajoutez l'écouteur d'événement "DOMContentLoaded" sur chaque onglet lorsqu'il est ajouté (et supprimé lorsqu'il est fermé).

Vous pouvez aussi voir: https://developer.mozilla.org/En/Code_snippets/Tabbed_browser#Notification_when_a_tab_is_added_or_removed et https://developer.mozilla.org/En/Code_snippets/Tabbed_browser#Getting_document_of_currently_selected_tab

(pour la conservation)

function exampleTabAdded(event) { 
    var browser = gBrowser.getBrowserForTab(event.target); 
    // browser is the XUL element of the browser that's been added 
} 

function exampleTabMoved(event) { 
    var browser = gBrowser.getBrowserForTab(event.target); 
    // browser is the XUL element of the browser that's been moved 
} 

function exampleTabRemoved(event) { 
    var browser = gBrowser.getBrowserForTab(event.target); 
    // browser is the XUL element of the browser that's been removed 
} 

// During initialisation 
var container = gBrowser.tabContainer; 
container.addEventListener("TabOpen", exampleTabAdded, false); 
container.addEventListener("TabMove", exampleTabMoved, false); 
container.addEventListener("TabClose", exampleTabRemoved, false); 

// When no longer needed 
container.removeEventListener("TabOpen", exampleTabAdded, false); 
container.removeEventListener("TabMove", exampleTabMoved, false); 
container.removeEventListener("TabClose", exampleTabRemoved, false); 

Cela devrait vous obtenir 99% du chemin.

+0

Merci Jonathan. La fonction que vous avez écrite semble être correcte, mais le problème est que lorsque je charge un pdf, l'événement DOMContentLoaded ne se déclenche pas, donc ni le reste du code .. La meilleure solution devrait être d'ajouter un eventListener à un élément de navigateur qui contrôle l'URL, mais je ne sais pas comment –

+1

l'événement DOMContentLoaded se déclenche uniquement sur les types MIME qui ont un DOM (par exempleHTML ou XUL). Voulez-vous spécifiquement écouter un PDF en cours de chargement? d'un domaine spécifique? Vous pouvez regarder https://developer.mozilla.org/en/Observer_Notifications et spécifiquement 'http-on-examine-response'. Et aussi voir http://www.ashita.org/howto-xhr-listing-by-a-firefox-addon/ pour un exemple de traitement de notification d'observateur –

+0

Merci Jonathan, vous me mettez sur la bonne voie. Maintenant avec http-on-examine-réponse je peux obtenir des événements de la demande de page et vérifier si l'URL de la page est changée, et bien sûr cela fonctionne aussi avec pdf. Mais je dois aussi vérifier l'historique avant et après, car ils ne font pas de requête http. Il n'y a vraiment pas d'autre moyen de vérifier seulement l'événement de demande de page, par ex. l'événement qui devrait être tiré quand j'écris une URL sur ma barre de navigation de firefox et presse entrer?! –

3

Ajoutez un Progress Listener et surveillez les modifications d'emplacement à l'intérieur de l'onglet. Cover swithches onglet avec Addon SDK.

Pour installer un écouteur, convertissez l'onglet SDK en sa représentation brute (ancienne) à l'aide de viewFor. La conversion vers l'arrière est possible avec modelFor et getTabForContentWindow.

const tabs = require("sdk/tabs"); 
const {viewFor} = require('sdk/view/core'); 
const {modelFor} = require('sdk/model/core'); 
const {getBrowserForTab, getTabForContentWindow} = require("sdk/tabs/utils"); 
const {Ci, Cu} = require("chrome"); 
Cu.import("resource://gre/modules/XPCOMUtils.jsm", this); 

var progressListener = { 
QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebProgressListener, Ci.nsISupportsWeakReference]), 
    onLocationChange: function(aProgress, aRequest, aURI) { 
     var highLevel= modelFor(getTabForContentWindow(aProgress.DOMWindow)); 
     console.log("onLocationChange ", highLevel.url); 
    } 
}; 

tabs.on('open', function(newTab) { 
    var lowLevel = viewFor(newTab); 
    var browser = getBrowserForTab(lowLevel); 
    browser.addProgressListener(progressListener); 
}); 

Inspirée par Converting to chrome windows

Questions connexes