Pergunta

Eu preciso usar na minha extensão do Firefox. Eu já tentei window.onload ouvinte de eventos e verifique se o URL atual == URL antigo, e é uma boa ideia, mas não funciona quando a página carrega PDF.

Vi Hash mudou a função também, mas funciona apenas com o Firefox 3.6; Eu preciso que funcione pelo menos com o Firefox 3.

Então, eu preciso de um ouvinte de evento que verifique se document.location mudanças.

Foi útil?

Solução

Por exemplo, você pode usar:

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);

Mas, o ponto é que você precisa adicionar o ouvinte ao navegador, não na janela.

EDITAR
Ver https://developer.mozilla.org/en/code_snippets/tabbed_browser Para obter informações sobre como acessar o navegador de diferentes contextos, bem como algumas outras informações úteis.

EDITAR
Só para adicionar um pouco mais de detalhes ....

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
    }
}

Observe que isso responderá às páginas abertas em qualquer guia, não em uma guia específica.


Para uma guia específica, você pode usar algo assim:

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

O acima adiciona uma nova guia e depois adiciona um ouvinte. No entanto, para todas as guias, você precisará de algo como o seguinte. E, em seguida, adicione o ouvinte de evento "DOMCONTENTLOADED" em cada guia quando adicionado (e removido quando fechado).

Você também pode querer ver: 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

(Para preservação)

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);

Isso deve levar 99% do caminho para lá.

Outras dicas

Adicione a Ouvinte de progresso e monitorar alterações de localização dentro da guia. Guia de tampa swithches com addon sdk.

Para instalar um ouvinte, converta a guia SDK em sua representação bruta (antiga) usando o Viewfor. A conversão para trás é possível com o 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);
});

Inspirado porConvertendo para janelas cromadas

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top