【问题标题】:Determine if the browser already opened an URL判断浏览器是否已经打开了一个 URL
【发布时间】:2018-09-08 09:47:34
【问题描述】:

我们使用内部系统(以 FF 作为默认浏览器)

我们需要避免用户在不同的标签页中打开相同的 URL。 由于选项卡共享相同的 PHP 会话,我们会变得一团糟。 所以实际上我正在寻找以编程方式检查某个 URL 是否已经在打开的选项卡之一中打开的方法。 客户端(JS)或服务器端(PHP)。

我们现在使用 FF 扩展“Duplicate Tabs Closer”来提供帮助。 但我更愿意完全控制(发出警告,选择它适用于哪个 URL)。

【问题讨论】:

    标签: javascript php firefox browser


    【解决方案1】:

    您可以在页面加载到第一个选项卡后编写 cookie,在服务器端检查它,如果设置了此 cookie 并打开第二个选项卡,则显示用户警告而不是实际页面内容。要处理用户关闭唯一打开的选项卡的情况,您可以在 onbeforeunload 处理程序中删除该 cookie。

    【讨论】:

    • 感谢您的建议我尝试 onbeforeunload w3schools.com/jsref/tryit.asp?filename=tryjsref_onbeforeunload 但它在我的 FF 中不起作用(它适用于 Chrome)
    • 尝试将onbeforeunload 处理程序设置为window 对象,而不是body。这是一个例子jsfiddle.net/urogqmkp/3。 PS:w3schools 并不是最好的知识来源。最好使用developer.mozilla.orgdevdocs.io
    • 谢谢,我已经在测试了。 (窗口对象):) 在 FF 中产生了相当奇怪的结果。我在点击和重新加载时触发它。但不是关闭。但是,如果我在关闭选项卡之前打开开发控制台 (F12),它也会在关闭时触发。
    • 你说得对。我在实践中不经常使用onbeforeunload 处理程序,看起来我错过了firefox 删除了从该处理程序显示确认消息的能力。但是处理程序有效,并且在选项卡关闭之前被调用。您可以在以下示例jsfiddle.net/urogqmkp/17 中轻松检查它。打开示例,查看控制台,关闭选项卡,再次打开并再次查看控制台。
    • 我终于想通了。根据this answer,Firefox 会检查用户是否与页面交互并仅在有键盘或鼠标事件时才显示弹出窗口。因此,如果您单击我在 Firefox 中的第一个示例的结果部分中的某个位置并尝试关闭选项卡,您应该会看到一个弹出窗口。
    【解决方案2】:

    根据 Oleksandr 的回答,您可以在 cookie 中存储一个 url 打开次数的地图。打开页面时,增加数字或将其设置为0。当页面关闭时,减少或删除它。

    function incrementTabsOpen() {
        let tabsOpen = readObjCookie('tabsOpen') || {};
        if (tabsOpen[window.location.href]) tabsOpen[window.location.href]++;
        else tabsOpen[window.location.href] = 0;
        writeObjCookie('tabsOpen', tabsOpen);
    }
    function decrementTabsOpen() {
        let tabsOpen = readObjCookie('tabsOpen') || {};
        if (tabsOpen[window.location.href]) tabsOpen[window.location.href]--;
        if (tabsOpen[window.location.href] === 0) delete tabsOpen[window.location.href];
        writeObjCookie('tabsOpen', tabsOpen);
    }
    
    // https://stackoverflow.com/a/11344672/3783155
    function readObjCookie(name) {
        let result = document.cookie.match(new RegExp(name + '=([^;]+)'));
        if (result) result = JSON.parse(result[1]);
        return result;
    }
    function writeObjCookie(name, value) {
        document.cookie = name + '=' + JSON.stringify(value);
    }
    

    window.addEventListener('load', function() {
        incrementTabsOpen();
    };
    window.addEventListener('unload', function() {
        decrementTabsOpen();
    };
    

    【讨论】:

      猜你喜欢
      • 2012-03-05
      • 2011-06-05
      • 1970-01-01
      • 2011-09-16
      • 2013-02-09
      • 1970-01-01
      • 2012-06-25
      • 2016-08-12
      相关资源
      最近更新 更多