Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
document. write(" страницы при помощи переключателей,");
document. write(" расположенных на главной странице.");
document. write("<P>Настройки будут использованы, когда вы");
document. write(" посетите эту страницу в следующий раз.");
}
else
{
var szCnt = findCookie("Count");
var i=0;
if(szCnt!= "")
{
i = szCnt;
i++;
szCnt = i. toString();
addCookie("Count",szCnt,10);
}
document. write("<H2>Рады видеть вас снова!</H2>");
document. write("Вы посетили эту страницу в " + szCnt. bold() + " раз.");
document. bgColor=findCookie("bgColor");
}
}
function chkRadio(form, value)
{
szColor = value;
addCookie("bgColor",szColor,10);
}
function setDefault(form)
{
removeCookie('Count');
szColor="White";
}
// -->
</SCRIPT>
</HEAD>
<BODY BGCOLOR=white>
<H1>Посетите вашу персональную страницу</H1>
<FORM NAME="TestForm">
<P>
<INPUT TYPE="button" VALUE="Переход на страницу"
onClick="btnGo();">
<P><HR>
<P>Настройка параметров персональной страницы
<P><B>Цвет фона:</B>
<P><INPUT TYPE="radio" NAME="Color" CHECKED VALUE="White"
onClick="if(this. checked) {chkRadio(this. form, this. value);}"> Белый
<BR><INPUT TYPE="radio" NAME="Color" VALUE="Yellow"
onClick="if(this. checked) {chkRadio(this. form, this. value);}"> Желтый
<BR><INPUT TYPE="radio" NAME="Color" VALUE="Lime"
onClick="if(this. checked) {chkRadio(this. form, this. value);}"> Зеленый
<BR><INPUT TYPE="radio" NAME="Color" VALUE="Fuchsia"
onClick="if(this. checked) {chkRadio(this. form, this. value);}"> Малиновый
<P>
<INPUT TYPE="reset" VALUE="Параметры по умолчанию"
onClick="setDefault(this. form);">
</FORM>
</BODY>
</HTML>
Помимо функций addCookie, findCookie и removeCookie, предназначенных для работы с cookie, в сценарии определена переменная szColor, предназначенная для хранения выбранного пользователем цвета фона, а также функции btnGo, chkRadio и setDefault.
Функция btnGo прежде всего проверяет наличие параметра cookie с именем Count. Если такого параметра нет, сценарий считает, что пользователь просматривает этот документ в первый раз. В этом случае функция btnGo добавляет два параметра cookie с именами Count и bgColor:
addCookie("Count","0",10);
addCookie("bgColor",szColor,10);
Первый из них предназначен для хранения счетчика посещений, а второй - для хранения цвета фона.
Далее функция btnGo формирует документ HTML с приглашением для пользователя, просматривающего документ в первый раз, и завершает свою работу.
В том случае, когда сразу после вызова функция btnGo нашла параметр cookie с именем Count и получила его значение, это значение увеличивается на единицу и записывается обратно. Кроме того, оно отображается в тексте документа:
document. write("<H2>Рады видеть вас снова!</H2>");
document. write("Вы посетили эту страницу в " +
szCnt. bold()+" раз.");
Затем функция btnGo устанавливает цвет фона сформированного документа HTML в соответствии со значением, извлеченным из параметра cookie с именем bgColor:
document. bgColor=findCookie("bgColor");
Функция chkRadio вызывается, когда пользователь включает один из переключателей выбора цвета:
function chkRadio(form, value)
{
szColor = value;
addCookie("bgColor",szColor,10);
}
Эта функция записывает значение выбранного цвета в переменную szColor, а также в параметр cookie с именем bgColor.
И, наконец, функция setDefault удаляет параметр cookie с именем Count и устанавливает в переменной szColor белый цвет фона, принятый по умолчанию:
function setDefault(form)
{
removeCookie('Count');
szColor="White";
}
Эта функция вызывается, когда пользователь нажимает кнопку с надписью "Параметры по умолчанию":
<INPUT TYPE="reset" VALUE="Параметры по умолчанию"
onClick="setDefault(this. form);">
Обратите внимание, что данная кнопка имеет тип reset. Когда пользователь нажимает на нее, в форме включается переключатель, задающий белый цвет фона. Это происходит потому, что указанный переключатель определен с параметром CHECKED, а кнопка типа reset устанавливает все органы управления формы в исходное состояние.
Получение cookie расширением сервера Web
В этом разделе мы приведем пример документа HTML, создающего cookie, а также исходные тексты расширения сервера ISAPI, отображающее на динамически создаваемой странице заголовки HTTP этого документа. Когда браузер создает cookie, расширение сервера получает заголовок HTTP_COOKIE и отображает его.
Наш документ аналогичен описанному ранее в разделе “Записная книжка Cookies Notepad” (рис. 7.8).

Рис. 7.8. Документ HTML, работающий с cookie и расширением сервера ISAPI
Дополнительно мы разместили в документе кнопку Send. С помощью этой кнопки содержимое окна редактирования и заголовок HTTP_COOKIES передается расширению ISAPI сервера Web.
Расширение ISAPI отображает содержимое cookie, как это показано на рис. 7.9.

Рис. 7.9. Результат работы расширения ISAPI
Исходный текст документа HTML вы найдете в листинге 7.4.
Листинг 7.4. Файл chapter7/NotebookISAPI/NotebookISAPI. html
<HTML>
<HEAD>
<TITLE>Cookies demo</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
function addCookie(szName, szValue, dtDaysExpires)
{
var dtExpires = new Date();
var dtExpiryDate = "";
dtExpires. setTime(dtExpires. getTime() + dtDaysExpires * 24 * 60 * 60 * 1000);
dtExpiryDate = dtExpires. toGMTString();
document. cookie = szName + "=" + escape(szValue) + ";
expires=" + dtExpiryDate;
}
function findCookie(szName)
{
var i = 0;
var nStartPosition = 0;
var nEndPosition = 0;
var szCookieString = document. cookie;
var szTemp = "";
while (i <= szCookieString. length)
{
nStartPosition = i;
nEndPosition = nStartPosition + szName. length;
if(szCookieString. substring(
nStartPosition, nEndPosition) == szName)
{
nStartPosition = nEndPosition + 1;
nEndPosition =
document. cookie. indexOf(";",nStartPosition);
if(nEndPosition < nStartPosition)
nEndPosition = document. cookie. length;
szTemp =
document. cookie. substring(
nStartPosition, nEndPosition);
return unescape(szTemp);
break;
}
i++;
}
return "";
}
function removeCookie(szName)
{
var dtExpires = new Date();
dtExpires. setTime(dtExpires. getTime() - 1);
var szValue = findCookie(szName);
document. cookie = szName + "=" + szValue +
"; expires=" + dtExpires. toGMTString();
}
function btnClick()
{
addCookie("MyText",ment. value,10);
}
// -->
</SCRIPT>
</HEAD>
<BODY BGCOLOR=white>
<H1>Cookies Notepad</H1>
<FORM NAME="TestForm" METHOD=POST ACTION="http://frolov/scripts/ishello. dll?">
<P><TEXTAREA NAME="Comment"
ROWS="5" COLS="25" WRAP="physical">
</TEXTAREA>
<P><INPUT TYPE="button" VALUE="Store text"
onClick="btnClick();">
<INPUT TYPE="button" VALUE="Clear text"
onClick =
"removeCookie('MyText');ment. value=''">
<P><INPUT TYPE=submit VALUE="Send">
</FORM>
<SCRIPT LANGUAGE="JavaScript">
<!--
var szMyText="";
szMyText = findCookie("MyText");
if(szMyText!= "")
{
ment. value = szMyText;
}
// -->
</SCRIPT>
</BODY>
</HTML>
В нем, по сравнению с документом из раздела “Записная книжка Cookies Notepad”, мы добавили параметр ACTION в оператор <FORM>, а также кнопку типа submit с надписью Send. С помощью этой кнопки данные из формы отправляются расширению ISAPI:
. . .
<FORM NAME="TestForm" METHOD=POST ACTION="http://frolov/scripts/ishello. dll?">
. . .
<INPUT TYPE=submit VALUE="Send">
. . .
Исходный текст расширения ISAPI представлен в листинге 7.5. Он сделан на базе примера, взятого из 29 тома нашей “Библиотеки системного программиста” (раздел “Приложение ISHELLO” восьмой главы).
Листинг 7.5. Файл chapter7/NotebookISAPI/ishello. c
// ===============================================
// Расширение ISAPI ishello. c
// Пример расширения ISAPI, отображающего
// содержимое cookie
//
// (C) , 1997, 1998
// E-mail: *****@***apc. org
// WWW: http://www. *****/~frolov
// или
// http://www. dials. *****/frolov
// ===============================================
#include <windows. h>
#include <httpext. h>
// =========================================================
// Функция GetExtensionVersion
// Запись версии интерфейса ISAPI и
// строки описания расширения
// =========================================================
BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO *pVer)
{
// Записываем версию интерфейса ISAPI
pVer->dwExtensionVersion =
MAKELONG(HSE_VERSION_MINOR, HSE_VERSION_MAJOR );
// Записываем строку описания расширения
lstrcpyn(pVer->lpszExtensionDesc,
"Cookie show ISAPI DLL", HSE_MAX_EXT_DLL_NAME_LEN);
return TRUE;
}
// =========================================================
// Функция HttpExtensionProc
// =========================================================
DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *lpECB)
{
CHAR szBuff[4096];
CHAR szTempBuf[4096];
DWORD dwSize;
// Нулевой код состояния - признак успешного выполнения
lpECB->dwHttpStatusCode = 0;
// Записываем в буфер заголовок HTTP и начальный
// фрагмент формируемого динамически документа HTML
wsprintf(szBuff,
"Content-Type: text/html\r\n\r\n"
"<HTML><HEAD><TITLE>Simple ISAPI Extension</TITLE></HEAD>\n"
"<BODY BGCOLOR=#FFFFFF><H2>Hello from ISAPI Extension!</H2>\n");
// Добавляем разделительную линию
strcat(szBuff, "<HR>");
// Добавляем версию интерфейса ISAPI
wsprintf(szTempBuf, "<P>Extension Version: %d.%d",
HIWORD(lpECB->dwVersion), LOWORD(lpECB->dwVersion));
strcat(szBuff, szTempBuf);
// Название метода передачи данных
wsprintf(szTempBuf, "<BR>Method: %s", lpECB->lpszMethod);
strcat(szBuff, szTempBuf);
// Строка параметров запуска расширения ISAPI
wsprintf(szTempBuf, "<BR>QueryString: %s",
lpECB->lpszQueryString);
strcat(szBuff, szTempBuf);
// Физический путь к программному файлу расширения ISAPI
wsprintf(szTempBuf, "<BR>PathTranslated: %s",
lpECB->lpszPathTranslated);
strcat(szBuff, szTempBuf);
// Полный размер данных, которые нужно получить
wsprintf(szTempBuf, "<BR>TotalBytes: %d",
lpECB->cbTotalBytes);
strcat(szBuff, szTempBuf);
// Тип данных
wsprintf(szTempBuf, "<BR>ContentType: %s",
lpECB->lpszContentType);
strcat(szBuff, szTempBuf);
// Отображаем содержимое COOKIE
strcat(szBuff, "<HR><P><B>Cookie:</B><BR>");
dwSize = 4096;
lpECB->GetServerVariable(lpECB->ConnID,
(LPSTR)"HTTP_COOKIE", (LPVOID)szTempBuf, &dwSize);
strcat(szBuff, szTempBuf);
// Конечный фрагмент документа HTML
strcat(szBuff, "</BODY></HTML>");
// Посылаем содержимое буфера удаленному пользователю
if(!lpECB->ServerSupportFunction(lpECB->ConnID,
HSE_REQ_SEND_RESPONSE_HEADER, NULL, NULL,
(LPDWORD)szBuff))
{
// Если послать данные не удалось,
// завершаем работу нашего расширения ISAPI
// с кодом ошибки
return HSE_STATUS_ERROR;
}
// Записываем код успешного завершения
lpECB->dwHttpStatusCode = 200;
// Возвращаем принак успешного завершения
return HSE_STATUS_SUCCESS;
}
Файл определения модуля для библиотеки DLL расширения приведен в листинге 7.6.
Листинг 7.6. Файл chapter7/NotebookISAPI/ishello. def
LIBRARY ishello
DESCRIPTION 'Simple ISAPI DLL'
EXPORTS
GetExtensionVersion
HttpExtensionProc
Для извлечения значения cookie, предаваемого расширению через заголовки HTTP, мы использовали функцию GetServerVariable, указав ей в качестве второго параметра имя интересующей нас переменной HTTP_COOKIE:
lpECB->GetServerVariable(lpECB->ConnID,
(LPSTR)"HTTP_COOKIE", (LPVOID)szTempBuf, &dwSize);
Полученное таким образом значение дописывается в буфер динамически создаваемого документа HTML. Этот буфер впоследствии будет отправлен клиенту при помощи функции ServerSupportFunction.
Счетчик посещений на базе cookie и программы CGI
Последний пример, приведенный в этой главе, показывает основные приемы работы с cookie в программах CGI и сценарии JavaScript, вставляемом в тело динамически формируемого документа HTML.
Внешний вид исходного документа HTML, вызывающего программы CGI, показан на рис. 7.10.

Рис. 7.10. Документ HTML, вызывающий программу CGI
Как видно из этого рисунка, в документе определена форма с двумя кнопками. Обе эти кнопки предназначены для вызова одной и той же программы CGI, но с разными параметрами.
Если нажать на кнопку с надписью Go to page, программа GCI создаст документ HTML, предварительно проанализировав заголовок пришедшего к ней запроса на предмет наличия в нем информации о cookie. Кнопка Remove All Cookies предназначена для вызова программы CGI с целью удаления cookie.
В том случае, когда этой информации нет, программа CGI динамически сформирует документ HTML, добавив к его заголовку HTTP заголовок Set-Cookie (рис. 7.11).

Рис. 7.11. Документ HTML, создаваемый программой CGI при первом посещении
При последующих посещениях cookie уже определен, и наша программа CGI получает его значение, интерпретируя это значение как счетчик посещений. Затем она увеличивает значение счетчика на единицу, и записывает заголовок Set-Cookie в заголовок HTTP создаваемого документа HTML с новым значением cookie.
Значение счетчика посещений отображается в теле документа (рис. 7.12).

Рис. 7.12. Документ HTML, создаваемый программой CGI при третьем посещении
Далее программа CGI вставляет в текст этого документа сценарий JavaScript, расположенный в отдельном файле. Данный сценарий определяет значение cookie своими средствами и отображает его вместе со значением счетчика посещений в многострочном окне редактирования.
Исходный документ HTML представлен в листинге 7.7.
Листинг 7.7. Файл chapter7/AgainCGI/AgainCGI. html
<HTML>
<HEAD>
<TITLE>Cookies demo</TITLE>
</HEAD>
<BODY BGCOLOR=white>
<H1>Visit our page!</H1>
<FORM METHOD=POST ACTION="http://frolov/scripts/again. exe? go">
<P><INPUT TYPE="submit" VALUE="Go to page">
</FORM>
<FORM METHOD=POST ACTION="http://frolov/scripts/again. exe? clear">
<P><INPUT TYPE="submit" VALUE="Remove All Cookies">
</FORM>
</BODY>
</HTML>
В этом документе определены две формы.
Первая форма предназначена для вызова программы CGI с параметром go, а вторая - с параметром clear.
Исходный текст программы CGI, использованной в нашем примере, вы найдете в листинге 7.8.
Листинг 7.8. Файл chapter7/AgainCGI/Again. c
// ===============================================
// Расширение CGI, предназначенное для
// работы с cookie
//
// (C) , 1998
// E-mail: *****@***apc. org
// WWW: http://www. *****/~frolov
// или
// http://www. dials. *****/frolov
// ===============================================
#include <windows. h>
#include <stdio. h>
#include <stdlib. h>
#include <string. h>
// Прототипы функций, определенных в нашей программе
char *findCookie(char * szName);
void insertHTML(char * pszFileName, char * pszBuf);
void main(int argc, char *argv[])
{
char * pszQueryString;
char * pszCookie;
char * pszMyCookie;
int nCount;
char szBuf[4096];
char szBuf1[20];
// Заголовок для добавления cookie
char szCookieHeader[] =
"Set-Cookie: AgainCount=0;\r\nContent-type: text/html\r\n\r\n";
// Заголовок для удаления cookie
char szCookieRemoveHeader[] =
"Set-Cookie: AgainCount=0;expires=Mon 03-May-1993 12:00:00 GMT;"
"\r\nContent-type: text/html;\r\n\r\n";
// Получаем параметр запуска CGI
pszQueryString = getenv("QUERY_STRING");
// Получаем строку Cookie из заголовка HTTP
pszCookie = getenv("HTTP_COOKIE");
// Посещение страницы
if(!strcmp(pszQueryString, "go"))
{
// Если cookie не обнаружен, создаем его
if(pszCookie == NULL)
{
// Выводим заголовок для создания cookie
printf("Content-type: text/html\r\n");
printf(szCookieHeader);
// Выводим приглашение для первого посещения
printf("<HTML><HEAD><TITLE>Cookie
demo</TITLE></HEAD><BODY>");
printf("<H2>Welcome to our page!</H2>");
}
else
{
// Получаем значение параметра cookie
// с именем AgainCount
pszMyCookie = findCookie("AgainCount");
if(pszMyCookie!= NULL)
{
// Преобразуем это значение в число и увеличиваем
// на единицу при каждом посещении
nCount = atoi(pszMyCookie);
nCount++;
sprintf(szBuf1, "%d", nCount);
// Выводим заголовок для обновления cookie
printf("Content-type: text/html\r\n");
strcpy(szBuf, "Set-Cookie: AgainCount=");
strcat(szBuf, szBuf1);
strcat(szBuf, ";\r\nContent-type: text/html\r\n\r\n");
printf(szBuf);
// Выводим приглашение для повторных посещений
printf("<H2>Welcome to our page AGAIN!</H2>");
// Выводим счетчик посещений
printf("<P>Access count: %s",szBuf1);
// Вставляем документ HTML с текстом сценария
// JavaScript, который тоже работает с cookie
insertHTML("script. ht", szBuf);
printf(szBuf);
}
}
}
// Удаление cookie
else if(!strcmp(pszQueryString, "clear"))
{
// Выводим заголовок для удаления cookie
printf("Content-type: text/html\r\n");
printf(szCookieRemoveHeader);
// Выводим сообщение об успешном удалении cookie
printf("<HTML><HEAD><TITLE>Cookie demo</TITLE></HEAD><BODY>");
printf("<P>Cookie Removed");
}
printf("</BODY></HTML>");
}
// ---
// findCookie
// Получение значение параметра cookie по его
// имени
// ---
char *findCookie(char * szName)
{
char * pszCookie;
char * pszBegin;
char * pszEnd;
char szBuf[4096];
// Получаем текстовую строку cookie
pszCookie = getenv("HTTP_COOKIE");
if(pszCookie!= NULL)
{
// Копируем ее в рабочий буфер
strcpy(szBuf, pszCookie);
// Ищем в строке имя параметра
pszBegin = strstr(szBuf, szName);
if(pszBegin == NULL)
return NULL;
else
{
// Пропускаем символ равенства
pszBegin += strlen(szName) + 1;
// Ищем символ ; и заменяем его на
// двоичный нуль
pszEnd = strstr(pszBegin, ";");
if(pszEnd!= NULL)
*pszEnd = 0;
// Возвращаем значение параметра
return pszBegin;
}
}
}
// ---
// insertHTML
// Вставка в буфер содержимого текстового файла
// ---
void insertHTML(char * pszFileName, char * pszBuf)
{
HFILE hSrcFile;
DWORD dwFileSize;
// Открываем файл
hSrcFile = _lopen(pszFileName, OF_READ);
// Определяем его длину
dwFileSize = _llseek(hSrcFile, 0, 2);
// Устанавливаем указатель на начало файла
_llseek(hSrcFile, 0, 0);
// Читаем файл в буфер
_hread(hSrcFile, pszBuf, dwFileSize);
// Закрываем буфер двоичным нулем
pszBuf[dwFileSize] = '\0';
// Закрываем файл
_lclose(hSrcFile);
}
В переменной szCookieHeader мы подготовили заголовок Set-Cookie, предназначенный для создания параметра cookie с именем AgainCount:
char szCookieHeader[] =
"Set-Cookie: AgainCount=0;\r\nContent-type: text/html\r\n\r\n";
Начальное значение этого параметра равно нулю.
Заголовок, хранящийся в переменной szCookieRemoveHeader, предназначен для удаления cookie:
char szCookieRemoveHeader[] =
"Set-Cookie: AgainCount=0;expires=Mon 03-May-1993 12:00:00 GMT;\r\nContent-type: text/html;\r\n\r\n";
Эффект удаления достигается благодаря тому, что в параметре expires мы указали уже наступившую дату.
Сразу после запуска программа CGI получает значение переменных среды QUERY_STRING и HTTP_COOKIE:
pszQueryString = getenv("QUERY_STRING");
pszCookie = getenv("HTTP_COOKIE");
В первой из них хранится параметр запуска программы CGI, а во второй - строка cookie (если она определена).
Далее наша программа анализирует параметр запуска.
Если программа вызвана с параметром go, она проверяет переменную pszCookie. В эту переменную функция getenv записывает строку cookie или значение NULL, если cookie не определено.
При первом посещении cookie еще нет, поэтому наша программа добавляет к заголовку HTTP формируемого документа заголовок Set-Cookie:
printf("Content-type: text/html\r\n");
printf(szCookieHeader);
Затем программа выводит приглашение для первого посещения и завершает свою работу.
В том случае, если в принятом запросе уже имеется информация о cookie, программа CGI извлекает значение параметра cookie с именем AgainCount, вызывая для этого функцию findCookie:
pszMyCookie = findCookie("AgainCount");
Эта функция определена в нашей программе и будет описана чуть позже.
Полученная строка преобразуется в численное значение при помощи функции atoi, после чего это значение увеличивается на единицу, преобразуется обратно в тестовую строку и записывается в буфер szBuf1:
nCount = atoi(pszMyCookie);
nCount++;
sprintf(szBuf1, "%d", nCount);
На следующем этапе программа формирует заголовок Set-Cookie с новым значением параметра AgainCount:
printf("Content-type: text/html\r\n");
strcpy(szBuf, "Set-Cookie: AgainCount=");
strcat(szBuf, szBuf1);
strcat(szBuf, ";\r\nContent-type: text/html\r\n\r\n");
printf(szBuf);
Этот заголовок вместе с заголовком Content-type записывается в создаваемый документ HTML.
Далее после вывода приглашения для повторного посещения страницы программа CGI записывает в документ новое значение счетчика посещений:
printf("<P>Access count: %s",szBuf1);
И, наконец, перед завершением своей работы программа вставляет в текст документа HTML файл со сценарием JavaScript, вызывая для этого функцию insertHTML:
insertHTML("script. ht", szBuf);
Эта функция определена в нашей программе, как и функция findCookie.
Когда программа CGI вызывается для удаления cookie с параметром clear, она выводит специально предназначенный для этого заголовок с просроченной датой:
printf("Content-type: text/html\r\n");
printf(szCookieRemoveHeader);
Теперь мы кратко расскажем о работе функции findCookie.
Получив текстовую строку cookie при помощи функции getenv, эта функция копирует строку в рабочий буфер, который можно редактировать (напомним, что содержимое буфера, полученного от функции getenv, изменять нельзя).
Далее, вызывая функцию strstr, мы ищем в рабочем буфере имя нужного нам параметра cookie. Если это имя найдено, то мы пропускаем символ равенства, ищем символ разделителя ‘;’ и заменяем его на двоичный нуль. После выполнения всех этих действий наша функция возвращает адрес искомой строки со значением нужного нам параметра cookie.
Функция insertHTML просто открывает файл, имя которого передается ей в качестве параметра, читает его содержимое в оперативную память, и затем в буфер, адрес которого передается через второй параметр.
Текст сценария, вставляемого функцией insertHTML в динамически формируемый документ HTML, представлен в листинге 7.9.
Листинг 7.9. Файл chapter7/AgainCGI/script. ht
<HR>
<P>Cookie information from JavaScript:
<FORM NAME="TestForm">
<P><TEXTAREA NAME="Comment"
ROWS="3" COLS="25">
</TEXTAREA>
</FORM>
<SCRIPT LANGUAGE="JavaScript">
<!--
function findCookie(szName)
{
var i = 0;
var nStartPosition = 0;
var nEndPosition = 0;
var szCookieString = document. cookie;
var szTemp = "";
while (i <= szCookieString. length)
{
nStartPosition = i;
nEndPosition = nStartPosition + szName. length;
if(szCookieString. substring(nStartPosition, nEndPosition) == szName)
{
nStartPosition = nEndPosition + 1;
nEndPosition = document. cookie. indexOf(";",nStartPosition);
if(nEndPosition < nStartPosition)
nEndPosition = document. cookie. length;
szTemp = document. cookie. substring(nStartPosition, nEndPosition);
return unescape(szTemp);
break;
}
i++;
}
return "";
}
var szMyText="";
szMyText = findCookie("AgainCount");
if(szMyText!= "")
{
ment. value =
"Cookie: " + document. cookie + "\nAccess count: " + szMyText;
}
// -->
</SCRIPT>
С функцией findCookie вы уже знакомы. Она предназначена для получения значения параметра cookie по его имени.
После завершения загрузки документа HTML наш сценарий при помощи этой функции получает текущее значение параметра cookie с именем AgainCount, установленное программой CGI:
var szMyText="";
szMyText = findCookie("AgainCount");
Далее это значение добавляется к полной строке cookie и отображается в многострочном поле редактирования:
ment. value =
"Cookie: " + document. cookie + "\nAccess count: " + szMyText;
Форма, содержащая поле редактирования, определена в начале вставляемого файла сценария JavaScript.
Настройка браузера для работы с cookie
Хотя cookie не представляют собой никакой опасности для пользователей, не все пожелают, чтобы хранящаяся в них информация передавалась на сервер Web. В сочетании с другими полями заголовка HTTP данные cookie позволяют собирать определенную статистику о пользователях, а это нравится далеко не всем.
Настраивая браузер соответствующим образом, пользователи могут ограничить или вовсе отключить возможность работы с cookie. Вы должны это учитывать, если при создании активных документов HTML надеетесь на использование cookie.
Браузер Microsoft Internet Explorer версии 4.0 допускает установку трех режимов работы с cookies. Эти режимы указываются на странице Advanced блокнота Internet Options (рис. 7.13), доступного из меню View браузера.

Рис. 7.13. Установка режимов работы с cookie
По умолчанию включен переключатель Always accept cookies, разрешающий использование cookie.
Переключатель Disable all cookie use полностью запрещает использование cookie.
Если включить переключатель Prompt before accepting cookies, при попытке установить cookies на экране появится предупреждающее сообщение (рис. 7.14).

Рис. 7.14. Предупреждающее сообщение при попытке записи данных cookie
Нажав кнопку More Info, вы можете получить подробные сведения о данных cookie, которые планируется записать на диск вашего локального компьютера, а также просмотреть эти данные в поле Data.
Приложение 1. Работа с отладчиком Microsoft Script Debugger
Для отладки создаваемых вами сценариев JavaScript удобно использовать специальные отладчики, например, отладчик Microsoft Script Debugger. Вы можете получить его бесплатно с сервера Microsoft, расположенного в Internet по адресу http://www. .
Установка отладчика Microsoft Script Debugger
Процедура установки отладчика Microsoft Script Debugger очень проста. Если у вас уже установлен браузер Microsoft Internet Explorer, то вам достаточно запустить загруженный из Internet дистрибутивный файл. Единственно, о чем необходимо позаботиться, это чтобы версия отладчика Microsoft Script Debugger соответствовала версии браузера Microsoft Internet Explorer.
После установки вам необходимо убедиться, что установки параметров браузера разрешают отладку сценариев JavaScript. Для этого запустите Microsoft Internet Explorer, и из меню View выберите строку Internet Options. На экране появится одноименная диалоговая панель, показанная на рис. 8.1.

Рис. 8.1. Диалоговая панель Internet Options
В этой панели вам нужно открыть страницу Advanced и выключить переключатель Disable script debugging, если он включен.
Процесс отладки сценария
Вы можете отлаживать сценарий в различных режимах, выполняя его по шагам, устанавливая точки останова, проверяя и изменяя содержимое переменных.
Запуск сценария в режиме отладки
Мы рассмотрим три способа запуска сценария в режиме отладки. Первый из них предполагает встраивание команды вызова отладчика непосредственно в текст сценария. При втором способе запуск отладчика выполняется из меню браузера Microsoft Internet Explorer. Третий способ - автоматический. Отладчик запускается автоматически, если в тексте сценария обнаружена ошибка.
Использование команды вызова отладчика
Если вам нужно проверить, как ведет себя та или иная строка сценария JavaScript, вы можете вставить перед этой строкой команду вызова отладчика debugger.
В качестве примера для изучения способов запуска отладчика мы будем использовать сценарий, исходный текст которого представлен в листинге 8.1.
Листинг 8.1. Файл chapter8/callDebugger. html
<HTML>
<HEAD>
<TITLE>Hello, world!</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
var szHelloMsg = "Hello, world!";
function printString(szString)
{
document. write(szString. bold());
}
function printHello()
{
debugger;
printString(szHelloMsg);
}
// -->
</SCRIPT>
</HEAD>
<BODY BGCOLOR=white>
<H1>JavaScript Test</H1>
<P>Message:
<SCRIPT LANGUAGE="JavaScript">
<!--
printHello();
// -->
</SCRIPT> </BODY>
</HTML>
Обратите внимание, что в функции printHello мы вставили строку вызова отладчика непосредственно перед обращением к функции printString.
Когда вы попробуете просмотреть этот документ в браузере Microsoft Internet Explorer версии 4.0 с установленным отладчиком Microsoft Script Debugger, на экране появится окно отладчика, показанное на рис. 8.2.

Рис. 8.2. Окно отладчика Microsoft Script Debugger
Обратите внимание, что строка вызова отладчика выделена цветом и отмечена стрелкой. Это текущая строка, на которой выполнение сценария было остановлено. Теперь вы можете просмотреть или изменить содержимое переменных, установить точки останова, а затем запустить сценарий в пошаговом режиме либо просто продолжить его выполнение.
Запуск отладчика через меню браузера
Для того чтобы запустить отладчик Microsoft Script Debugger через меню браузера, откройте меню View и выберите там меню второго уровня Script Debuger. В этом меню есть две строки: Open и Break at next Statement. Первая из них просто открывает окно отладчика, а вторая - запускает отладчик и останавливает сценарий на следующей строке. Вы можете попробовать оба режима, например, для одного из сценариев, приведенных нами в первой главе нашей книги.
Автоматический запуск отладчика при возникновении ошибки
Если в процессе интерпретации сценария JavaScript браузер обнаруживает ошибку, он выводит на экран диалоговую панель с сообщением об ошибке и предоставляет возможность запустить отладчик.
Вы можете попробовать этот режим на сценарии, представленном в листинге 8.2, куда мы намеренно внесли ошибку.
Листинг 8.2. Файл chapter8/error. html
<HTML>
<HEAD>
<TITLE>Hello, world!</TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
var szHelloMsg = "Hello, world!";
function printHello()
{
// Строка с ошибкой
document. Write(szHelloMsg. bold());
}
// -->
</SCRIPT>
</HEAD>
<BODY BGCOLOR=white>
<H1>JavaScript Test</H1>
<P>Message:
<SCRIPT LANGUAGE="JavaScript">
<!--
printHello();
// -->
</SCRIPT>
</BODY>
</HTML>
Сразу после запуска на экране появится диалоговая панель Internet Explorer Script Error, показанная на рис. 8.3.

Рис. 8.3. Сообщение об ошибке
Из текста сообщения ясно, что в седьмом по счету символе девятой строки документа HTML обнаружена ошибка: указанный в сценарии метод или свойство не определено для объекта.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |


