【问题标题】:Communication between browser tabs: page titles must be updated synchronously for all browser tabs浏览器选项卡之间的通信:所有浏览器选项卡的页面标题必须同步更新
【发布时间】:2016-10-19 14:08:52
【问题描述】:

我所拥有的:当从 ajax 调用中检索新数据时,页面标题会动态更新;如果访问此页面的选项卡 - 标题设置为默认值;如果我用这个页面打开第二个标签,这个标签的标题被设置为默认值(我必须解决这个问题)

我需要什么:该页面的所有选项卡的页面标题必须相同。我的意思是,所有选项卡的页面标题必须同步更新。

我目前的实现:

var prevData;
var newRequestsCounter = 0
var getRequests = function(){
          $.ajax({
              async: true,
              type: "GET",
              url: "/get_requests/",
              success: function(data){
                  // retrieve and parse data. i skip this part
                  // newRequestsCounter is updating here
                  var visible = vis();
                  if (visible){
                      newRequestsCounter = 0
                      document.title = 'Default title'
                  } else {
                     if (newRequestsCounter == 0) {
                         document.title = 'Default title'
                     } else {
                         document.title =  'Dynamic title'
                     }
                  }

                  setTimeout(getRequests, 2000)
              }
          });
};

我尝试使用 intercom.js,但它无法正常工作。由于某种原因,intercom.on 每次都会获取不同的数据。例如:第一次调用-默认标题,第二次调用-动态标题。我用调试检查过,执行此行 setTimeout(getRequests, 2000) 后出现错误数据。

var intercom = Intercom.getInstance();

intercom.on('notice', function(data) {
    document.title = data.title;
});
var prevData;
var newRequestsCounter = 0
var getRequests = function(){
          $.ajax({
              async: true,
              type: "GET",
              url: "/get_requests/",
              success: function(data){
                  // retrieve and parse data. i skip this part
                  // newRequestsCounter is updating here
                  var visible = vis();
                  if (visible){
                      newRequestsCounter = 0
                      intercom.emit('notice', {title: 'Default title'});
                  } else {
                     if (newRequestsCounter == 0) {
                         intercom.emit('notice', {title: 'Default title'});
                     } else {
                         intercom.emit('notice', {title: 'Dynamic title'});
                     }
                  }

                  setTimeout(getRequests, 2000)
              }
          });
};

一般来说,我不太了解是否可以在单个 ajax 回调范围内实现所需的功能。我尝试了下一个代码。在这种情况下,每次我打开新标签时,localStorage 中的变量“计数器”都会增加。这意味着如果我期望两个选项卡的标题为“3”,我会得到两个选项卡的“6”。

var intercom = Intercom.getInstance();

intercom.on('notice', function(data) {
    document.title = data.title;
});

if (localStorage.getItem("counter") === null){
    localStorage.setItem("counter", 0);
}
var getRequests = function(){
          $.ajax({
              async: true,
              type: "GET",
              url: "/get_requests/",
              success: function(data){
                  // skip part with retrieving and parsing data

                        var counter = localStorage.getItem("counter")
                        localStorage.setItem("counter", ++counter);
                  var visible = vis(); 
                  if (visible){
                      localStorage.setItem("counter", 0);
                      intercom.emit('notice', {title: 'Default'});
                  } else {
                     if (localStorage.getItem("counter") == 0 || localStorage.getItem("counter") === null) {
                         intercom.emit('notice', {title: 'Default'});
                     } else {
                         intercom.emit('notice', {title: '(' + localStorage.getItem("counter") + ') requests'});
                     }
                  }
                  setTimeout(getRequests, 2000)
              }
          });
};
getRequests();

【问题讨论】:

    标签: javascript jquery ajax intercom.js


    【解决方案1】:

    我在您的代码中不理解的部分是您正在打开一个新的浏览器选项卡。但是,如果这发生在某个地方,并且您想将该新标签的标题设置为它的开头,您可以这样做:

    var newTab = window.open('/page')
    newTab.title = 'New Title';
    

    【讨论】:

    • 用户正在打开一个新的浏览器选项卡,而不是 JS。
    • 如果是这种情况,请设置一个 cookie document.cookie="UseTitle=MyTitle" 域内的所有页面都可以读取,无论标签如何
    • 我不知道应该在哪里设置 cookie、读取 cookie 并将 cookie 值分配给所有选项卡的页面标题?我可以读取所需的 cookie,但是如何将此 cookie 的值设置为打开的标签的标题?
    • 你可以做的是在你的页面头部添加一点sn-p代码来检查间隔setInterval(getCookieFunc,1000)的cookie,如果cookie != document.title改变它。您可以随时设置 cookie。也许在ajax请求的成功回调中。因此,任何其他打开的选项卡都会每秒检查标题更改或您设置的任何内容。
    • 我在 ajax 请求的成功回调中设置了 cookie,并在我设置新标题的地方添加了额外的 setInterval。但是我仍然遇到了我在问题中描述的问题:如果我每次打开几个新选项卡 getCookie 都会得到不同的值,例如第一次 - 默认标题,第二次时间 - 动态标题。
    【解决方案2】:

    您是否在使用某种长轮询? 也许您可以将这些轮询调用与浏览器的时间同步。 例如每次浏览器的时间秒数为偶数时进行轮询。那么每个选项卡应该同时发送它的请求并(几乎)同时获得更新标题的答案

    【讨论】:

    • 只是简单的轮询。我认为问题在于计算新请求。脚本会为每个新标签一次又一次地计算它们。但我不知道如何在脚本中单独计数部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 2012-02-10
    • 2022-07-11
    • 1970-01-01
    相关资源
    最近更新 更多