Come posso verificare se l'URL della scheda corrente del browser è cambiato?
-
20-09-2019 - |
Domanda
Ne ho bisogno per usarlo nella mia estensione per Firefox.Ho già provato window.onload
ascoltatore di eventi e controlla se l'URL corrente == vecchio URL, ed è una buona idea, ma non funziona quando la pagina carica il PDF.
Ho visto anche la funzione hash modificata ma funziona solo con Firefox 3.6;Ho bisogno che funzioni almeno con Firefox 3.
Quindi, ho bisogno di un ascoltatore di eventi che controlli se document.location
i cambiamenti.
Soluzione
Ad esempio, potresti utilizzare:
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);
Ma il punto è che devi aggiungere il listener al browser, non a window.
MODIFICARE
Vedere https://developer.mozilla.org/En/Code_snippets/Tabbed_browser per informazioni sull'accesso al browser da diversi contesti, oltre ad alcune altre informazioni utili.
MODIFICARE
Giusto per aggiungere qualche dettaglio in più....
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
}
}
Tieni presente che questo risponderà alle pagine aperte in qualsiasi scheda, non in una scheda specifica.
Per una scheda specifica, potresti utilizzare qualcosa del genere:
var newTabBrowser = gBrowser.getBrowserForTab(gBrowser.addTab("http://www.google.com/"));
newTabBrowser.addEventListener("load", function () {
newTabBrowser.contentDocument.body.innerHTML = "<div>hello world</div>";
}, true);
Quanto sopra aggiunge una nuova scheda e quindi aggiunge un ascoltatore.Tuttavia, per tutte le schede, avrai bisogno di qualcosa di simile a quanto segue.Quindi aggiungi il listener di eventi "DOMContentLoaded" su ciascuna scheda quando viene aggiunto (e rimosso quando viene chiuso).
Potresti anche voler vedere: https://developer.mozilla.org/En/Code_snippets/Tabbed_browser#Notification_when_a_tab_is_added_or_removed E https://developer.mozilla.org/En/Code_snippets/Tabbed_browser#Getting_document_of_currently_selected_tab
(Per la conservazione)
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);
Questo dovrebbe portarti al 99% del percorso.
Altri suggerimenti
Aggiungi un Progress Listener e monitorare i cambiamenti di localizzazione scheda all'interno . scheda di copertura swithches con Addon SDK.
Per installare un ascoltatore, convertire scheda SDK per la sua prima (vecchia) la rappresentazione utilizzando viewFor. la conversione a ritroso è possibile con modelFor e 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);
});
Ispirato Conversione in finestre Chrome