Nickolay.info. Javascript. Cookie-файлы, сохранение и восстановление состояния страниц и проблема onunload в Opera |
Одно из удобных применений Javascript - автоматическое сохранение состояния скриптов при выгрузке страницы и восстановление этого состояния при её следующей загрузке. Для обработки этих событий в Javascript предусмотрены события onUnload и onLoad соответственно, традиционно разработчики ставили вызов их обработчиков в тег <body>, например, так:
>body onLoad="Restore()" onUnload="Save()">
Здесь предполагается, что Javascript-функция сохранения данных называется Save()
, а для их восстановления вызывается Restore()
. Естественно, код функции Restore()
должен предусматривать и случай первой загрузки страницы, когда сохранённых данных ещё нет.
Физически данные сохраняются в так называемых Cookie-файлах, о них можно очень много где почитать, поэтому здесь я укажу лишь способы включения Javascript и Cookies в последних версиях основных браузеров.
"Типовой" блок функций Javascript для работы с Cookies может выглядеть так:
var caution = false; function setCookie(name, value, expires, path, domain, secure) { var curCookie = name + "=" + escape(value) + ((expires) ? "; expires=" + expires.toGMTString() : "") + ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : ""); if (!caution || (name + "=" + escape(value)).length <= 4000) document.cookie = curCookie; else if (confirm("Файл с сохраненной информацией превышает 4 Кб и будет обрезан!")) document.cookie = curCookie; } function getCookie(name) { var prefix = name + "="; var cookieStartIndex = document.cookie.indexOf(prefix); if (cookieStartIndex == -1) return null; var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length); if (cookieEndIndex == -1) cookieEndIndex = document.cookie.length; return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex)); } function fixDate(date) { var base = new Date(0); var skew = base.getTime(); if (skew > 0) date.setTime(date.getTime() - skew); }
Для сохранения целого числа или строки в Cookie подойдёт такой код, включённый в функцию Save()
.
var n,now = new Date(); fixDate(now); now.setTime(now.getTime() + 365 * 24 * 60 * 60 * 1000); setCookie('name', n, now); //сохранение следующего cookie: setCookie('name2', n2, now);
Здесь параметр с именем n
сохранён с именем записи name
и сроком действия now
(=1 год).
Восстановить сохранённое значение можно из функции Restore()
таким кодом:
var s=getCookie ("name"); name=parseInt (s); //Аналогично для следующего cookie, если тип данных - строка, parseInt делать не нужно
Всё это очень удобно и полезно, единственное ограничение - не писать более 4 Кб с одной страницы.
К сожалению, ложкой дёгтя является то, что Opera 9/10 версий не поддерживает нормально события onunload. Рекомендуемая иногда замена на onbeforeunload также не срабатывает. В Internet Explorer, Mozilla Firefox и других браузерах onunload прекрасно работает.
Единственный путь, который я вижу для обеспечения совместимости уже написанных скриптов с "Оперой" при минимальном изменении кода - добавить в исходный текст скриптов строки вида
if (window.opera) Save (); //Совместимость с Opera
выполняемые там, где это уместно (по завершении хода в игре, через интервал времени, после нажатия пользователем кнопки и т.п.). Разумеется, я этого делать во всех скриптах не стал, подождём, пока захотят поддерживать общепринятые методы разработчики некорректно работающего браузера.
Случаются у "Оперы" и просто сбои, связанные с обработкой Cookies. Иногда помогает следующая процедура. Щёлкните по открытой странице правой кнопкой мыши, выберите "Изменить настройки сайта", на вкладке "Cookies" удалите все куки сайта. После этого они заново пропишутся, и проблема может исчезнуть.
При написании серверных скриптов мешает некорректная работа "Оперы" с кэшами, при программной прокрутке документов - отсутствие поддержки метода scrollIntoView (решение здесь), в общем, мало где, кроме России, (и своей Родины - Норвегии) известный браузер "Опера" создаёт разработчику массу неудобств и несовместимостей, повторяя "войну браузеров" IE и NN на новом уровне.
гостевая; E-mail |