Читайте также: |
|
Пример 16.1 объединяет все аспекты cookie, которые мы до сих пор обсуждали. Сначала пример определяет класс Cookie. При создании объекта Cookie вы указываете объект Document, имя cookie и (необязательно) время окончания действия, путь, домен и логическое значение, указывающее, должен ли cookie быть защищен. После создания объекта Cookie можно установить в этом объекте произвольные строковые свойства. Значения этих свойств – это значения, которые будут храниться в cookie. Класс Cookie определяет три метода. Метод store() обходит в цикле все определенные пользователем свойства объекта Cookie и конкатенирует их имена и значения в одну строку, выступает в качестве значения cookie. Метод load() объекта Cookie читает свойство cookie объекта Document для получения значений всех cookie данного документа. Он ищет в этой строке значение cookie с указанным именем и затем разбивает это значение на отдельные имена и
значения, которые хранятся в качестве свойств объекта Cookie. И наконец, метод remove() объекта Cookie удаляет указанный cookie из документа.
За определением класса Cookie в примере 16.1 следует полезный и изящный способ использования cookie. Код этого примера несколько сложен, но стоит тщательного изучения. Можно начать с тестовой программы в конце примера, иллюстрирующей типичное применение класса Cookie.
Пример 16.1. Вспомогательный класс для работы с cookie
<script language="JavaScript1.1">
// Функция-конструктор: создает объект Cookie для указанного документа с
// указанным именем и необязательными атрибутами.
// Аргументы:
// document: Объект Document, для которого сохраняется cookie. Обязательный.
// name: Строка, задающая имя cookie. Обязательный.
// hours: Необязательное число, задающее количество часов, по
// прошествии которых cookie должен закончить свое действие.
// path: Необязательная строка, задающая атрибут path для cookie.
// domain: Необязательная строка, задающая атрибут domain для cookie.
// secure: Необязательное логическое значение, которое, будучи равно
// true, требует защиты при передаче cookie.
//
function Cookie(document, name, hours, path, domain, secure)
{
// Все предопределенные свойства этого объекта начинаются с символа '$', чтобы
// отличить их от других свойств, являющихся значениями, предназначенными
// для хранения в cookie.
this.$document = document;this.$name = name;
if (hours)
this.$expiration = new Date((new Date()).getTime() + hours*3600000);
else this.$expiration = null;
if (path) this.$path = path; else this.$path = null;
if (domain) this.$domain = domain; else this.$domain = null;
if (secure) this.$secure = true; else this.$secure = false;
}
// Эта функция является методом store() объекта Cookie.
Cookie.prototype.store = function () {
// Сначала выполняем цикл по свойствам объекта Сookie и собираем
// значение cookie. Так как cookie используют знаки равенства и
// точки с запятой в качестве разделителей, для индивидуальных
// переменных состояния, хранящихся в одном значении cookie, мы
// будем использовать двоеточния и амперсанды. Обратите внимание,
// что мы кодируем каждую переменную состояния с помощью функции
// escape() на тот случай, если она содержит знаки пунктуации или
// другие недопустимые символы.
var cookieval = "";
for(var prop in this) {
// Игнорирует свойства с именами, начинающимися с '$', а также методы
if ((prop.charAt(0) == '$') || ((typeof this[prop]) == 'function'))
continue;
if (cookieval!= "") cookieval += '&';
cookieval += prop + ':' + escape(this[prop]);
}
// Теперь, когда у нас есть значение cookie, собираем вместе
// полную строку cookie, включающую имя и различные атрибуты, указанные
// при создании объекта Cookie.
var cookie = this.$name + '=' + cookieval;
if (this.$expiration)
cookie += '; expires=' + this.$expiration.toGMTString();
if (this.$path) cookie += '; path=' + this.$path;
if (this.$domain) cookie += '; domain=' + this.$domain;
if (this.$secure) cookie += '; secure';
// Теперь сохраняем cookie, устанавливая «магическое» свойство
// Document.cookie.
this.$document.cookie = cookie;
}
// Эта функция является методом load() объекта Cookie
Cookie.prototype.load = function() {
// Сначала получаем список всех cookie, относящихся к этому документу.
// Мы делаем это путем чтения «магического» свойства Document.cookie.
var allcookies = this.$document.cookie;
if (allcookies == "") return false;
// Теперь извлекаем из этого списка только cookie с указанным именем.var start = allcookies.indexOf(this.$name + '=');
if (start == -1) return false; // Для этой страницы cookie не определены
start += this.$name.length + 1; // Пропускаем имя и знак равенства
var end = allcookies.indexOf(';', start);
if (end == -1) end = allcookies.length;
var cookieval = allcookies.substring(start, end);
// После извлечения значения указанного cookie мы должны разбить
// это значение на несколько отдельных переменных состояния.
// Пары имя/значение отделяются друг от друга амперсандами, а
// отдельные имена отделяются от значений двоеточиями. Для всех
// этих операций мы используем метод split().
var a = cookieval.split('&'); // Разбиваем на элементы массива пар “имя/значение”
for(var i=0; i < a.length; i++) // Разбиваем каждую пару на два элемента массива
a[i] = a[i].split(':');
// После разбора значения cookie устанавливаем все имена и значения
// переменных состояния в объекте в данном объекте Cookie. Обратите
// внимание на использование функции unescape() для значения свойства;
// она нужна потому, что при сохранении значений мы вызывали escape().
for(var i = 0; i < a.length; i++) {
this[a[i][0]] = unescape(a[i]);
}
// Все готово, поэтому возвращаем код успешного завершения
return true;
}
// Эта функция является методом remove() объекта Cookie
Cookie.prototype.remove = function() {
var cookie;
cookie = this.$name + '=';
if (this.$path) cookie += '; path=' + this.$path;
if (this.$domain) cookie += '; domain=' + this.$domain;
cookie += '; expires=Fri, 02-Jan-1970 00:00:00 GMT';
this.$document.cookie = cookie;
}
//===================================================================
// Приведенный выше код является определением класса Cookie.
// Следующий код – это пример применения этого класса.
//===================================================================
// Создаем cookie, который мы будем использовать для сохранения
// состояния этой веб-страницы. Так как мы используем путь по умолчанию,
// этот cookie будет использоваться для всех веб-страниц, расположенных в
// том же каталоге или “ниже” его. Следовательно, cookie должен иметь
// имя, уникальное среди всех этих страниц. Обратите внимание, что мы
// устанавливаем дату окончания действия через десять дней после текущего// момента.
var visitordata = new Cookie(document, "name_color_count_state", 240);
// Сначала пытаемся прочитать данные, хранящиеся в cookie. Если cookie
// не определен или не содержит нужных нам данных, запрашиваем данные
// у пользователя.
if (!visitordata.load() ||!visitordata.name ||!visitordata.color) {
visitordata.name = prompt("Ваше имя:", "");
visitordata.color = prompt("Ваш любимый цвет:", "");
}
// Отслеживаем, сколько раз пользователь посещал страницу:
if (visitordata.visits == null) visitordata.visits = 0;
visitordata.visits++;
// Сохраняем значения cookie, даже если они уже сохранялись, чтобы
// была установлена дата окончания действия, на 10 дней более поздняя, чем
// последний визит. Кроме того, снова сохраняем cookie, чтобы была
// сохранена обновленная переменная состояния visits.
visitordata.store();
// Теперь мы можем использовать прочитанные нами переменные состояния:
document.write('<font size="7" color="' + visitordata.color + '">' +
Добро пожаловать, ' + visitordata.name + '!' +
'</font>' +
'<p>Вы посещали страницу ' + visitordata.visits + ' раз.');
</script>
<form>
<input type="button" value="Забудьте мое имя" onclick="visitordata.remove();">
</form>
JavaScript и куки (cookie)
JavaScript дает возможность устанавливать и читать куки в браузере. В данном уроке мы рассмотрим как происходит работа с куками, а также сделаем простую страницу, которая будет помнить введеное имя и отображать его при каждом входе.
Дата добавления: 2015-08-27; просмотров: 43 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Cookies и хранение состояния | | | Сохранение куки |