Как определить каждое открытое в данный момент отдельное окно браузера?

Как я могу однозначно идентифицировать каждое отдельное окно браузера, которое в настоящее время открыто для всех основных браузеров, используя javascript? Позвольте мне объяснить, что мне нужно знать, и давайте рассмотрим сценарий ниже:

У меня есть 3 окна браузера [любой современный браузер, например Chrome, Firefox и т. Д.], Которые в настоящее время открыты, каждое из которых содержит несколько вкладок.

  • Окно №1: 3 вкладки [вкладка A, вкладка B и вкладка C]
  • Окно №2: 2 вкладки [вкладка D и вкладка E]
  • Окно №3: 4 вкладки [вкладка F, вкладка G, вкладка H и вкладка I]

Как я могу однозначно идентифицировать каждое окно браузера [т.е. захватить уникальный идентификатор / значение для каждого окна браузера, а не для окна вкладки]? Итак, в конце у меня будет 3 идентификатора [все окна], а не 9 идентификаторов [все вкладки]. Я могу идентифицировать все вкладки в окнах, создав надстройку или расширение браузера, которое использует jQuery [crossrider], но не смог найти способ однозначно идентифицировать каждое окно.

Возможно ли это с помощью JavaScript / JQuery? Если да, то как? если нет, то почему?

Я пробовал "window.name" в javascript, но это дает мне 9 идентификаторов, а не 3 идентификатора.


person Ali007    schedule 24.10.2013    source источник
comment
Я не совсем понимаю, почему вы хотите идентифицировать окна, каков вариант использования? Современные браузеры обычно рассматривают вкладки как окна (раньше было много открытых окон, теперь много открытых вкладок) и реализуют их как отдельные процессы. На самом деле вам нужны только идентификаторы вкладок, которые, судя по вашим комментариям, я вижу, вам уже удалось получить. [Отказ от ответственности] Я сотрудник Crossrider   -  person Shlomo    schedule 24.10.2013
comment
Спасибо за вашу помощь. Я хочу сохранить сеанс просмотра пользователя [открытые в данный момент окна и вкладки] в облаке / сервере при нажатии кнопки пользователем, чтобы пользователь мог покинуть / закрыть свой браузер / компьютер, вернуться снова и начать просмотр там, где он / она остановился. Например, при сбое Chrome он запоминает последний сеанс пользователя и повторно открывает все окна и вкладки точно так же, как они были открыты до сбоя, чтобы пользователям не приходилось открывать их снова. В этом сценарии я не хочу сохранять / открывать 9 вкладок в 1 окне, но 3 вкладки в окне № 1, 2 вкладки в окне № 2 и 4 вкладки в окне № 3.   -  person Ali007    schedule 24.10.2013
comment
Существует множество сценариев для расширений / плагинов, в которых отслеживание окон очень важно, я думаю, что Crossrider должен обновить свой API, чтобы поддерживать идентификацию окон браузера.   -  person Ashraf Bashir    schedule 26.10.2013
comment
Мне нравится кроссрайдер, потому что он действительно упрощает работу разработчика. Могу ли я также помочь создать плагины кроссрайдера [аналогично тому, как люди создавали плагины jQuery раньше]? Какой подход к созданию плагина для кроссрайдера? Таким образом, любой разработчик может создать плагин для расширения API кроссрайдера для удовлетворения своих уникальных требований проекта.   -  person Ali007    schedule 28.10.2013
comment
Кто-нибудь знает, можно ли это сделать, просто используя простой javascript или jQuery?   -  person Ali007    schedule 04.11.2013
comment
Crossrider прекрасно позволяет создавать кросс-браузерное решение, но также должен иметь некоторый механизм, который разработчик может использовать для включения специфичного для браузера нативного кода, чтобы воспользоваться всеми уникальными функциями браузера.   -  person Ali007    schedule 19.11.2013


Ответы (1)


Насколько я знаю, с текущим Crosssrider API этого сделать нельзя!

Вы должны вернуться к реализации плагинов без кроссбраузерности,
чтобы реализовать отдельное расширение для каждого браузера, на который вы нацеливаете.

Например, в расширении Chrome используйте chrome.windows.getAll. функция

chrome.windows.getAll(object getInfo, function callback)

чтобы получить все экземпляры окон, в которых вы можете подсчитать и идентифицировать каждое. Например:

chrome.windows.getAll({populate : true}, function (window_list) {
    var count = window_list.length; // You now have their count
    for(var i=0; i<count; i++) {
        var myWindow = window_list[i];
        // Do whatever you want here !
    }
});

И не забывайте разрешения вкладок в манифесте!

{
  ...
  "permissions": ["tabs"],
  ...
}


А для подключаемого модуля Firefox используйте _5 _, вызывая его метод getEnumerator

var windowMediator = Components.classes["@mozilla.org/appshell/window-mediator;1"]
                     .getService(Components.interfaces.nsIWindowMediator); 
var enumerator = windowMediator.getEnumerator(null); // returns an iterator of all windows
var count = 0;
while (enumerator.hasMoreElements()) {
    var myWindow = enumerator.getNext();
    count++; 
    // Do whatever you want here !
}
// You now have their count


А для расширения Safari вы можете получить массив всех открытых окон, используя _ 8_ Например

var count = safari.application.browserWindows.length; // You now have their count
for(var i=0; i<count; i++) {
    var myWindow = safari.application.browserWindows[i];
    // Do whatever you want here !
}
person Ashraf Bashir    schedule 25.10.2013
comment
Можете ли вы получить / установить любое значение в окне браузера [например, window.name], используя простой javascript или jQuery? Что-нибудь действительно, чтобы идентифицировать окна или отличать их друг от друга? - person Ali007; 26.10.2013
comment
Спасибо за вашу помощь. Интересно, что вы не упомянули IE ... ;-) - person Ali007; 26.10.2013
comment
Вы ограничены на получение / установку значений для полей, которые доступны в каждом оконном API в виде полей gettable / settable (обратите внимание, что некоторые из них доступны только для чтения), поэтому вам необходимо проверить объект окна в каждой документации и сначала проверить, является ли поле (которое подходит для логики вашего приложения) доступен и доступен ли его gettable / settable (ссылки на документацию API приведены в моем ответе выше) - person Ashraf Bashir; 27.10.2013
comment
Я не упомянул IE, потому что есть много альтернатив для реализации расширений IE: либо с помощью собственного кода, либо с помощью C ++, либо с помощью Win32 API, либо с помощью таких фреймворков, как Add-in-Express. Так что это зависит от того, как вы это реализуете ... PS. Пожалуйста, отметьте решение как ответ, если оно отвечает на ваш вопрос. - person Ashraf Bashir; 27.10.2013