Communication between browser tabs: page titles must be updated synchronously for all browser tabs

275 Views Asked by At

what i have: page title is updating dynamically when new data is retrieving from ajax call; if tab with this page is visited - title is set to default value; if i open the second tab with this page, title of this tab is set to default (i must fix this)

what i need: page title must be the same for all tabs with this page. i mean, page title must be updated synchronously for all tabs.

My current implementation:

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)
              }
          });
};

I tried with intercom.js, but it doesn't work properly. For some reason intercom.on gets different data each time. For example: first call - default title, second call - dynamic title. I checked with debug, wrong data comes after executing this line 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)
              }
          });
};

In general, i don't quite understand if it possible to achieve required functionality in scope of single ajax callback. I tried the next code. In this case variable "counter" from localStorage is incremented every time i open new tab. It means if i expect "3" in title for two tabs, i get "6" with two tabs instead.

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();
2

There are 2 best solutions below

8
On

The part I am not understanding in your code is where you are opening a new browser tab. But, if that happening somewhere and you want to set the title of that new tab as its opening you can do this:

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

are you using some kind of long polling? Maybe you can synchronise those polling calls with the browser's time. e.g. poll everytime the browser's time's seconds are even numbers. then each tab should send its request at the same time and get (almost) at the same time an answer to update there title