#javascript #jquery #ajax #intercom.js
#javascript #jquery #ajax #intercom.js
Вопрос:
что у меня есть: заголовок страницы обновляется динамически при получении новых данных из вызова 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 каждый раз получает разные данные. Например: первый вызов — заголовок по умолчанию, второй вызов — динамический заголовок. Я проверил с помощью debug, неправильные данные поступают после выполнения этой строки 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. Я попробовал следующий код. В этом случае переменная «counter» из 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();
Ответ №1:
Часть, которую я не понимаю в вашем коде, заключается в том, что вы открываете новую вкладку браузера. Но, если это где-то происходит, и вы хотите установить заголовок этой новой вкладки в качестве ее открытия, вы можете сделать это:
var newTab = window.open('/page')
newTab.title = 'New Title';
Комментарии:
1. Пользователь открывает новую вкладку браузера, а не JS.
2. В этом случае установите файл cookie document.cookie=»UseTitle=MyTitle» все страницы в домене могут быть прочитаны независимо от вкладки
3. я не уверен, где я должен устанавливать cookie, читать cookie и присваивать значение cookie заголовкам страниц для всех вкладок? Я могу прочитать требуемый файл cookie, но как я могу установить значение этого файла cookie для заголовков открытых вкладок?
4. Что вы можете сделать, так это добавить небольшой фрагмент кода в начало вашей страницы, чтобы проверять cookie с интервалом
setInterval(getCookieFunc,1000)
и,cookie != document.title
если это возможно, изменять его. Вы бы установили cookie, когда захотите. Возможно, при успешном обратном вызове ajax-запроса. Таким образом, любые другие открытые вкладки проверяют изменения заголовков каждую секунду или независимо от того, что вы установили.5. Я устанавливаю cookie внутри успешного обратного вызова ajax-запроса и добавляю дополнительный setInterval, где я устанавливаю новый заголовок. Но у меня все еще есть проблема, которую я описал в своем вопросе: если я открываю несколько новых вкладок, getCookie каждый раз получает разные значения, например, в первый раз — заголовок по умолчанию, во второй раз — динамический заголовок.
Ответ №2:
вы используете какой-то длительный опрос? Возможно, вы можете синхронизировать эти вызовы опроса со временем браузера. например, опрашивать каждый раз, когда секунды времени браузера являются четными числами. затем каждая вкладка должна одновременно отправлять свой запрос и получать (почти) одновременно ответ на обновление заголовка
Комментарии:
1. Просто опрос. Я думаю, что проблема заключается в подсчете новых запросов. Скрипт подсчитывает их снова и снова для каждой новой вкладки. Но я не знаю, как отделить часть подсчета в скрипте