【问题标题】:If dialog opens in one browser tab, prevent it from opening in another?如果对话框在一个浏览器选项卡中打开,是否阻止它在另一个浏览器选项卡中打开?
【发布时间】:2013-11-19 18:02:35
【问题描述】:

我有一个使用 ajax 来检查某事是否属实的代码,例如:

$.ajax({
  type: 'get',
  url: ACTION_URL
  dataType: 'json',
  success: function(result) {
    if (result && result.success) {
        $('#JQUERY_UI_DIALOG').dialog('open');
    }
  }
});

现在这个 ajax 每隔几秒就会运行一次。如果用户在同一页面或不同页面的浏览器中打开了多个选项卡,并且对话框在一个选项卡上打开,则它会在所有选项卡上打开。

如果用户在一个选项卡的对话框上关闭或接受,则其他选项不会关闭,因此用户必须浏览所有选项卡并手动执行。

如果至少有一个选项卡被关闭,有没有办法让其他选项卡关闭该对话框?或者如果它是在一个标签上打开的,甚至不要打开它。

【问题讨论】:

  • 如果您希望它跨越多个选项卡,您将不得不使用 cookie 来处理它。那将是最简单的解决方案
  • 除了每个用户的第一次之外,不要将成功返回到上述 ajax 调用。

标签: javascript jquery ajax


【解决方案1】:

如果你阻止其他人打开可能是最好的,因为关闭的东西会要求你每隔几秒钟发出另一个请求(或使现有请求复杂化)。 因此,基本上,您可以做的是在每个会话的基础上将弹出窗口的状态保存在服务器上。 假设你已经有了类似的东西

$.getJSON(ACTION_URL, function(result){
    if(result && result.success && !result.popupOpen){
        $.post(POPUP_URL, {open: true}, function(){
            $('#JQUERY_UI_DIALOG').dialog('open');
        });
    }
});

然后,在您的服务器端,您可以将相应的会话变量设置为 true,这样来自其他浏览器的任何传入请求都会知道result.success,但仍然知道弹出窗口已经打开(@987654323 @)。

【讨论】:

    【解决方案2】:

    好吧,我一直在想一个类似的问题并得到了一个线索,所以我想在这里分享它:

    Javascript: sharing data between tabs

    这样,您可以完全省略服务器端检查,从而减少 AJAX 调用次数、服务器负载、延迟(因为 AJAX 请求比本地通信慢)和流量。

    只需确保让您的标签“检测”已消失的标签即可。
    大多数浏览器都支持beforeUnload 事件,或者您存储一个时间戳,该时间戳由选项卡每隔几秒打开一次弹出窗口刷新并由其他人检查。

    【讨论】:

      猜你喜欢
      • 2014-02-18
      • 2016-08-12
      • 2012-06-20
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      相关资源
      最近更新 更多