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 на новом уровне.

Рейтинг@Mail.ru

вверх гостевая; E-mail