如何检查当前浏览器选项卡的URL是否已更改?

时间:2010-01-13 22:28:27

标签: javascript firefox url javascript-events firefox-addon

我需要在我的firefox扩展中使用它。 我已经尝试过window.onload事件监听器,并检查当前url == old url,这是一个好主意,但是当页面加载pdf时它不起作用。

我看到哈希改变了功能,但它只适用于ff 3.6;我需要它至少与ff 3一起工作。

所以,我需要一个事件监听器来检查document.location是否会发生变化。

由于

2 个答案:

答案 0 :(得分:3)

添加Progress Listener并监控选项卡内的位置更改。使用Addon SDK覆盖标签切换。

要安装侦听器,请使用viewFor将SDK选项卡转换为其原始(旧)表示。 使用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);
});

灵感来自 Converting to chrome windows

答案 1 :(得分:2)

例如,您可以使用:

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

但重点是,你需要将监听器添加到浏览器,而不是窗口。

修改
有关从不同上下文访问浏览器的信息以及其他一些有用信息,请参阅https://developer.mozilla.org/En/Code_snippets/Tabbed_browser

修改
只是添加更多细节......

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_removedhttps://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%的方式。