代码之家  ›  专栏  ›  技术社区  ›  Manuel Bitto

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

  •  2
  • Manuel Bitto  · 技术社区  · 16 年前

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

    我也看到hash改变了函数,但它只适用于ff 3.6;我需要它至少适用于ff 3。

    所以,我需要一个事件监听器来检查document.location是否更改。

    谢谢

    2 回复  |  直到 11 年前
        1
  •  2
  •   Jonathan Fingland    16 年前

    例如,您可以使用:

    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_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%的路要走。

        2
  •  3
  •   kasbah    11 年前

    添加一个 Progress Listener 并监视选项卡内的位置更改。带插件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