Подтвердить что ты не робот

Любой способ определить вкладку браузера в JavaScript?

Мне нужно определить, на какой вкладке я вхожу в браузер. Нет ли какой-либо информации, которую я могу получить в браузере, чтобы определить вкладку? Мне не нужно ничего знать о каких-либо других вкладках, мне просто нужен идентификатор для вкладки, в которой я нахожусь. Это может быть случайный или упорядоченный номер или штамп даты-времени, если он остается тем же самым для жизнь вкладки.

У меня есть приложение на стороне клиента, которое делает соединение BOSH через HTTP с удаленным сервером, и если я открываю его на нескольких вкладках, каждый экземпляр нуждается в его собственном уникальном идентификаторе или приложение терпит неудачу, поэтому мне просто нужен уникальный номер, который связан с вкладкой до тех пор, пока существует табуляция (то есть что-то, что переживает обновление страницы при навигации по сайту, который предоставляет это приложение). Похоже, что это просто проблема, которая должна быть доступна в браузере, например window.tabId - все, что мне нужно. У меня есть серьезный блок разработки, потому что я не могу пройти мимо этого простого, простого и простого решения, которое, похоже, не существует. Должен быть способ (в этом кроссбраузерное решение).

Любые идеи?

4b9b3361

Ответ 1

SessionStorage - за вкладку/окно, поэтому вы можете определить случайное число в sessionStorage и сначала получить его, если существует:

var tabID = sessionStorage.tabID ? sessionStorage.tabID : sessionStorage.tabID = Math.random();

UPDATE:
В некоторых случаях вы можете иметь один и тот же sessionStorage на нескольких вкладках (например, при дублировании вкладки). В этом случае следующий код может помочь:

var tabID = sessionStorage.tabID && sessionStorage.closedLastTab !== '2' ? sessionStorage.tabID : sessionStorage.tabID = Math.random();
sessionStorage.closedLastTab = '2';
$(window).on('unload beforeunload', function() {
      sessionStorage.closedLastTab = '1';
});

Ответ 2

Вы должны использовать html5, но sessionStorage в сочетании со случайным ориентиром, похоже, будет тем, что вы хотите.

Ответ 3

Вы не можете получить идентификатор вкладки с javascript, как всегда есть какое-то решение, которое может помочь вам с использованием разных сеансов/файлов cookie, когда пользователь открывает новую вкладку.

Некоторая ссылка:

Получить вкладку вкладки браузера Index/Id

получить URL-адреса вкладок firefox из расширения firefox

Как отличать сеансы на вкладках браузера?

Получите уникальный сеанс на каждой вкладке браузера

asp.net - session - несколько вкладок браузера - разные сеансы?

Ответ 4

Поскольку у меня нет простой функции Javascript, такой как windows.currentTabIndex, я написал несколько строк Javascript, чтобы зафиксировать идентификатор на каждой вкладке браузера при их загрузке.

function defineTabID()
    {
    var iPageTabID = sessionStorage.getItem("tabID");
      // if it is the first time that this page is loaded
    if (iPageTabID == null)
        {
        var iLocalTabID = localStorage.getItem("tabID");
          // if tabID is not yet defined in localStorage it is initialized to 1
          // else tabId counter is increment by 1
        var iPageTabID = (iLocalTabID == null) ? 1 : Number(iLocalTabID) + 1;
          // new computed value are saved in localStorage and in sessionStorage
        localStorage.setItem("tabID",iPageTabID);
        sessionStorage.setItem("tabID",iPageTabID);
        }
    }

Этот код сохраняет индекс последней вкладки в localStorage чтобы обновить текущее значение для новых вкладок, и в sessionStorage чтобы исправить идентификатор страницы!

Я должен вызвать defineTabId() на каждой странице моего приложения. Поскольку я разрабатываю с использованием шаблонов JSF, это определяется только в одном месте :-)

Ответ 5

Одним из возможных решений является использование свойства window.name, но я не хочу использовать его, потому что кто-то еще может его использовать.

Я нашел еще одно возможное решение: using sessionStorage. Он поддерживается FF3.5 +, Chrome4 +, Safari4 +, Opera10.5 + и IE8 +.

Ответ 6

Если нет шансов, что пользователь откроет 3 вкладки в течение 2 миллисекунд, можно использовать временную метку и сохранить ее в window.name и использовать это как ключ в вашем поиске. Значение window.name останется с вкладкой до ее закрытия.

Timestamp

Ответ 7

Для тех, кто использует React, я сделал маленький хитрый крючок:

import {useEffect, useMemo} from 'react'
import uniqid from 'uniqid'

export const TAB_ID_KEY = 'tabId'

export default () => {
  const id = useMemo(uniqid, [])

  useEffect(() => {
    if (typeof Storage !== 'undefined') {
      sessionStorage.setItem(TAB_ID_KEY, id)
    }
  }, [id])

  return id
}

Поместите это в свой базовый компонент App/Page, или где-нибудь, что, как вы знаете, всегда будет монтироваться.

Он запустит эффект после монтирования и установит уникальный идентификатор для текущей вкладки в хранилище сеансов, которое является специфичным для вкладки.

Дублирование вкладки даст вам новый идентификатор для новой вкладки, поскольку компонент будет снова подключен, и эффект запустится, перезаписав предыдущий идентификатор вкладки.

Ответ 8

По крайней мере, для chrome, существует официальный ответ с 2013 года: chrome.tabs API.