Как я могу проверить, изменился ли URL текущей вкладки браузера? - PullRequest
2 голосов
/ 14 января 2010

Мне нужно использовать его в моем расширении Firefox. Я уже попробовал прослушиватель событий window.onload и проверил, является ли текущий url == старый url, и это хорошая идея, но он не работает, когда страница загружается pdf.

Я видел функцию изменения хеша, но она работает только с ff 3.6; мне нужно, чтобы он работал хотя бы с ff 3.

Итак, мне нужен прослушиватель событий, который проверяет, изменяется ли document.location.

Спасибо

Ответы [ 2 ]

3 голосов
/ 29 марта 2015

Добавьте Progress Listener и отслеживайте изменения местоположения внутри вкладки. Накладки на крышку с помощью Addon SDK.

Чтобы установить прослушиватель, преобразуйте вкладку SDK в ее необработанное (старое) представление, используя viewFor. Обратное преобразование возможно с modelFor и 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);
});

Вдохновленный Преобразование в хромированные окна

2 голосов
/ 14 января 2010

Например, вы можете использовать:

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

Но дело в том, что вы должны добавить слушателя в браузер, а не в окно.

EDIT
См. https://developer.mozilla.org/En/Code_snippets/Tabbed_browser для получения информации о доступе к браузеру из разных контекстов, а также некоторую другую полезную информацию.

EDIT
Просто чтобы добавить немного больше деталей ....

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

Обратите внимание, что это будет отвечать на страницы, открытые на любой вкладке, а не на конкретной вкладке.


Для конкретной вкладки вы можете использовать что-то вроде этого:

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

Выше добавлена ​​новая вкладка, а затем добавлен слушатель. Однако для всех вкладок вам понадобится что-то вроде следующего. Затем добавьте прослушиватель событий «DOMContentLoaded» на каждую вкладку при добавлении (и удалении при закрытии).

Вы также можете увидеть: https://developer.mozilla.org/En/Code_snippets/Tabbed_browser#Notification_when_a_tab_is_added_or_removed и https://developer.mozilla.org/En/Code_snippets/Tabbed_browser#Getting_document_of_currently_selected_tab

(для консервации)

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

Это должно дать вам 99% пути туда.

...