В 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.