В javascript, как я могу однозначно идентифицировать одно окно браузера от другого, которые находятся под одним и тем же cookiedbased sessionId

Пользователи моего веб-приложения могут открыть несколько окон браузера и указать одну и ту же страницу. Я хотел бы, чтобы состояние некоторых вещей на странице (загружалось через ajax) сохранялось через обратную передачу. Я могу либо хранить в файле cookie, либо на моем сервере. В любом случае, я не могу придумать, как я могу различать каждое окно.

Например, скажем, пользователь Bob имеет два окна браузера, открытые на странице ListOfSomething. В каждом списке есть атрибут LoadedPageNumber, который мне нужно сохранить. В противном случае пользователи всегда попадают на страницу 1 при обновлении. Боб, возможно, загрузил окно браузера 1 и указал его на страницу 5, а затем загрузил окно браузера 2 и указал на страницу 14. Если я просто сохраню атрибут на основе идентификатора сеанса, Боб получит страницу 14 в окне 1, если он обновит ее.

Обратите внимание, что мои переменные состояния на самом деле намного сложнее, чем этот простой пример, и моя невозможность их сохранения может привести к большим проблемам (слабости в моем приложении).

Мне нужен какой-то идентификатор окна браузера или что-то в этом роде. Конечно, это должно быть кросс-браузерное решение (IE6 +, Wekbit? +, FF2 +)

Любые идеи?

Примечание по релевантности: Имейте в виду, что это полезно также для случая, когда вы смешиваете старые страницы на основе форм с более новыми элементами, поддерживающими AJAX. Иногда вам нужно отправить назад формы, и вы не хотите потерять некоторые значения состояния клиентской стороны.

Ответ 1

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

Это будет сделано так же, как вы установили имя в функции javascript window.open(), но вы можете сделать это для себя, а не для нового окна.

googling показывает:

self.window.name = myclass.getUniqueWindowId(thisSession);

UPDATE

Относительно вашей потребности сохранить это от обновления до обновления, я сделал несколько тестов и, похоже, сохранит его от обновления до обновления. Используя Firefox 3, при начальной загрузке имя окна пустое, и снова нажимайте CTRL + R, а имя окна было заполнено. Затем я прокомментировал настройку кода имени и перезагрузился, и он все еще сохранил имя.

<script type="text/javascript">

    alert( self.window.name );

    self.window.name = "blah";

</script>

UPDATE

Мне нужно заметить комментарий ниже на jQuery 'jquery-session' плагин, который действительно работает и предлагает путь больше, чем обсуждалось здесь.

Хотя, нужно также четко указать, что он основан на веб-хранилище HTML5, не поддерживается более старыми версиями IE.

Корпорация по-прежнему сильно зависит от IE 7 ( "и ниже" здесь, в Бразилии).

Основываясь на self.window.name, решение для всего, что не соответствует HTML5, я предлагаю следующий фрагмент кода как решение для кросс-браузера:

<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script language="javascript" type="text/jscript">
    //----------------------------------------------------------------------
    //-- guarantees that window.name is a GUID, and that it would
    //-- be preserved whilst this window life cicle
    //----------------------------------------------------------------------
    //-- window.name will be set to "GUID-<SOME_RANDOM_GUID>"
    //----------------------------------------------------------------------

    $(window).load(
        function () {
            //----------------------
            var GUID = function () {
                //------------------
                var S4 = function () {
                    return(
                            Math.floor(
                                    Math.random() * 0x10000 /* 65536 */
                                ).toString(16)
                        );
                };
                //------------------

                return (
                        S4() + S4() + "-" +
                        S4() + "-" +
                        S4() + "-" +
                        S4() + "-" +
                        S4() + S4() + S4()
                    );
            };
            //----------------------

            if (!window.name.match(/^GUID-/)) {
                window.name = "GUID-" + GUID();
            }
        }
    ) //--------------------------------------------------------------------
</script>

Я нашел GUID-функцию здесь (для которой я предложил некоторую очистку кода).

Ответ 2

Как насчет того, что ваш сервер случайно генерирует идентификатор и хранит ли он на странице (какая-то переменная javascript), когда он обслуживается? Затем просто укажите этот идентификатор в запросе ajax. Это не поможет в обновлении браузера, но пока пользователь оставляет эту страницу на месте (и просто позволяет материалу ajax делать свою работу), она должна работать нормально.

Ответ 3

Это давным-давно, но ответ Рой Рико мне помог сегодня, поэтому я хочу поделиться своим опытом. Чтобы справляться с обновлением страницы и использованием backgutton страницы, я делаю это так:

  • Ваш сервер проверяет, отправляет ли браузер GUID с его запросом (работает только с ajax или формой submit)
  • Если его нет (обновление браузера, откидная панель), он просто отправляет обратно страницу с небольшим JavaScript script. Этот script создает GUID и помещает его в хранилище window.name, как описано выше. После этого script создает форму с GUID как скрытое поле и отправляет ее на сервер. Атрибут действия использует тот же URL-адрес, что и раньше (window.location.href)

- > Теперь сервер распознает GUID и может доставлять контент по мере необходимости.

Вот мой код (GUID, который я создаю на сервере по соображениям безопасности, синтаксис "$ {gUid] принадлежит freemarker и просто вставляет Guid с сервера):

<script>
    $(window).load(
        function () {
            if (!window.name.match(/^GUID-/)) {
                window.name = "GUID-" + "${gUid}";
            }
            $('<form action='+window.location.href+' method="POST"><input type="hidden" name="X-GUID" id="X-GUID" value='+window.name+'></form>').appendTo('body').submit();
        }
    );  
</script>

Надеюсь, что кто-то поможет

Кстати, эту технику следует использовать только на страницах "NON SEO PAGES", из-за необходимости использования JavaScript для получения контента. Но в целом страницы SEO не нуждаются в определении сеанса табуляции.

Конечно, в настоящее время вы можете использовать хранилище сеансов HTML5, но я не хочу полагаться на это, потому что мне также нужен более старый браузер для работы.

Ответ 4

Вы можете использовать хранилище сеансов HTML5, просто сгенерируйте уникальный идентификатор и установите его на хранилище сеансов! что круто, что каждое окно или вкладка имеет собственное хранилище сеансов. например:

если мы запустим следующее в 3 окна:

окно 1: sessionStorage.setItem('ключ', 'window1');

окно 2: sessionStorage.setItem('ключ', 'window2');

окно 3: sessionStorage.setItem('ключ', 'window3');

sessionStorage.getItem('ключ'); & Л; < < это вернет соответствующее значение в окне!

окно 1: sessionStorage.getItem('ключ'); возвращает окно 1

окно 2: sessionStorage.getItem('ключ'); возвращает окно 2

окно 3: sessionStorage.getItem('ключ'); возвращает окно 3

Я считаю, что вы пытаетесь сохранить переменную (отдельно для каждой вкладки/окна).

sessionStorage работает как прелесть.

Единственная проблема, с которой вам может столкнуться этот браузер, должен поддерживать HTML 5.