Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何检查当前浏览器选项卡的url是否已更改?_Javascript_Url_Firefox_Firefox Addon_Dom Events - Fatal编程技术网

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

Javascript 如何检查当前浏览器选项卡的url是否已更改?,javascript,url,firefox,firefox-addon,dom-events,Javascript,Url,Firefox,Firefox Addon,Dom Events,我需要它在我的Firefox扩展中使用。 我已经尝试了window.onloadevent listener,并检查当前url是否=旧url,这是一个好主意,但当页面加载PDF时它不起作用 我也看到哈希函数发生了变化,但它只适用于Firefox3.6;我需要它至少与Firefox3一起工作 因此,我需要一个事件侦听器来检查document.location是否更改。例如,您可以使用: var mainWindow = window .QueryInterface(Components.i

我需要它在我的Firefox扩展中使用。 我已经尝试了
window.onload
event listener,并检查当前url是否=旧url,这是一个好主意,但当页面加载PDF时它不起作用

我也看到哈希函数发生了变化,但它只适用于Firefox3.6;我需要它至少与Firefox3一起工作


因此,我需要一个事件侦听器来检查document.location是否更改。

例如,您可以使用:

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);
但是,关键是,您需要将侦听器添加到浏览器,而不是窗口

编辑
有关从不同上下文访问浏览器的信息以及其他一些有用信息,请参见

编辑
只是想补充一点细节

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);
这会让你有99%的成功率

在选项卡中添加并监视位置更改。封面标签开关与插件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);
});
灵感来自

谢谢你,乔纳森。您编写的函数似乎是正确的,但问题是,当我加载pdf时,DOMContentLoaded事件不会触发,因此其他代码也不会触发。。最好的解决方案应该是在控制URL的浏览器元素中添加一个eventListener,但我不知道DOMContentLoaded事件如何仅在具有DOM的mime类型(例如HTML或XUL)上触发。您是否特别想要侦听正在加载的PDF?来自特定领域?您可能需要查看http on examine response。还有一个观察者通知处理的例子谢谢你Jonathan你让我走对了。现在使用http检查响应,我可以从页面请求中获取事件,并检查页面的url是否已更改,当然,它也适用于pdf。但我还必须前后检查历史记录,因为它们不发出http请求。真的没有其他方法只检查页面请求事件,例如,当我在firefox导航栏上写入url并按enter键时应该触发的事件?!没问题。您可能希望安装ChromeBug(就像firefox的firebug本身),以便更轻松地确定如何侦听地址栏上的事件。如果您想要侦听来自多个来源(书签、链接、地址栏等)的请求,则需要观察员通知。您可能希望查看当请求发出时触发的修改请求(与检查响应不同)
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);
});