Сценарии JavaScript в активных страницах Web

Введение в JavaScript

Прежде чем приступить к созданию активных страниц Web с использованием JavaScript, рассмотрим особенности этого языка.
Язык программирования JavaScript не предназначен для создания автономных программ или аплетов, и в этом он сильно отличается от других языков, таких как С или Java. Конструкции JavaScript встраиваются непосредственно в исходный текст документов HTML и интерпретируются браузером  по мере загрузки этих документов. Более того, с помощью JavaScript вы можете динамически формировать и изменять текст загружаемого документа HTML.
JavaScript является интерпретируемым языком. Категорию языков, к которой относится JavaScript, в литературе называют языками сценариев или скриптами. Последний термин - жаргон, который получился в результате транслитерации слова Script, поэтому в нашей книге мы его не будем использовать.
Языки сценариев существовали давно. Они применялись, например, для автоматизации различных задач. В качестве примера можно привести язык сценариев UNIX, язык пакетных заданий MS-DOS или имеющий большее отношение к технологиям Internet язык Perl, предназначенный для создания программ CGI.
Еще одна важная особенность языка JavaScript - это его объектная ориентированность. И хотя объектно-ориентированные возможности JavaScript заметно беднее, чем в С++ или Java, они все же есть в этом языке. Программистам доступны многочисленные объекты, встроенные в браузер и загруженные в него документы HTML, такие как документы HTML, фреймы, формы, ссылки на другие документы и так далее. Допускается создание собственных классов, а также группирование объектов и структур данных для расширения базовых классов.
С помощью конструкций JavaScript, встроенных в документы HTML, можно обрабатывать события. Эти события возникают в результате выполнения пользователем различных операций над документом HTML, загруженным в окно браузера. Это позволяет получать различные визуальные эффекты, например, изменение внешнего вида органов управления, когда над ними находится курсор мыши. Можно предварительно проверять данные, введенных пользователем в полях формы перед их отправкой для обработки на сервер Web, а также выполнять произвольные действия перед загрузкой документа HTML в окно браузера и делать другую полезную работу.

Заметим, что JavaScript не предназначен для создания сложных программ. Подобные задачи лучше решать с использованием других языков программирования, например, с помощью Java. Однако с помощью JavaScript вы можете быстро создавать активные страницы с достаточно сложным поведением. Этот язык несложен в изучении, а программы, составленные с его использованием, легко поддаются отладке.
Когда в наших томах “Библиотеки системного программиста” мы рассказывали о стандартах на язык HTML, то обращали ваше внимание на различия в реализации этого стандарта для браузеров Netscape Navigator и Microsoft Internet Explorer. А как обстоит дело с совместимостью в случае языка JavaScript?
К сожалению, не очень хорошо. Несмотря на то что новые версии Microsoft Internet Explorer “понимают” язык JavaScript, существуют различные особенности. Фактически в браузере Microsoft Internet Explorer реализован язык сценариев Jscript, который хотя и совместим с JavaScript, но эта совместимость не является полной. Причина, вероятно, заключается в том, что Microsoft продвигает другой язык сценариев с названием VBScript, произошедший от языка Visual Basic. Возможно, мы посвятим VBScript одну из наших следующих книг.

Классы и объекты в JavaScript

Язык сценариев JavaScript является объектно-ориентированным, подобно языку программирования С++, однако в реализации объектов между этими языками есть весьма существенные отличия.
Объекты JavaScript представляют собой наборы свойств и методов. Можно сказать, что свойства объектов - это данные, связанные с объектом, а методы - функции для обработки данных объекта. Те из вас, кто программировал на языке С++, могут провести аналогию с полями и методами, определенными в классе.
Адресация свойств в сценариях JavaScript возможна либо по именам свойств, либо по их номеру. Последнее возможно благодаря тому, что все свойства объекта хранятся как элементы массива и потому каждое свойство имеет свой номер.

Работа с формами

Сценарии JavaScript очень часто применяются для предварительной обработки данных, введенных пользователями в формах. Проверенные данные затем могут предаваться расширениям CGI или ISAPI сервера Web. Кроме того, с помощью форм и сценариев JavaScript можно создавать активные страницы, способные получать от пользователя и обрабатывать произвольную информацию.
В предыдущих главах нашей книги мы уже рассказывали вам о некоторых приемах, с помощью которых сценарии могут извлекать данные из форм, а также обрабатывать события, связанные с органами управления, расположенными в формах. Теперь мы займемся более детальным изучением взаимодействия форм и сценариев JavaScript.

JavaScript и Фреймы

Для того чтобы работать сразу с несколькими документами HTML, можно предоставить пользователю многооконный интерфейс, реализованный при помощи фреймов. Подробно о фреймах мы рассказали в 29 томе “Библиотеки системного программиста”. Который называется “Сервер Web своими руками”.

Растровые изображения

Растровые изображения в виде файлов формата GIF и JPEG широко применяются в документах HTML, так как с их помощью можно значительно улучшить внешний вид страниц серверов Web.
К сожалению, возможности HTML не позволяют добиться достаточно сложных видеоэффектов без применения дополнительных средств, таких как аплеты Java, компоненты ActiveX и сценарии JavaScript. Фактически кроме статической графики вы можете использовать только анимационные изображения, построенные с применением многосекционных файлов GIF, и сегментированные графические изображения. Последние нужны для создания ссылок.
В этой главе мы рассмотрим некоторые возможности по графическому оформлению страниц серверов Web, которые будут в вашем распоряжении при использовании сценариев JavaScript.

Взаимодействие с аплетами Java

Наверное, вы уже почувствовали, что сценарии JavaScript служат как бы цементом для связывания различных объектов, расположенных в документе HTML. Например, с помощью JavaScript вы можете обрабатывать данные, полученные из полей одной формы, и отображать результаты обработки в полях той же самой или другой формы.
Еще одна интересная возможность взаимодействия сценариев JavaScript с объектами документа HTML, которую мы рассмотрим в нашей книге, это связь сценариев и аплетов Java. Оказывается, из сценариев JavaScript вы можете обращаться к полям и методам аплетов Java.
Языку программирования Java мы посвятили 30 и 32 тома “Библиотеки системного программиста”, которые называются, соответственно, “Microsoft Visual J++. Создание приложений. Часть 1” и “Microsoft Visual J++. Создание приложений. Часть 2”. Перед тем как читать главу нашей книги “Взаимодействие с аплетами Java” мы рекомендуем вам ознакомиться с этими томами.

Применение COOKIE

Возможно, изучая настройки браузера вы сталкивались с таким понятием, как cookie.
Что это такое?
Скажем сразу, что с кулинарным искусством это связано мало, хотя некоторую аналогию все же можно провести. Говоря кратко, cookie представляет собой свойство документа HTML. Данные cookie физически хранятся локально на компьютере пользователя, загрузившего к себе этот документ, в виде специального системного файла. С помощью cookie пользователь может настроить, или “приготовить” по собственному вкусу документ HTML, если для него предусмотрена такая настройка.
Проще всего представить себе cookie как набор строковых параметров, каждый из которых имеет имя и значение. Сценарий JavaScript может создавать cookie для документа HTML, определяя в нем произвольное количество параметров и задавая для них произвольные значения. После создания такой набор параметров становится принадлежностью данного конкретного документа HTML и может быть проанализирован, изменен или удален сценарием JavaScript.
Как мы уже говорили, основное, для чего нужно cookie - это для того, чтобы дать пользователю возможность настроить под свои потребности интерфейс активных документов HTML. Эти настройки могут анализироваться или не анализироваться сервером Web, но в любом случае они хранятся у пользователя. Настройки, разумеется, пропадут, если пользователь, скажем, отформатирует свой жесткий диск. После этого параметры настраиваемого документа HTML придется задавать заново.
Конечно, задачу индивидуальной настройки параметров страниц можно было бы решить и другими способами, например, при помощи расширений сервера Web, таких как программы CGI или приложения ISAPI. Для этого на сервере Web должна быть установлена база данных, хранящая настройки для всех зарегистрированных в ней пользователей.
В этом случае расширение сервера Web может динамически создавать настраиваемые документы HTML, используя для определения внешнего вида страниц параметры, хранящиеся в базе данных.
Наличие базы данных настройки пользователей усложняет сопровождение сервера Web, и потому неприемлемо во многих случаях. Например, если ваш сервер Web виртуальный и расположен на дисках сервера какого-либо провайдера Internet, создание базы данных может превратиться в трудно преодолимую проблему.
Возлагая на пользовательский браузер задачу хранения настроек отдельных документов HTML, вы сильно упрощаете задачу организации настройки диалогового интерфейса. А для этого как раз нужны cookie и сценарии JavaScript.
Еще одно практическое применение cookie - хранение товара, выбранное посетителем вашего сервера Web, выполняющего роль виртуального магазина. Покупатель может выбирать разный товар на разных страницах сервера, при этом полный заказ может вначале быть сформирован и сохранен в cookie, а затем по явному запросу пользователя отправлен на сервер.
Среди других применений cookie можно отметить сетевые игры. Вы можете, например, хранить в cookie текущее состояние игры или другие параметры.

Abs

Вычисление абсолютного значения.
Пример использования:
var nValueAbs;
nValueAbs = Math.abs(nValue);
Здесь в переменную nValueAbs записывается абсолютное значение переменной nValue.

Acos

Вычисление арккосинуса.
Пример использования:
var nValue;
nValue = Math.acos(nAngle);

Аннотация

В книге описан язык JavaScript, предназначенный для создания активных страниц сервера Web, а также классы JavaScript. На конкретных примерах исходных текстов документов HTML рассмотрены различные способы применения этого языка в формах и фреймах. Показано, как с помощью сценария JavaScript можно работать с графическими изображениями и анимацией.
В отдельных главах рассказано об организации взаимодействия программ JavaScript и аплетов Java, расположенных в документе HTML, а также о применении cookie для хранения данных посетителей сервера Web.
Книга предназначена для всех, кто интересуется созданием физических или виртуальных серверов Web в сети Internet, а также в корпоративной сети Intranet. Она может быть полезна разработчикам справочно-информационных систем, ориентирующихся на технологии, связанные с применением HTML.

Asin

Вычисление арксинуса.
Пример использования:
var nValue;
nValue = Math.asin(nAngle);

Atan

Вычисление арктангенса.
Пример использования:
var nValue;
nValue = Math.atan(nAngle);

Автоматический запуск отладчика при возникновении ошибки

Если в процессе интерпретации сценария JavaScript браузер обнаруживает ошибку, он выводит на экран диалоговую панель с сообщением об ошибке и предоставляет возможность запустить отладчик.
Вы можете попробовать этот режим на сценарии, представленном в листинге 8.2, куда мы намеренно внесли ошибку.
Листинг 8.2. Файл chapter8/error.html

 
    Hello, world!
   
 
 
   

JavaScript Test


    Message:
     
 

Сразу после запуска на экране появится диалоговая панель Internet Explorer Script Error, показанная на рис. 8.3.
Автоматический запуск отладчика при возникновении ошибки
Рис. 8.3. Сообщение об ошибке
Из текста сообщения ясно, что в седьмом по счету символе девятой строки документа HTML обнаружена ошибка: указанный в сценарии метод или свойство не определено для объекта.
Нажав кнопку Yes в панели Internet Explorer Script Error, будет запущен отладчик. Документ HTML с ошибкой будет загружен в окно отладчика, а текстовый курсор покажет ошибочную строку (рис. 8.4).
Автоматический запуск отладчика при возникновении ошибки
Рис. 8.4. Курсор указывает на строку с ошибкой

Авторский компакт-диск

В сентябре 1997 года в продаже появился авторский компакт-диск (как спецвыпуск журнала “Аурамедиа”), на котором вы можете найти наши первые книги серий “Библиотека системного программиста” и “Персональный компьютер. Шаг за шагом” в исходных текстах, дискеты ко всем книгам серии “Библиотека системного программиста”, статьи, написанные нами для периодических изданий, библиотеку программ FreeWare и ShareWare, ссылки на интересные ресурсы Internet, вернисаж художника Алексея Абрамкина и другую информацию.
Компакт-диск можно приобрести непосредственно в издательстве “Аурамедиа” и “Диалог-МИФИ”, а также по подписке.

Бегущий текст в строке состояния браузера

Решим одну очень распространенную задачу - отображение бегущего текста в строке состояния браузера (рис. 2.11).
Бегущий текст в строке состояния браузера
Рис. 2.11. Бегущий текст в строке состояния браузера
Строка состояния обычно используется браузерами для отображения различной информации, например, информации о выполнении текущей операции. Для того чтобы записать что-нибудь в строку состояния, необходимо изменить содержимое свойства status объекта window окна браузера.
Эту задачу можно решить, например, так:
window.status = “Новая строка”;
Для создания эффекта бегущей строки операцию обновления свойства status необходимо выполнять периодически, отображая текст с изменяющимся сдвигом. Однако не стоит делать это в цикле, так как в результате нормальная работа браузера будет нарушена.
В нашем сценарии (листинг 2.5) мы применим способ выполнения периодических процедур, основанный на использовании метода setTimeout, определенного для объекта window. Напомним, что этот метод позволяет организовать отложенное во времени выполнение команды, заданной первым параметром. Время, через которое команда будет запущена, указывается методу setTimeout вторым параметром.
Листинг 2.5. Файл chapter2/StatusScroll/StatusScroll.html

 
    Авторский компакт-диск
   

 

 

 

   

Новый выпуск авторского CD



   

    Первый выпуск нашего компакт-диска

уже появился в продаже. Информацию об этом, а также

следующем выпуске вы найдете на нашем сервере Web,

адрес которого отображается в окне состояния браузера

 



В области заголовка документа мы определили глобальные переменные szMsg, nSpace и nIteration, а также функцию sscroll.

Переменная szMsg инициализируется текстовым сообщением, которое будет непрерывно перемещаться в строке состояния браузера. Значение, записанное в переменную nSpace, определяет количество пробелов, которое будет добавлено к строке сообщения слева перед началом операции сдвига. И, наконец, переменная nIteration служит счетчиком сдвигов для функции sscroll.

Функция sscroll вызывается первый раз в теле документа:



 

Новый выпуск авторского CD



 

  . . .



В дальнейшем функция sscroll организует при помощи метода setTimeout свой собственный вызов, отложенный во времени на 50 миллисекунд, и завершает работу. Однако через указанное время наша функция будет вызвана вновь, и это будет продолжаться до тех пор, пока документ HTML, содержащий сценарий, остается загруженным в окно браузера.

Упрощенно структура функции sscroll показана ниже:

function sscroll()

{

  var cmd = "sscroll()";

    . . .

  // Отображение сообщения в строке состояния браузера

    . . .

  // Сдвиг сообщения влево на одну позицию

    . . .

  timer = window.setTimeout(cmd, 50);

}

После отображения сообщения в строке состояния и сдвига этого сообщения влево на одну позицию функция sscroll вызывает метод setTimeout, передавая ему через первый параметр переменную с командой, подлежащей выполнению, а через второй - время задержки, по прошествии которого данную команду нужно будет выполнить.


В качестве выполняемой команды мы указываем методу setTimeout вызов функции sscroll. Таким образом в нашем сценарии эта функция вызывается периодически.

В функции sscroll мы определили три локальные переменные. Переменная cmd хранит команду вызова функции sscroll. В переменной szOut мы подготавливаем текст, отображаемый в строке состояния браузера при каждом вызове функции sscroll.

Текстовая переменная szText используется как рабочая. В ней формируется сообщение для вывода.  Вначале в переменную szText записывается nSpace пробелов, а затем добавляется строка szMsg:

for (i=0 ; i < nSpace ; i++)

{   

  szText += " ";

}

szText += szMsg;

Для того чтобы при каждом вызове функции sscroll наше сообщение отображалось со сдвигом на одну позицию, мы извлекаем из переменной szText подстроку. Извлечение подстроки выполняется с помощью метода substring, определенного во встроенном классе текстовых строк String. Полученная подстрока записывается в свойство status объекта window и таким образом отображается в строке состояния:

szOut = szText.substring(nIteration, nSpace + nIteration);

window.status = szOut;

Первый параметр метода substring определяет начальную позицию подстроки внутри строки, а второй - конечную.

После отображения сообщения функция sscroll увеличивает значение глобального счетчика nIteration на единицу:

nIteration++;

Когда в результате сдвига сообщение полностью уходит из строки состояния, счетчик nIteration снова устанавливается в нулевое значение:

if(nIteration > nSpace + szMsg.length)

{

  nIteration = 0;

}

Обратите внимание, что общая длина сдвигаемой строки здесь вычисляется как сумма значения nSpace (количество начальных пробелов) и длины сообщения szMsg. Последняя определяется с помощью метода length, определенного во встроенном классе String.

Бинарные операторы

Бинарные операторы соединяют два операнда. В языке сценариев JavaScript предусмотрены бинарные операторы для вычитания, сложения, умножения, деления и вычисления остатка деления:

Бинарный оператор
Назначение
-
Вычитание
+
Сложение
*
Умножение
/
Деление
%
Вычисление остатка от деления

Эти операторы используются таким же образом, что и в языке программирования C, например:
i=0;        // начальное значение переменной i равно 0
i = i + 1;  // значение i равно 1
var j=9;    // значение переменной j равно 9
i = j / 2;  // значение переменной i равно 4
k = j % 2;  // значение переменной i равно 1

Ceil

Вычисление наименьшего целого значения, большего или равного аргументу функции.
Пример использования:
var nValue;
nValue = Math.ceil(nArg);

Числа

Язык сценариев JavaScript допускает использование чисел в различных форматах. Это целые числа, числа в формате с плавающей десятичной точкой и числа в научной нотации. Целые числа могут быть представлены по основанию 8, 10 или 16. Например:

Пример
Описание
25
Целое число по основанию 10
0137
Целое число по основанию 8
0xFF
Целое число по основанию 16
386.7
Число с плавающей десятичной точкой
25e5 или 25E5
Число в научной нотации, равно 2500000

В некоторых случаях арифметические функции могут возвращать так называемое “нечисло”, которое называется в JavaScript как NaN (Not a Number). “Нечисло” - это специальное значение, которое не соответствует никакому числу. Оно возникает в тех случаях, когда результат выполнения операции над числами не может быть представлен в виде числа. С помощью функции isNaN вы можете проверить, является ли значение “нечислом”.

Cos

Вычисление косинуса.
Пример использования:
var nValue;
nValue = Math.cos(nAngle);

Цветовое оформление документа

Большинство свойств объекта objects доступно сценарию JavaScript как для чтения, так и для записи. Сначала мы попробуем динамически изменить цветовое оформление документа HTML, показанного на рис. 2.18.
Цветовое оформление документа
Рис. 2.18. Документ HTML с цветовым оформлением, измененным при помощи сценария JavaScript
Сценарий изменил пять свойств документа HTML - цвет фона и текста, а также цвета посещенных, не посещенных и выбранных пользователем ссылок (листинг 2.8).
Листинг 2.8. Файл chapter2/ColorLinks/ColorLinks.html

 
    Color Links
   
 
 
   

Изменение цветового оформления


    Посетите эти серверы:
    Наша домашняя страница
    Каталог программ Auramedia
    Страница сервера Microsoft про Java
    Локальный раздел
   

   

Локальный раздел


    Этот локальный раздел вы можете просмотреть, даже если ваш компьютер не подключен к Internet
 

Обратите внимание, что наш сценарий переопределяет цвет фона, заданный параметром BGCOLOR в операторе :
document.bgColor = "#00FF80";
Немного усложнив сценарий, вы можете изменять цвет фона, например, в зависимости от времени суток или от календарной даты. Например, цвет страницы по выходным дням можно сделать праздничным, а по рабочим - деловым. Выбор цифровых констант, определяющих праздничный и деловой цвета в шестнадцатеричном виде, мы оставляем на ваше усмотрение или на усмотрение вашего дизайнера.

Данные неопределенного типа

Если переменная была объявлена, но ей еще ни разу не присваивалось значение, она имеет неопределенный тип. Например, в следующей строке сценария объявлена переменная MyVariable, которая имеет неопределенный тип:
var MyVariable;
Если же этой переменной присвоить значение null, то тип переменной изменится - теперь это будет переменная, содержащая значение null:
MyVariable = null;

Десятично-шестнадцатеричный преобразователь

На рис. 4.1. показан внешний вид десятично-шестнадцатеричного преобразователя, выполненного на базе документов HTML с фреймами и сценарием JavaScript.
Десятично-шестнадцатеричный преобразователь
Рис. 4.1. Десятично-шестнадцатеричный преобразователь, выполненный с использованием фреймов
Верхний фрейм используется для размещения заголовка. Клавиатура преобразователя, предназначенная для ввода десятичных чисел и запуска процесса преобразования, находится в левом фрейме. Правый фрейм используется для отображения исходного десятичного числа и результата преобразования.
Вы можете вводить исходное число не только с помощью клавиатуры, но и непосредственно в поле Dec, расположенное в правом фрейме. Поле Hex заблокировано для вода при помощи обработчика события onFocus. Аналогичный прием мы использовали в шестнадцатеричном калькуляторе, исходные тексты которого были приведены в предыдущей главе.
Исходный текст файла описания фреймов представлен в листинге 4.1.
Листинг 4.1. Файл chapter4/Converter/index.html

 
    Десятично-шестнадцатеричный   преобразователь
 
 
   
   
     
     
   
   
     
     
   

 

Наш сценарий будет работать с фреймами toc и mainpage, расположенными, соответственно, в файлах с именами toc.html и main.html. В файле title.html располагается заголовок (листинг 4.2).
Листинг 4.2. Файл chapter4/Converter/title.html

 
 

 

 

   


     

Десятично-шестнадцатеричный преобразователь



   


 



Исходный текст документа, содержащего форму с полями Dec и Hex, представлен в листинге 4.3.

Листинг 4.3. Файл chapter4/Converter/main.html











   


     

      

     

   





Для поля исходного десятичного числа при помощи параметра NAME мы задали имя decValue. Поле результата называется hexValue. Эти имена используются сценарием JavaScript для адресации наших полей.

Документ toc.html (листинг 4.4) содержит форму с кнопками и сценарий JavaScript.

Листинг 4.4. Файл chapter4/Converter/toc.html





 

 

   
Hex:
        NAME="hexValue" SIZE="20" onFocus="this.blur();">
Dec:
        NAME="decValue" SIZE="20">


     

       

       

       


       

       

     

     

       

       

       

       

       

      

     

        

       

     

   


 





Сценарий нашего десятично- шестнадцатеричного преобразователя работает аналогично сценарию шестнадцатеричного калькулятора (за исключением, конечно, того, что преобразователь не выполняет никаких арифметических действий). Главное отличие заключается в том, что теперь поля для ввода и отображения чисел располагаются в другом документе HTML, загруженном в отдельный фрейм.


Для того чтобы проинициализировать поля hexValue и decValue, мы ссылаемся на форму, расположенную внутри фрейма mainpage:

parent.mainpage.document.forms[0].hexValue.value = "";

parent.mainpage.document.forms[0].decValue.value = "";

Здесь parent ссылается на объект, который является родительским по отношению к документу HTML, содержащему сценарий. В данном случае это окно, содержащее все наши фреймы.

Для чтения содержимого поля decValue применяется аналогичная техника:

szOld = parent.mainpage.document.forms[0].decValue.value;

Функция getResult, выполняющая десятично-шестнадцатеричное преобразование, получает исходное число из поля decValue и передает его функции dec2hex . Результат преобразования, выполненного этой функцией, записывается затем в поле hexValue:

function getResult(form)

{

  parent.mainpage.document.forms[0].hexValue.value = dec2hex(parent.mainpage.document.forms[0].decValue.value);

  bNewNumber = true;

}

Динамическая загрузка аплетов Java

Еще одна полезная возможность, которая появляется у вас при использовании сценариев JavaScript, - это динамическая перезагрузка аплетов Java в документах HTML, созданных с использованием фреймов.
Идея динамической загрузки аплетов заключается в том, что сценарий JavaScript динамически создает документ HTML, в котором находится оператор . Передавая аплету в этом документе различные значения параметров с помощью оператора , сценарий JavaScript может управлять его работой.
На рис. 6.3 мы показали документ HTML, состоящий из двух фреймов.
Динамическая загрузка аплетов Java
Рис. 6.3. Строка в окне аплета и ее шрифтовое оформление зависят от положения переключателей в левом фрейме
В левом фрейме находится форма с переключателями и кнопкой, а правой - аплет Java. Если включить один из переключателей с названиями шрифтов, а затем нажать кнопку, то в окне аплета появится название шрифта. Это название будет оформлено с применением шрифта, выбранного вами в левом фрейме.
Займемся описанием исходных текстов нашего документа HTML.
В файле Index.html (листинг 6.6) находится описание фреймов.
Листинг 6.6. Файл chapter6/FrameLoad/Index.html


 
    Динамическая загрузка аплетов
 
 
   
   
   
     
     
   

 

Левый фрейм называется toc, а правый - mainpage.
Исходный текст документа для фрейма toc мы привели в листинге 6.6.
Листинг 6.6. Файл chapter6/FrameLoad/toc.html

 
   

   


      Font:

     
         onClick="if(this.checked) {chkRadio(this.form,this.value);}"> Arial

     
         onClick="if(this.checked) {chkRadio(this.form,this.value);}"> Courier

     
         onClick="if(this.checked) {chkRadio(this.form,this.value);}"> TimesRoman

     
         onClick="if(this.checked) {chkRadio(this.form,this.value);}"> Helvetica

     

     
         onClick="parent['mainpage'].location='main.html';">

   


 



Для работы с переключателями типа radio мы использовали уже знакомую вам методику. Обработчик события onClick проверяет, находится ли переключатель во включенном состоянии. Если это так, обработчик вызывает функцию chkRadio, передавая ей ссылку на форму и значение свойства value, соответствующее включенному переключателю.

Функция chkRadio сохраняет это значение в переменной szFont:

function chkRadio(form,value)

{

  szFont = value;

}

Каждый из переключателей имеет значение параметра VALUE, соответствующее названию одного из шрифтов, доступных аплетам Java. Поэтому переменная szFont хранит название шрифта, выбранного пользователем в левом фрейме.

Обработчик события onClick для кнопки, расположенной в левом фрейме, выглядит следующим образом:

onClick="parent['mainpage'].location='main.html';"


Он устанавливает свойство location фрейма mainpage (то есть правого фрейма), присваивая ему адрес документа main.html. Исходный текст этого документа приведен в листинге 6.7.

Листинг 6.7. Файл chapter6/FrameLoad/main.html



 

   

 



Тело документа main.html содержит только сценарий JavaScript. Этот сценарий динамически создает строки оператора с параметрами Str1, Font1 и Type1.

Параметр Str1 задает текст, отображаемый в окне аплета. Наш сценарий использует для этого параметра название шрифта, выбранного пользователем в левом фрейме:

var szFont = parent.toc.szFont;

Параметр Font1 задает шрифт для текста, отображаемого в окне аплета. Этот параметр также задается с использованием названия шрифта, выбранного в левом фрейме:

document.write("");

И, наконец, третий параметр с именем Type1 задает тип шрифта - обычный, жирный или наклонный. В нашем случае всегда используется обычный шрифт.

Исходный текст аплета Java, использованного в нашем примере, приведен в листинге 6.8. Это упрощенный вариант алпета, описанного нами в 30 томе “Библиотеки системного программиста” в разделе “Приложение TextOut третьей главы.

Листинг 6.8. Файл chapter6/FrameLoad/TextOut.java

// =========================================================

// Установка различных шрифтов.


// Демонстрация способов передачи параметров в аплет

//

// (C) Фролов А.В, 1997, 1998

//

// E-mail: frolov@glas.apc.org

// WWW:    http://www.glasnet.ru/~frolov

//            или

//         http://www.dials.ccas.ru/frolov

// =========================================================

import java.applet.*;

import java.awt.*;

public class TextOut extends Applet

{

  // -------------------------------------------------------

  // Поля класса.

  // Создаются автоматически для всех параметров аплета

  // -------------------------------------------------------

  private String m_Str1 = "Hello 1";

  private String m_Font1 = "Arial";

  private String m_Type1 = "Bold";

  // -------------------------------------------------------

  // Имена параметров

  // -------------------------------------------------------

  private final String PARAM_Str1 = "Str1";

  private final String PARAM_Font1 = "Font1";

  private final String PARAM_Type1 = "Type1";

  // -------------------------------------------------------

  // getAppletInfo

  // Метод, возвращающей строку информации об аплете

  // -------------------------------------------------------

  public String getAppletInfo()

  {

    return "Name: TextOut\r\n" +

      "Author: Alexandr Frolov\r\n" +

      "E-mail: frolov@glas.apc.org" +

      "WWW:    http://www.glasnet.ru/~frolov" +

      "Created with Microsoft Visual J++ Version 1.0";

  }

  // -------------------------------------------------------

  // getParameterInfo

  // Метод, возвращающий описание параметров

  // -------------------------------------------------------

  public String[][] getParameterInfo()

  {

    String[][] info =

    {

      { PARAM_Str1, "String", "Text string to write" },

      { PARAM_Font1, "String", "Text font" },

      { PARAM_Type1, "String", "Font type" },


    };

    return info;   

  }

  // -------------------------------------------------------

  // init

  // Вызывается во время инициализации аплета

  // -------------------------------------------------------

  public void init()

  {

    // Рабочая переменная для получения параметров

    String param;

    // Получение параметров и сохранение

    // их значений в полях класса

    // Строки, которые будут выведены в окно аплета

    param = getParameter(PARAM_Str1);

    if (param != null)

      m_Str1 = param;

    // Шрифты для отображения строк

    param = getParameter(PARAM_Font1);

    if (param != null)

      m_Font1 = param;

    // Начертание шрифтов

    param = getParameter(PARAM_Type1);

    if (param != null)

      m_Type1 = param;

  }

  // -------------------------------------------------------

  // paint

  // Метод paint, выполняющий рисование в окне аплета

  // -------------------------------------------------------

  public void paint(Graphics g)

  {

    // Начальная координата для вывода по вертикали

    int yStart   = 20;

    // Текущая координата для вывода строки

    int yCurrent = 20;

    // Определяем текущие размеры окна аплета

    Dimension dimAppWndDimension = size();

   

    // Выбираем в контекст отображения желтый цвет

    g.setColor(Color.yellow);

   

    // Закрашиваем внутреннюю область окна аплета

    g.fillRect(0, 0,

      dimAppWndDimension.width  - 1,

      dimAppWndDimension.height - 1);

    // Выбираем в контекст отображения черный цвет

    g.setColor(Color.black);

    // Рисуем рамку вокруг окна аплета

    g.drawRect(0, 0,

      dimAppWndDimension.width  - 1,

      dimAppWndDimension.height - 1);

    // Получаем стиль шрифта и выбираем шрифт

    // в соответствии с этим стилем

    if(m_Type1.equals("Bold"))

      g.setFont(new Font(m_Font1, Font.BOLD, 25));

    else if(m_Type1.equals("Italic"))

      g.setFont(new Font(m_Font1, Font.ITALIC, 25));

    else if(m_Type1.equals("Plain"))

      g.setFont(new Font(m_Font1, Font.PLAIN, 25));

    // Отступ для первой строки

    yCurrent += yStart;

    // Рисуем первую строку

    g.drawString(m_Str1, 10, yCurrent);

  }

}

Динамическая замена растровых изображений

Одна из наиболее интересных возможностей, доступных при использовании сценариев JavaScript, заключается в динамической замене графических изображений, указанных в параметре SRC оператора .
Например, в следующей строке сценария JavaScript мы указываем, что изображение с именем btn1 должно иметь адрес URL pic/aurap.gif:
document.btn1.src=”pic/aurap.gif”
Здесь мы указали неполный адрес URL, однако можно указывать и полный адрес.
Что произойдет при выполнении приведенной выше строки сценария?
Область, выделенная в окне браузера для растрового изображения btn1 будет заполнена изображением pic/aurap.gif. Если до этого там было другое изображение, оно будет заменено на новое.
Как можно воспользоваться динамической заменой растровых изображений?
Во-первых, вы можете создавать графические ссылки, которые изменяют свой вид, когда над ними находится курсор мыши.
Во-вторых, с помощью замены растровых изображений в сценарии JavaScript можно создавать анимационные изображения.
Рассмотрим примеры сценариев, решающих указанные задачи.

Динамическое заполнение списка

Сценарий JavaScript может изменять список, добавляя в него новые элементы. Пример такого сценария мы уже приводили в разделе второй главы с названием “Ссылки и метки в документе”. Мы предлагаем вам обратиться к этому разделу еще раз.
Напомним, что там мы создали в документе HTML пустой список с именем ListOfLinks, расположив его в форме Sel:

     
               onClick="urlJump();">

Перед заполнением этого списка мы создали массив элементов elem:
elem = new Array();
Заполнение этого массива выполнялось в цикле, причем для создания элемента массива мы вызывали конструктор Option, задавая для него четыре параметра:
elem[i] = new Option("Elem" + i, i, false, false);
Первый параметр задает текст, который отображается в списке, второй - значение, назначаемое элементу списка при помощи параметра VALUE. Третий и четвертый параметры соответствуют свойствам, соответственно, defaultSelected и selected.
Переменная i - это параметр цикла, изменяющий свое значение от нуля и до количества элементов, добавляемых в список.
После того как элемент списка создан как объект класса option, его нужно записать в соответствующий элемент массива options:
Sel.ListOfLinks.options[i] = elem[i];
Sel.ListOfLinks.options[i].text = document.links[i];
Здесь мы также дополнительно устанавливаем значение для свойства text элемента этого массива, записывая текст, который должен отображаться в списке.
Определение выбранного из нашего списка элемента выполняется аналогично тому, как это сделано в предыдущем примере:
function urlJump()
{
  var szNewURL="";
  szNewURL =       
    document.links[Sel.ListOfLinks.selectedIndex];
  window.location.href=szNewURL;
}
Вначале мы определяем номер выбранного элемента как значение Sel.ListOfLinks.selectedIndex. Затем это значение используется как индекс в массиве document.links, из которого в цикле происходило заполнение нашего списка.

Доступ к полям аплета Java из сценария JavaScript

В предыдущем примере сценарий JavaScript вызывал методы, определенные в аплете Java. В следующем примере сценарий будет обращаться к полю, определенному в главном классе аплета.
Заметим, что сценарию JavaScript доступны только те поля и методы аплета, определенные как public.
На рис. 6.2 показан внешний вид документа HTML, в котором расположен один аплет и форма с одним многострочным текстовым полем и одной кнопкой.
Доступ к полям аплета Java из сценария JavaScript
Рис. 6.2. Сценарий JavaScript вызывает получает информацию от аплета
В окне аплета, расположенном в верхней части документа, находится поле редактирования текста и кнопка с надписью “Получить строку”. Если набрать в поле редактирования любую текстовую строку и нажать эту кнопку, то введенная строка будет отображена в нижней части аплета после символа >. Такой аплет мы описали в 30 томе “Библиотеки системного программиста” в разделе “Приложение TxtField” пятой главы.
Если нажать кнопку “Get applet info and text”, то сценарий JavaScript извлечет из аплета введенную текстовую строку (она хранится в поле с именем str), а также получит описание аплета, вызвав метод getAppletInfo, определенный в нашем аплете.
Введенная строка и информация об аплете будет затем отображена сценарием в многострочном поле редактирования, как это показано на рис.6.2.
Таким образом, наш сценарий обращается к полю и методу, определенным в аплете.
Исходный текст документа HTML вы найдете в листинге 6.3.
Листинг 6.3. Файл chapter6/TxtField/TxtField.html

 
    Get text
   
 
 
   

          CODE=TxtField.class

      NAME="TxtField"

      ID=TxtField

      WIDTH=320

      HEIGHT=140>

   


   


   


     

     

     

   


    The source.

 



Для кнопки, расположенной в форме с именем GetForm, мы определили обработчик события onClick:

onClick="getTextFromApplet();"

Этот обработчик вызывает функцию getTextFromApplet, выполняющую взаимодействие с аплетом.

Функция getTextFromApplet обращается к аплету как к самому первому элементу массива document.applets[0]:

GetForm.Comment.value = document.applets[0].str +

  "\n" + "---------------------------\n" +

  document.applets[0].getAppletInfo();

Здесь мы записываем в свойство value многострочного поля GetForm.Comment значение переменной str, к которому добавлен разделитель из символов “-“ и строка описания аплета, полученная от метода getAppletInfo.

Исходный текст аплета приведен в листинге 6.4.

Листинг 6.4. Файл chapter6/TxtField/TxtField.java

// =========================================================

// Однострочное текстовое поле класса TextField

//

// (C) Фролов А.В, 1997, 1998

//

// E-mail: frolov@glas.apc.org

// WWW:    http://www.glasnet.ru/~frolov

//            или

//         http://www.dials.ccas.ru/frolov

// =========================================================

import java.applet.*;

import java.awt.*;

public class TxtField extends Applet

{

  // Создаем ссылку на объекты типа TextField

  TextField txt;

  // Создаем ссылку на объекты типа Button

  Button btnGetText;

  // Строка для хранения введенных данных

  public String str;


  // -------------------------------------------------------

  // getAppletInfo

  // Метод, возвращающей строку информации об аплете

  // -------------------------------------------------------

  public String getAppletInfo()

  {

    return "Name: TxtField\r\n" +

      "Author: Alexandr Frolov\r\n" +

      "E-mail: frolov@glas.apc.org\r\n" +

      "WWW:    http://www.glasnet.ru/~frolov\r\n" +

      "Created with Microsoft Visual J++ Version 1.0";

  }

  // -------------------------------------------------------

  // init

  // Метод, получающий управление при инициализации аплета

  // -------------------------------------------------------

  public void init()

  {

    // Создаем редактируемое однострочное текстовое поле

    txt = new TextField("Введите строку текста", 35);

    // Создаем кнопку, с помощью которой можно получить

    // содержимое текстового поля

    btnGetText = new Button("Получить строку");

    // Добавляем текстовое поле в окно аплете

    add(txt);

   

    // Добавляем кнопку в окно аплете

    add(btnGetText);

    // Получаем и сохраняем текущий текст,

    // установленный в поле

    str = txt.getText();

    // Устанавливаем цвет фона

    setBackground(Color.yellow);

  }

  // -------------------------------------------------------

  // action

  // Метод вызывается, когда пользователь выполняет

  // действие над компонентами

  // -------------------------------------------------------

  public boolean action(Event evt, Object obj)

  {

    // Ссылка на кнопку, от которой пришло сообщение

    Button btn;

    // Проверяем, что событие вызвано кнопкой, а не

    // другим компонентом

    if(evt.target instanceof Button)

    {

      // Получам ссылку на кнопку, вызвавшую событие

      btn = (Button)evt.target;

      // Проверяем ссылку на кнопку

      if(evt.target.equals(btnGetText))


      {

        // Получаем и сохраняем текущий текст,

        // установленный в поле

        str = txt.getText();

        // Перерисовываем окно аплета

        repaint();

      }

      // Если событие возникло от неизвестной кнопки,

      // мы его не обрабатываем

      else

      {

        return false;

      }

      // Возвращаем признак того, что мы обработали событие

      return true;

    }

    // Если событие вызвано не кнопкой,

    // мы его не обрабатываем

    return false;

  }

     

  // -------------------------------------------------------

  // paint

  // Метод paint, выполняющий рисование в окне аплета

  // -------------------------------------------------------

  public void paint(Graphics g)

  {

    // Определяем текущие размеры окна аплета

    Dimension dimAppWndDimension = size();

   

    // Выбираем в контекст отображения черный цвет

    g.setColor(Color.black);

    // Рисуем рамку вокруг окна аплета

    g.drawRect(0, 0,

      dimAppWndDimension.width  - 1,

      dimAppWndDimension.height - 1);

    // Рисуем строку, полученную из текстового поля

    g.drawString("> " + str, 10, 100);

  }

}

Этот текст воспроизведен нами с небольшими изменениями из 30 тома “Библиотеки системного программиста”. Изменения заключаются в том, что мы добавили к определению поля str ключевое слово public:

public String str;

Это необходимо для того чтобы поле str было доступно из сценария JavaScript.

E

Это свойство представляет собой константу e. Приблизительное значение этой константы равно 2,72.
Вот пример использования свойства E:
var nE;
nE = Math.E;
Здесь мы записываем в переменную nE значение константы e.

Exp

Экспоненциальная функция, значение которой равно числу e, возведенному в степень аргумента функции.
Пример использования:
var nValueExp;
nValueExp = Math.exp(nValue);

Файл описания фреймов

Для того чтобы объединить несколько документов HTML при помощи фреймов, вам нужно подготовить специальный документ HTML, в котором находится описание параметров фреймов, таких как размер и расположение.
Особенность такого документа - отсутствие на своем обычном месте области тела документа, выделенного операторами и . Вместо этого в файле описания фреймов располагаются операторы , ,  и , как это показано ниже:

 
    . . .
 
       ROWS="Высота_строки"
     COLS="Ширина_колонки"
     onLoad="Обработчик_события"
     onUnload="Обработчик_события">
    
       . . .
     
    
      
         . . .
      
    

 

Параметры ROWS и COLS оператора определяют размеры фреймов и задаются в виде списка значений, разделенных запятой.
Вы можете определить обработчики событий onLoad и onUnload, получающие управление, соответственно, при загрузке содержимого в главное окно фрейма и при замене текущего документа HTML в этом окне на другой. Фактически эти обработчики относятся не к фреймам, а к окну, где эти фреймы отображаются.
Для тех браузеров, которые не могут работать с фреймами, необходимо подготовить документ HTML, расположив его тело между операторами и . В этом документе имеет смысл разместить сообщение о том, что для просмотра данной страницы Web необходимо применять более современный браузер.

Фиксация повторных посещений страницы

В нашем первом примере документ HTML содержит форму с двумя кнопками (рис. 7.1).
Фиксация повторных посещений страницы
Рис. 7.1. Кнопки для перехода к динамически создаваемому документу HTML и для удаления cookie
Если нажать на кнопку Go to page, сценарий JavaScript создаст новый документ HTML. Внешний вид этого документа зависит от того, сколько раз пользователь нажимал на эту кнопку.
Кнопка Remove All Cookies предназначена для удаления cookie, созданного в нашем документе HTML.
Когда вы нажимаете на кнопку Go to page в первый раз, cookie еще не создано. При этом создается документ HTML, внешний вид которого показан на рис. 7.2.
Фиксация повторных посещений страницы
Рис. 7.2. Внешний вид созданного динамически документа HTML при первом посещении
Во второй и последующий разы внешний вид документа изменяется (рис.7.3).
Фиксация повторных посещений страницы
Рис. 7.3. Внешний вид созданного динамически документа HTML при третьем посещении
Теперь здесь виден новый заголовок, а также содержимое параметров cookie с именами Visit и Count.
При каждом новом посещении значение параметра Count будет увеличиваться на единицу. Если же в документе, показанном на рис. 7.1, нажать кнопку Remove All Cookies, подсчет посещений начнется заново.
Исходный текст документа HTML представлен в листинге 7.1.
Листинг 7.1. Файл chapter7/Again/Again.html

 
    Cookies demo
   

 

 

   

Visit our page!



   


     
      onClick="btnClick();">

     

      onClick="removeCookie('Count');removeCookie('Visit')">

   
   

 



Функции addCookie, findCookie и removeCookie, определенные в этом документе, вам уже знакомы. Они предназначены, соответственно, для создания cookie, извлечения значения заданного параметра cookie и удаления cookie.

Функция btnClick вызывается, когда пользователь нажимает в форме кнопку с надписью Go to page.

Прежде всего эта функция ищет параметр cookie с именем Visit. Если такой параметр не найден, считается, что страница посещается в первый раз. В этом случае функция btnClick создает параметры cookie с именами Visit и Count, а затем формирует текст документа HTML с приглашением:

addCookie("Visit","Alexandr_Frolov",10);

addCookie("Count","0",10);

document.write("

You are welcome!

");

В том случае, когда пользователь посещает страницу повторно, параметр cookie с именем Visit уже существует. В этом случае функция btnClick пытается найти параметр с именем Count и получить его значение:

var szCnt = findCookie("Count");

Это значение затем увеличивается на единицу и записывается обратно в параметр cookie с именем Count:

i = szCnt;

i++;

szCnt = i.toString();

addCookie("Count",szCnt,10);

Завершая свою работу, функция btnClick записывает приглашение для повторно посетивших страницу пользователей и отображает содержимое свойства document.cookie:

document.write("

You are welcome AGAIN!

");    

document.write(document.cookie);    

Обработчик события onClick кнопки с надписью Remove All Cookies вызывает функцию removeCookie для параметров cookie с именами Count и Visit, удаляя их:


onClick="removeCookie('Count');removeCookie('Visit')">

Floor

Вычисление наибольшего целого значения, меньшего или равного аргументу функции.
Пример использования:
var nValue;
nValue = Math.floor(nArg);

Форма и ее свойства

Подробно о том, как создавать формы в документах HTML, мы рассказывали в 29 томе “Библиотеки системного программиста”. Сейчас мы повторим основные моменты, сделав акцент на вопросах, важных для обработки форм средствами сценариев JavaScript.

Функции в языке сценариев JavaScript

Вы можете оформить фрагменты исходного текста в виде функции, вызывая эту функцию по мере необходимости из различных мест сценария JavaScript.
Обычно функции определяются в разделе заголовка документа HTML, отмеченного операторами и . Как мы уже говорили, функция должна быть определена перед вызовом. Размещение всех определений функций в разделе заголовка документа HTML гарантирует доступность этих функций при обработке документа.
Общий вид определения функции представлен ниже:
function имя([параметр 1] [,параметр 2] [...,параметр N])
{
  . . .
  строки тела функции
  . . .
  [return значение]
}
Все параметры передаются функции по значению. Поэтому функция не может изменить содержимое переменных, передаваемых ей в качестве параметров.
С помощью ключевого слова return функция может вернуть значение.

Сценарии JavaScript в активных страницах Web

Определение даты, хранящейся в объекте класса Date.
Метод возвращает значение календарной даты в диапазоне от 1 до 31.
Пример использования:
var dtNewDate;
var nDate;
dtNewDate = new Date();
nDate = dtNewDate.getDate();

Сценарии JavaScript в активных страницах Web

Определение номера дня недели, хранящегося в объекте класса Date.
Метод возвращает 0 для воскресения, 1 - для понедельника, и так далее.
Пример использования:
nDay = dtDate.getDay();

Сценарии JavaScript в активных страницах Web

Определение количества часов, прошедших после полуночи.
Пример использования:
nHours = dtDate.getHours();

Сценарии JavaScript в активных страницах Web

Определение количества минут, прошедших после начала часа.
Пример использования:
nMinutes = dtDate.getMinutes();

Сценарии JavaScript в активных страницах Web

Определение количества месяцев, прошедших с января.
Пример использования:
nMonth = dtDate.getMonth();

Сценарии JavaScript в активных страницах Web

Определение количества секунд, прошедших с начала минуты.
Пример использования:
nSeconds = dtDate.getSeconds();

Сценарии JavaScript в активных страницах Web

Определение времени для заданного объекта класса Date.
Метод getTime возвращает количество миллисекунд, прошедших с 1 января 1970 года.
Пример использования:
nMilliseconds = dtDate.getTime();

Сценарии JavaScript в активных страницах Web

Определение смещения локального времени относительно времени по Гринвичу (в миллисекундах).
Пример использования:
nOffsetMilliseconds = dtDate.getTimeZoneOffset();

Сценарии JavaScript в активных страницах Web

Метод getYear возвращает год, хранящийся в объекте класса Date.
Пример использования:
nYear = dtDate.getYear();

Иерархия объектов браузера

Иерархия объектов браузера схематически показана на рис. 2.2.
Иерархия объектов браузера
Рис. 2.2. Иерархия объектов браузера
Объект window находится в корне иерархии. Когда в окно браузера загружается документ HTML, внутри этого объекта создаются другие объекты - document, parent, frame, location и top.
Если в окно браузера загружается документ HTML с фреймами, то для каждого фрейма создается отдельное окно, причем это окно создается как объект window.
Объект document содержит в себе другие объекты, состав которых полностью определяется документом HTML, загруженным в окно браузера. Это могут быть формы, ссылки на другие документы HTML или локальные ссылки внутри одного документа, объекты, определяющие адрес URL документа и так далее.
Если в документе имеются формы, то они также представляются в виде иерархического набора объектов. Объект-форма может содержать в себе такие объекты, как кнопки, переключатели, поля для ввода текстовой информации.
Обращаясь к свойствам перечисленных выше объектов, сценарий JavaScript может определить различные характеристики документа HTML, такие как, например, заголовок. Ему доступны все ссылки, размещенные в документе, а также содержимое полей форм, определенных в документе HTML.

Иерархия объектов в формах

Как мы уже говорили, при загрузке документа HTML в окно браузера Internet создается объект класса Document. Если в этом документе определены формы, то они доступны сценариям JavaScript как свойства объекта Document.
В разделе “Ссылки и метки в документе” предыдущей главы мы определили форму, задав для нее имя Sel с помощью параметра NAME оператора
:

 
 

В результате у объекта Document появилось свойство Sel. К этому свойству можно адресоваться следующим образом:
Document.Sel
Любая форма содержит определения полей и органов управления, таких как списки, переключатели и кнопки. При определении полей и органов управления им можно задать имя, указав его в параметре NAME соответствующего оператора языка HTML. В примере, приведенном выше, в форме определен список с именем ListOfLinks.
Для адресации из сценария JavaScript отдельных органов управления можно воспользоваться тем фактом, что они доступны как свойства содержащих их форм. Например, если в форме Sel определен список ListOfLinks, то для доступа к списку как к объекту вы можете использовать следующее выражение:
Document.Sel.ListOfLinks
Так как поля формы и органы управления являются объектами, то для них определены свои свойства и методы. Например, свойство selectedIndex, содержащее номер выбранного пользователем элемента списка, доступно следующим образом:
Document.Sel.ListOfLinks.selectedIndex
С помощью рис. 2.2 вы можете проследить иерархию объектов документа и, в частности, иерархию объектов в формах.
Заметим, что в качестве одного из свойств объекта Document определено свойство forms. Это массив всех форм, расположенных в документе HTML. Размер массива равен document.forms.length.
Вы можете адресоваться к формам как к элементам массива forms, причем первый элемент массива (с индексом 0) соответствует самой первой форме, определенной в документе, второй - следующей и так далее. Однако удобнее обращаться к формам по их именам, заданным в параметре NAME оператора .

Использование команды вызова отладчика

Если вам нужно проверить, как ведет себя та или иная строка сценария JavaScript, вы можете вставить перед этой строкой команду вызова отладчика debugger.
В качестве примера для изучения способов запуска отладчика мы будем использовать сценарий, исходный текст которого представлен в листинге8.1.
Листинг 8.1. Файл chapter8/callDebugger.html

 
    Hello, world!
   
 
 
   

JavaScript Test


    Message:
     

Обратите внимание, что в функции printHello мы вставили строку вызова отладчика непосредственно перед обращением к функции printString.
Когда вы попробуете просмотреть этот документ в браузере Microsoft Internet Explorer версии 4.0 с установленным отладчиком Microsoft Script Debugger, на экране появится окно отладчика, показанное на рис. 8.2.
Использование команды вызова отладчика
Рис. 8.2. Окно отладчика Microsoft Script Debugger
Обратите внимание, что строка вызова отладчика выделена цветом и отмечена стрелкой. Это текущая строка, на которой выполнение сценария было остановлено. Теперь вы можете просмотреть или изменить содержимое переменных, установить точки останова, а затем запустить сценарий в пошаговом режиме либо просто продолжить его выполнение.

Изменение внешнего вида графических ссылок

В документе HTML, внешний вид которого показан на рис. 5.1, находятся две кнопки, созданные как растровые графические изображения. Они используются для активизации ссылок, соответствующих двум другим документам HTML.
Изменение внешнего вида графических ссылок
Рис. 5.1. Кнопка с надписью АУРАМЕДИА изменила свой цвет
Если расположить курсор над одной из этих кнопок, надпись на этой кнопке изменит свой цвет. Это достигается динамической заменой графического изображения кнопки при помощи сценария JavaScript.
Обратите внимание на исходный текст документа HTML, показанный в листинге 5.1.
Листинг 5.1. Файл chapter5/grbutton/grbutton.html

 
 
 
      onMouseOver="document.btn1.src='pic/aurap.gif'"
    onMouseOut="document.btn1.src='pic/aura.gif'">     SRC="pic/aura.gif" NAME = "btn1" BORDER=0 ALT="Журнал Аурамедиа"

 

      onMouseOver="document.btn2.src='pic/softcatp.gif'"
    onMouseOut="document.btn2.src='pic/softcat.gif'">     SRC="pic/softcat.gif" NAME = "btn2" BORDER=0 ALT="Soft-каталог"

 
 

 

Для создания ссылок мы воспользовались оператором . Этот оператор использован здесь совместно с оператором , поэтому ссылка отображается как графическое изображение.
Для оператора ссылки
мы определили обработчики событий onMouseOver и onMouseOut:
onMouseOver="document.btn1.src='pic/aurap.gif'"
onMouseOut="document.btn1.src='pic/aura.gif'"
Когда курсор мыши оказывается над ссылкой (то есть над графическим изображением ссылки), управление получает обработчик события onMouseOver. Этот обработчик загружает изображение pic/aurap.gif, где слово АУРАМЕДИА написано красным цветом (для второй кнопки в аналогичной ситуации загружается изображение pic/softcatp.gif).
После того как пользователь убирает курсор мыши с поверхности кнопки, в дело включается обработчик события onMouseOut. Он восстанавливает исходное изображение, указанное в параметре SRC оператора .

Изменение значений переменных

Окно Command Window можно использовать не только для просмотра содержимого переменных и свойств объектов, но и для изменения их значений.
Чтобы изменить значение переменной или свойства объекта, допускающего изменение значения, вы можете воспользоваться обычным оператором присвоения. На рис. 8.8 мы показали, как можно вначале просмотреть значение переменной szHelloMsg, а затем изменить его.
Изменение значений переменных
Рис. 8.8. Изменение значения переменной szHelloMsg
Если теперь продолжить выполнение сценария, на экране вместо строки Hello, world! появится новое сообщение (рис. 8.9).
Изменение значений переменных
Рис. 8.9. Сообщение изменилось после изменения значения переменной szHelloMsg

Изменение значения параметра cookie

Для изменения значения параметра cookie с заданным именем вы можете просто вызвать функцию addCookie еще раз:
addCookie("Count","0",10);
// Значение параметра Count равно 0
  . . .
addCookie("Count","5",10);
// Значение параметра Count равно 5
Здесь мы вначале установили для параметра Count значение 0, а затем изменили это значение на 5.

Электронные часы

С помощью сценария JavaScript и формы вы можете сделать достаточно сложные электронные часы, которые будут показывать не только время, но и дату в различных форматах с учетом смещения часового пояса (рис. 3.20).
Электронные часы
Рис. 3.20. Электронные часы в документе HTML
Исходный текст документа HTML с электронными часами представлен в листинге 3.10.
Листинг 3.10. Файл chapter3/clock/clock.html

 
    Электронные часы
   
 
 
   

Электронные часы


   

     
      
      

      

      

      

      

      

       

      

      

     
Дата:          NAME="dat" SIZE="20" >
Время:
         NAME="time" SIZE="20" >
Смещение часового пояса:
         NAME="timeZone" SIZE="20" >
Дата GMT:
         NAME="gmt" SIZE="30" >
Локальная дата:
         NAME="loc" SIZE="30" >


   


   

 



Часы запускаются сразу после загрузки документа HTML в окно браузера. При этом управление получает функция updateClock. Эта функция определена в заголовке, а ее вызов находится в конце области тела документа HTML.

Получив управление, функция updateClock создает объект Data для текущей даты, установленной в компьютере:

var dtDate   = new Date();       

Затем функция определяет три компоненты времени (часы, минуты и секунды), вызывая для этого методы getHours, getMinutes и getSeconds, определенные в классе Date:

var nHours   = dtDate.getHours();

var nMinutes = dtDate.getMinutes();       

var nSeconds = dtDate.getSeconds();

Полученные таким образом значения комбинируются в текстовой строке szCurrentTime:

szCurrentTime = nHours + ":" + nMinutes +

        ":" + nSeconds;

В дальнейшем время будет записано функцией updateClock в поле time формы Clock, как это показано ниже:

Clock.time.value = szCurrentTime;

Строка текущей даты получается в результате вызова методов getDate, getMonth и getYear:


szCurrentDate = dtDate.getDate() + "." +

        dtDate.getMonth() + "." + dtDate.getYear();

Эта строка записывается в поле dat формы Clock:

Clock.dat.value  = szCurrentDate;

Для вычисления смещения часового пояса мы воспользовались методом getTimezoneOffset, возвращающим значение в минутах:

szTimeZone = dtDate.getTimezoneOffset() / 60;

Для того чтобы вычислить смещение в часах, мы разделили результат, полученный от метода getTimezoneOffset, на 60.

Вычисленное смещение часового пояса записывается в поле timeZone формы Clock:

Clock.timeZone.value = szTimeZone;

Для получения времени по Гринвичу мы воспользовались методом toGMTString:

szGMT = dtDate.toGMTString();

Полученное значение будет записано в поле gmt формы Clock:

Clock.gmt.value  = szGMT;

И, наконец, локальную дату и время мы определяем с помощью метода toLocaleString:

szLocal = dtDate.toLocaleString();

Результат записывается в поле loc формы Clock:

Clock.loc.value  = szLocal;

Периодическое выполнение функции updateClock достигается с помощью метода setTimeout:

nTimer = setTimeout("updateClock()", 1000);

Здесь мы указали, что период обновления показаний наших часов должен быть равен одной секунде.

Как связаться с авторами

Полную информацию о всех наших книгах серий “Библиотека системного программиста” и “Персональный компьютер. Шаг за шагом”, а также дискеты к книгам, статьи и другую информацию вы можете найти в сети Internet на серверах Web по следующим адресам:
http://www.glasnet.ru/~frolov
http://www.dials.ccas.ru/frolov
Вы можете передать нам свои замечания и предложения по содержанию этой и других наших книг через электронную почту по адресам:
frolov@glas.apc.org
frolov.alexandr@usa.net
Если электронная почта вам недоступна, присылайте ваши отзывы в АО “Диалог-МИФИ” по адресу:
115409, Москва, ул. Москворечье, 31, корп. 2,
тел. 324-43-77
Приносим свои извинения за то что не можем ответить на каждое письмо. Мы также не занимаемся продажей и рассылкой книг, дискет, компакт-дисков, рекламы, отдельных фрагментов наших книг и исходных текстов к книгам. По этим вопросам обращайтесь непосредственно в издательство “Диалог-МИФИ”. Авторский комопакт-диск можно приобрести также в издательстве “Аурамедиа”.

Как закрыть окно браузера

Попробуем решить задачу, невозможную без применения файла сценария, - закрыть главное окно браузера при помощи кнопки, расположенной в документе HTML (рис. 2.4).
Как закрыть окно браузера
Рис. 2.4. Документ HTML, способный закрыть главное окно браузера
Если нажать на кнопку с названием “Close Navigator Window”, сценарий отобразит на экране диалоговую панель, показанную на рис. 2.5.
Как закрыть окно браузера
Рис. 2.5. Диалоговая панель с вопросом о закрытии главного окна браузера
Данная диалоговая панель отображается с помощью метода confirm. Если вы нажмете на кнопку OK, сценарий попытается закрыть окно браузера при помощи метода close.
Заметим, что браузер Microsoft Internet Explorer версии 4.0 запрашивает разрешение на закрытие окна еще раз (рис. 2.6).
Как закрыть окно браузера
Рис. 2.6. Второй вопрос о закрытии главного окна браузера
Исходный текст документа HTML, закрывающего главное окно браузера, представлен в листинге 2.3.
Листинг 2.3. Файл chapter2/CloseAll/CloseAll.html

 
    Закрываем окно браузера
   
 
 
   

Закрываем окно браузера


    Для того чтобы закрыть окно браузера,
нажмите кнопку "Close Navigator Window",
расположенную ниже:
   

             onClick="CloseNavWnd();">
   
   
 

В области заголовка документа определена функция CloseNavWnd:
function CloseNavWnd()
{
  if(confirm("Вы действительно желаете закрыть окно браузера?"))
    window.close();
}
Эта функция обращается к методу confirm, который выводит на экран диалоговую панель с запросом на закрытие окна. Если пользователь нажмет кнопку OK, метод возвратит значение true, а если на кнопку Cancel - значение false.
В случае положительного ответа функция CloseNavWnd вызывает метод close для текущего объекта window. В данном случае таким объектом является окно браузера. Заметим, что вместо объекта window можно указывать объект self, так как это синоним текущего окна:
self.close();
Для того чтобы функция CloseNavWnd вызывалась после того как пользователь нажимает кнопку, в строке определения этой кнопки мы указали обработчик события onClick:
  onClick="CloseNavWnd();">
Таким образом, сценарии JavaScript делают формы полезными даже в тех случаях, когда вы не применяете программы CGI или расширения ISAPI.

Кнопка button

В общем виде кнопка класса button определяется в форме с помощью оператора  следующим образом:
  NAME="Имя_кнопки"
  VALUE="Надпись_на_кнопке"
  onClick="Обработчик_события">
Параметр TYPE оператора должен иметь значение button, как это показано в нашем примере.
С помощью параметра NAME задается имя объекта, соответствующего кнопке (а не надпись на кнопке). Надпись на кнопке указывается с помощью параметра VALUE.
Определив обработчик события, вы можете задать сценарий JavaScript, который получит управление после того как пользователь нажмет на кнопку.

Конструкторы класса Date

Для использования большинства методов класса Date необходимо создать объект этого класса при помощи одного из трех конструкторов.
Конструктор первого вида вызывается следующим образом:
var dtNewDate;
dtNewDate = new Date();
Здесь создается объект Date, в котором хранится информация о текущей дате и времени. Это время задается по Гринвичу или, пользуясь более современным определением, с использованием времени Universal Coordinated Time.
Конструктор второго вида позволяет указать дату через единственный параметр:
var dtNewDate;
dtNewDate = new Date(nMilliseconds);
Параметр nMilliseconds задает дату в миллисекундах, считая от 1 января 1970 года.
И, наконец, конструктор третьего вида предназначен для раздельной установки компонент даты и во многих случаев более удобен для использования:
var dtNewDate;
dtNewDate=new Date(year, month, date, hours, min, sec, ms);
Параметры этого конструктора описаны ниже:

Параметр
Описание
year
Год, например, 1998 или 2012
month
Номер месяца от 0 (январь) до 11 (декабрь)
date
Календарная дата, задается в диапазоне от 1 до 31
hours
Необязательный параметр, задающий час дня в диапазоне от 0 до 23. Вы обязаны указывать этот параметр только в том случае, если задан параметр min
min
Необязательный параметр, задающий минуты в диапазоне от 0 до 59. Вы обязаны указывать этот параметр только в том случае, если задан параметр sec
sec
Необязательный параметр, задающий секунды в диапазоне от 0 до 59. Вы обязаны указывать этот параметр только в том случае, если задан параметр ms
ms
Необязательный параметр, задающий миллисекунды в диапазоне от 0 до 999


Литература

1.     Фролов А.В., Фролов Г.В. Библиотека системного программиста. М.: ДИАЛОГ-МИФИ. Т.23. Глобальные сети компьютеров. Практическое введение в Internet, E-Mail, FTP, WWW и HTML, программирование для Windows Sockets
2.     Фролов А.В., Фролов Г.В. Библиотека системного программиста. М.: ДИАЛОГ-МИФИ. Т.29. Сервер Web своими руками
3.     Фролов А.В., Фролов Г.В. Библиотека системного программиста. М.: ДИАЛОГ-МИФИ. Т.30. Microsoft Visual J++. Создание приложений на языке Java. Часть 1.
4.     Фролов А.В., Фролов Г.В. Библиотека системного программиста. М.: ДИАЛОГ-МИФИ. Т.32. Microsoft Visual J++. Создание приложений на языке Java. Часть 2.

константа со значением натурального логарифма

Свойство LN10 - константа со значением натурального логарифма числа 10, то есть ln10.

Пример использования:

var nValue;

nValue = Math.LN10;

константа со значением натурального логарифма

Свойство LN2 - константа со значением натурального логарифма числа 2, то есть ln2.

Пример использования:

var nValue;

nValue = Math.LN2;

Log

Вычисление натурального логарифма аргумента функции.
Пример использования:
var nValue;
nValue = Math.log(nArg);

LOG10E

Свойство LOG10E - это логарифм числа e по основанию 10, то есть log10e.
Пример использования:
var nValue;
nValue = Math.LOG10E;

LOG2E

Это свойство является константой со значением, равным логарифму числа 2 по основанию e, то есть loge2.
Пример использования:
var nValue;
nValue = Math.LOG2E;

Логические данные

Логические данные могут иметь только два значения: true и false. Эти значения никак не соотносятся с числами 1 и 0. Они предназначены главным образом для выполнения операций сравнения, а также для использования в условных операторах.

Массивы в JavaScript

Язык сценариев JavaScript допускает работу с массивами встроенных объектов, объектов браузера и объектов, созданных программистом. К сожалению, нет единого способа создания массивов, пригодного для применения в разных версиях браузеров. Мы расскажем вам о двух способах, первый из которых необходим для версий браузеров Netscape Navigator, более ранних чем 3.0, а второй используется новыми браузерами фирм Netscape и Microsoft.
Первый способ предполагает создание собственного класса. Это можно сделать, например, так:
function createArray(nLength)
{
  this.length = nLength;
  for(var i = 1; i <= nLength; i++)
  {
    this[i] = 0;
  }
  return this;
}
Здесь в классе определено свойство с именем length, которое хранит размер массива, передаваемый конструктору класса через параметр nLength.
Конструктор выполняет инициализацию массива, записывая в его ячейки нулевые значения. Таким образом мы создаем массив для хранения чисел. После инициализации конструктор возвращает ссылку на созданный объект, то есть на наш массив.
Как пользоваться классом createArray?
Прежде всего вы должны объявить переменную для хранения массива, а затем создать объект класса createArray с помощью ключевого слова new:
var myArray;
myArray = new createArray(256);
После этого можно обращаться к ячейкам массива:
myArray[0] = 255;
myArray[1] = 254;
myArray[255] = 0;
Нумерация ячеек начинается с нуля.
Второй способ создания массивов проще.
При его использовании вы можете создать массив как объект встроенного класса Array:
var myArray;
myArray = new Array(256);
  . . .
myArray[0] = 255;
myArray[1] = 254;
myArray[255] = 0;
Так как класс Array - встроенный, вам не нужно определять его самостоятельно.

Max

Определение наибольшего из двух значений.
Пример использования:
var nValue1;
var nValue2;
var nValueMax;
nValueMax = Math.max(nValue1, nValue1);

Метод alert

Что касается метода alert, то мы его уже использовали в разделе первой главы с названием “Вариация пятая: с диалоговой панелью”. Там мы применили этот метод для вывода на экран простейшей диалоговой панели, отображающей приветственное сообщение. Применение некоторых других методов и свойств объекта window мы проиллюстрируем ниже на примерах составленных нами сценариев JavaScript.
Приведем формат вызова метода alert:
alert("Сообщение");
Через единственный параметр методу alert передается сообщение, отображаемое в диалоговой панели.
После вызова этого метода выполнение сценария (точнее говоря, функции сценария, вызвавшей этот метод) задерживается до тех пор, пока пользователь не нажмет кнопку OK, расположенную в диалоговой панели с сообщением.
Заметим, что при вызове метода alert мы не указали объект, для которого вызывается метод - объект window. Если при вызове метода объект не указан, интерпретатор сценария, встроенный в браузер, предполагает, что метод относится к объекту window.
Тем не менее, вы можете явно указывать объект window:
window.alert("Сообщение");
Результат будет тем же самым.

Метод clearTimeout

С помощью метода clearTimeout можно остановить таймер, запущенный только что рассмотренным методом setTimeout. В качестве параметра методу clearTimeout необходимо передать идентификатор таймера, полученный от метода setTimeout:
clearTimeout(idTimer);

Метод close

С помощью метода close вы можете закрыть созданное вами или основное окно браузера. Формат вызова этого метода такой:
wndNewWindow.close()
Заметим, что текущее окно браузера (то есть окно, в которое загружен документ HTML с работающим сценарием) может быть закрыто одним из двух следующих способов:
window.close()
self.close()
Этот метод мы будем использовать в одном сценарии, описанном ниже.

Метод confirm

С помощью метода confirm вы также можете отобразить на экране диалоговую панель с сообщением, однако в этой панели будет две кнопки - OK и Cancel. В зависимости от того, какая кнопка будет нажата, метод возвратит, соответственно, значение true или false.
Метод confirm обычно используется следующим образом:
if(confirm("Сообщение"))
{
  // Нажата кнопка OK
  . . .
}
else
{
  // Нажата кнопка Cancel
  . . .
}

Метод open

С помощью метода open сценарий может открыть новое окно браузера и загрузить в это окно документ HTML для просмотра.
Формат вызова метода open приведен ниже:
open("Адрес URL", "Имя Окна", "Параметры окна");
Метод возвращает имя нового окна, которое можно использовать для ссылки на свойства и методы окна, а также на свойства и методы объектов, расположенных в этом окне.
Первый параметр метода open задает адрес URL документа HTML, предназначенный для загрузки в новое окно.
Второй параметр определяет имя окна для использования в параметре TARGET оператора
или в операторе
. Вы можете указать его как пустую строку вида “”.
Третий, необязательный параметр, задает различные параметры, определяющие внешний вид создаваемого окна браузера. Этот параметр указывается как текстовая строка, где через запятую перечислены значения отдельных параметров, например:
var wndNewWindow;
wndNewWindow=open("hello.html", "",
"toolbar=no,menubar=no,scrollbars=no,width=300,height=100");
Ниже мы перечислили все возможные параметры окна:

Параметр
Описание
toolbar
Если параметр имеет значение yes или 1, окно снабжается стандартной инструментальной линейкой. Если же значение этого параметр равно no, то инструментальная линейка будет отсутствовать
location
Параметр определяет, будет ли отображаться поле ввода адреса документа
directories
Аналогично предыдущему, но управляет отображением кнопок каталогов браузера Netscape Navigator, таких как "What's New" и "What's Cool"
status
Отображение строки состояния
menubar
Отображение линейки меню
scrollbars
Отображение полос просмотра
resizable
Если этот параметр указан как yes или 1, пользователь сможет изменять размер вновь созданного окна
width
Ширина окна в пикселах
height
Высота окна в пикселах


Метод prompt

Если вам в своем сценарии необходимо получить от пользователя одну текстовую строку, для этого можно применить метод prompt. Этот метод отображает на экране диалоговую панель, в которой есть одно текстовое поле ввода и кнопка OK. Когда пользователь нажимает эту кнопку, метод prompt возвращает введенную строку.
Метод prompt вызывается следующим образом:
Var szInput=””;
szInput=prompt(“Сообщение”,“Строка ввода по умолчанию”);
Через первый параметр методу передается сообщение, которое отображается в диалоговой панели над текстовым полем ввода. Второй параметр необязательный. Если он указан, поле ввода инициализируется текстовой строкой, заданной этим параметром.
Заметим, что с помощью метода prompt сценарий может получить от пользователя только одну текстовую строку. В тех случаях, когда необходимо ввести и обработать сразу несколько строк, вы можете создать в документе HTML форму, имеющую произвольное количеством полей и кнопку завершения ввода с обработкой события. Когда пользователь нажмет эту кнопку, обработчик соответствующего события сможет извлечь из полей формы введенные значения. Подробно работа с формами будет рассмотрена в отдельной главе нашей книги.

Метод setTimeout

С помощью метода setTimeout вы можете установить таймер, указав при этом выражение JavaScript и задержку во времени:
idTimer=setTimeout(cmd, timeout);
Метод setTimeout  создает и запускает таймер, возвращая его идентификатор. Когда пройдет время, заданное вторым параметром timeout (в миллисекундах), запускается выражение JavaScript, заданное параметром cmd.
Рассмотрим такой фрагмент сценария:
var cmd="NoAccess()";
idTimer=window.setTimeout(cmd, 10000);
Здесь мы создаем таймер с временем задержки 10 секунд. После прошествия этого времени будет вызвана функция с именем NoAccess, которая должна быть определена в сценарии заранее. Эта функция будет выполнена только один раз.
Ниже мы приведем примеры сценариев, в которых метод setTimeout используется для периодического вызова функции сдвига сообщения в строке состояния браузера (“бегущая” строка) и для ограничения времени ввода пользователем строки пароля.
Еще одно применение метода setTimeout - создание анимационных эффектов в сценарии JavaScript. Соответствующий пример вы найдете в пятой главе нашей книги, посвященной растровым графическим изображениям.

Методы объекта button

Для объекта button определен всего один метод, не имеющий параметров, - click:
click()
Вызов этого метода приводит к такому же эффекту, что и щелчок левой клавишей мыши по кнопке.

Методы объекта checkbox

Для объекта checkbox определен один метод click, не имеющий параметров:
click()
При вызове этого метода переключатель устанавливается во включенное состояние.

Методы объекта document

Сценарии JavaScript могут вызывать следующие пять методов, определенных в объекте document:

Метод
Описание
clear
Удаление содержимого документа из окна просмотра
close
Закрытие потока данных, открытого для документа методом open. В окне будут отображены все изменения содержимого документа, сделанные сценарием после открытия потока
open
Открытие выходного потока для записи в документ HTML данных типа MIME при помощи методов write и writeln
write
Запись в документ произвольной конструкции языка HTML
writeln
Аналогично предыдущему, но в конце строки добавляется символ новой строки


Методы объекта password

Для объекта password определены методы focus, blur и select, не имеющие параметров.
С помощью метода focus сценарий JavaScript может передать фокус полю редактирования, а с помощью метода blur - отобрать фокус у этого поля. Вызов метода select приводит к выделению содержимого поля редактирования.

Методы объекта radio

Для объекта radio определен метод click, не имеющий параметров:
click()
При вызове этого метода переключатель выбирается для работы.

Методы объекта select

Для объекта select определено два метода, не имеющих параметров, - focus и blur. Первый из этих методов позволяет передать списку фокус ввода, а второй - отобрать этот фокус у списка.

Методы объекта text

Для объекта text определены методы focus, blur и select, не имеющие параметров.
С помощью метода focus сценарий JavaScript может передать фокус полю редактирования, а с помощью метода blur - отобрать фокус у этого поля.
Вызов метода select приводит к выделению содержимого поля редактирования.

Методы объекта textarea

Для объекта textarea определены такие же методы, что и для объекта text. Это методы focus, blur и select, не имеющие параметров.
С помощью метода focus сценарий JavaScript может передать фокус полю редактирования, а с помощью метода blur - отобрать фокус у этого поля.
Вызов метода select приводит к выделению содержимого многострочного поля редактирования.

Методы объекта window

Среди методов, определенных в объекте window, отметим методы, предназначенные для открытия новых окон и закрытия существующих, для отображения на экране простейших диалоговых панелей с сообщениями и методы для установки таймера:

Метод
Описание
alert
Отображение диалоговой панели Alert с сообщением и кнопкой OK
close
Закрытие окна
confirm
Отображение диалоговой панели Confirm с кнопками OK и Cancel
open
Открытие окна
prompt
Отображение диалоговой панели Prompt с полем ввода
setTimeout
Установка таймера
clearTimeout
Сброс таймера


Min

Определение наименьшего из двух значений.
Пример использования:
var nValue1;
var nValue2;
var nValueMin;
nValueMin = Math.min(nValue1, nValue1);

Многострочное поле textarea

В тех случаях, когда редактируемый текст должен занимать несколько строк, в форме между операторами располагают многострочное текстовое поле:
  NAME="Имя_поля_textarea"
  ROWS="Количество_строк"
  COLS="Количество_столбцов"
  WRAP="Режим_свертки_текста"
  onBlur="Обработчик_события"
  onChange="Обработчик_события"
  onFocus="Обработчик_события"
  onSelect="Обработчик_события">
  . . .
  Отображаемый текст
  . . .

Здесь с помощью параметра NAME вы должны указать имя поля. Оно нужно для того чтобы сценарий JavaScript мог обращаться к свойствам и методам этого поля.
Параметры ROWS и COLS определяют видимый размер многострочного поля редактирования, задавая, соответственно, количество строк и столбцов (количество символов, которые могут поместиться в одной строке).
Параметр WRAP задает способ свертки текста и может иметь одно из трех следующих значений:

Значение
Способ свертки текста
off
Свертка выключена, строки отображаются так, как вводятся
virtual
Строки сворачиваются только при отображении в окне редактирования, но передаются расширению сервера Web и сценарию JavaScript точно в таком виде, в котором вводятся
physical
При свертке в передаваемый текст записываются символы новой строки


Настройка браузера для работы с cookie

Хотя cookie не представляют собой никакой опасности для пользователей, не все пожелают, чтобы хранящаяся в них информация передавалась на сервер Web. В сочетании с другими полями заголовка HTTP данные cookie позволяют собирать определенную статистику о пользователях, а это нравится далеко не всем.
Настраивая браузер соответствующим образом, пользователи могут ограничить или вовсе отключить возможность работы с cookie. Вы должны это учитывать, если при создании активных документов HTML надеетесь на использование cookie.
Браузер Microsoft Internet Explorer версии 4.0 допускает установку трех режимов работы с cookies. Эти режимы указываются на странице Advanced блокнота Internet Options (рис. 7.13), доступного из меню View браузера.
Настройка браузера для работы с cookie
Рис. 7.13. Установка режимов работы с cookie
По умолчанию включен переключатель Always accept cookies, разрешающий использование cookie.
Переключатель Disable all cookie use полностью запрещает использование cookie.
Если включить переключатель Prompt before accepting cookies, при попытке установить cookies на экране появится предупреждающее сообщение (рис. 7.14).
Настройка браузера для работы с cookie
Рис. 7.14. Предупреждающее сообщение при попытке записи данных cookie
Нажав кнопку More Info, вы можете получить подробные сведения о данных cookie, которые планируется записать на диск вашего локального компьютера, а также просмотреть эти данные в поле Data.

Настройка параметров документа HTML

Третий пример демонстрирует, как можно использовать cookie для настройки пользователем параметров документа HTML.
На рис. 7.5 показан документ HTML с двумя кнопками и переключателем, имеющим зависимую фиксацию.
Настройка параметров документа HTML
Рис. 7.5. Главный документ HTML, при помощи которого можно выполнить настройку
Если нажать верхнюю кнопку, то в окне браузера появится документ HTML, созданный динамически сценарием JavaScript. В первый раз этот документ будет таким, как показано на рис. 7.6.
Настройка параметров документа HTML
Рис. 7.6. Внешний вид документа при первом посещении
При помощи переключателей вы можете выбрать один из четырех цветов фона документа. Выбранное значение запоминается в cookie. Для того чтобы вернуться к цвету, принятому по умолчанию, в документе HTML, показанному на рис. 7.5, нужно нажать нижнюю кнопку.
При последующих посещениях внешний вид документа изменится (рис.7.7).
Настройка параметров документа HTML
Рис. 7.7. Внешний вид документа при третьем посещении
Его фон будет иметь такой цвет, какой был выбран при помощи переключателей.
Исходный текст документа HTML приведен в листинге 7.3.
Листинг 7.3. Файл chapter7/CustomPage/CustomPage.html

 
 
    Customize your page
   

 

 

   

Посетите вашу персональную страницу



   

     

     
        onClick="btnGo();">

     


      Настройка параметров персональной страницы

      Цвет фона:

     
        onClick="if(this.checked) {chkRadio(this.form,this.value);}"> Белый

     

        onClick="if(this.checked) {chkRadio(this.form,this.value);}"> Желтый

     

        onClick="if(this.checked) {chkRadio(this.form,this.value);}"> Зеленый

     

        onClick="if(this.checked) {chkRadio(this.form,this.value);}"> Малиновый

     

     
        onClick="setDefault(this.form);">

       

 



Помимо функций 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("

Рады видеть вас снова!

");    

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";

}

Эта функция вызывается, когда пользователь нажимает кнопку с надписью "Параметры по умолчанию":


  onClick="setDefault(this.form);">

Обратите внимание, что данная кнопка имеет тип reset. Когда пользователь нажимает на нее, в форме включается переключатель, задающий белый цвет фона. Это происходит потому, что указанный переключатель определен с параметром CHECKED, а кнопка типа reset устанавливает все органы управления формы в исходное состояние.

Несколько примеров использования cookie

В этом разделе на примере конкретных сценариев JavaScript мы покажем, как можно использовать cookies для решения различных практических задач.

Объект document

Специально для работы с документами HTML в языке JavaScript имеется отдельный объект с названием document. Пользуясь его свойствами и методами, сценарий JavaScript может получить информацию о текущем документе, загруженном в окно браузера, а также управлять отображением содержимого этого документа. В первой главе нашей книги мы уже применяли один из методов объекта document с именем write для записи строки в тело документа HTML.
Когда в 29 томе “Библиотеки системного программиста” мы рассказывали о документах HTML, то говорили, что такие документы состоят из заголовка и тела документа. Заголовок определяется при помощи оператора языка HTML , а тело документа - при помощи оператора . Прежде чем мы перейдем к описанию свойств и методов объекта document, рассмотрим назначение отдельных параметров оператора .
В общем виде этот оператор выглядит следующим образом:
   BACKGROUND="Фоновое_изображение"
   BGCOLOR="Цвет_фона"
   TEXT="Цвет_текста"
   LINK="Цвет_непосещенных_ссылок"
   ALINK="Цвет_активизированных_ссылок"
   VLINK=" Цвет_посещенных_ссылок "
   onLoad="Обработчик_события_при_загрузке_документа"
   onUnload="Обработчик_события_при_выгрузке_документа">

Описание параметров оператора приведено ниже:

Параметр
Описание
BACKGROUND
С помощью этого параметра можно указать адрес URL изображения, заполняющего фон тела документа
BGCOLOR
Параметр BGCOLOR применяется в тех случаях, когда фон документа необходимо раскрасить в какой-либо цвет. Цвет задается в виде "#rrggbb", где константы rr, gg и bb - соответственно, красная, зеленая и голубая компоненты цвета. Значение констант может находиться в диапазоне от 0 до FF (в шестнадцатеричном виде). Цвет может также задаваться символическими константами, такими как red или white
TEXT
Цвет текста. Задается таким же образом, что и цвет фона BGCOLOR
LINK
Параметр LINK определяет цвет ссылок, размещенных в документе HTML, и еще не посещенных пользователем
ALINK
Этот параметр определяет цвет ссылок, выбранных пользователем
VLINK
Параметр VLINK определяет цвет ссылок, размещенных в документе HTML, которые уже посещались пользователем ранее
onLoad
С помощью параметра onLoad можно определить обработчик события, который получит управление при загрузке документа в окно браузера
onUnload
Аналогично предыдущему, однако обработчик события получит управление при удалении документа из окна браузера

Анализируя свойства объекта document, сценарий JavaScript может определить значения перечисленных выше параметров. Кроме того, сценарию доступны локальные метки, формы и связи документа как элементы соответствующих массивов, а также информация из заголовка документа.

Объект window

Далее мы рассмотрим в деталях объекты браузера, необходимые вам практически в любом сценарии JavaScript. Прежде всего это объекты window, document, а также объекты, связанные с формами, определенными в документах HTML.
Первый объект браузера, которым мы займемся вплотную, это окно - объект с именем window.

Объекты браузера

С точки зрения сценария JavaScript браузер представляется иерархически организованным набором объектов. Обращаясь к свойствам и методам этих объектов можно выполнять различные операции над окном браузера, загруженным в это окно документом HTML, а также над отдельными объектами, размещенными в документе HTML. Например, можно создавать новые окна браузера, загружая в них документы HTML, динамически формировать текст документа HTML, обращаться к полям форм, определенных в документе HTML и так далее.
Объекты браузера являются тем интерфейсом, с помощью которого сценарий JavaScript взаимодействует с пользователем и документом HTML, загруженным в окно браузера, а также с самим браузером. В сценариях JavaScript вы не можете создавать новые классы на базе классов, соответствующих этим объектам, однако свойства и методы объектов браузера вам доступны.

Объекты на базе классов, создаваемых программистом

Многочисленные книги для начинающих, посвященные языку программирования С++, предлагают представить себе класс как структуру данных, где помимо обычных полей определены функции-методы для работы с этими данными. Так вот, в языке JavaScript для создания собственных классов используется прямо противоположный метод.
Класс JavaScript создается как функция, в которой определены свойства, играющие роль данных. Что же касается методов, то они тоже определяются как функции, но отдельно.
Приведем конкретный пример.
Пусть нам нужно создать класс, предназначенный для хранения записи воображаемой телефонной базы данных. В этом классе нам нужно предусмотреть свойства для хранения имени, фамилии, номера телефона, адреса, а также специального признака для записей, закрытых от несанкционированного доступа. Дополнительно требуется разработать методы, предназначенные для отображения содержимого объекта в табличном виде, как это показано на рис. 2.3.
Объекты на базе классов, создаваемых программистом
Рис. 2.3. Просмотр содержимого записей
Прежде всего займемся созданием собственного класса с названием myRecord. Пусть пока в нем не будет методов, мы добавим их позже.
Искомый класс создается следующим образом:
function myRecord(name, family, phone, address)
{
  this.name    = name;
  this.family  = family;
  this.phone   = phone;
  this.address = address;
  this.secure  = false;
}
Нетрудно заметить, что описание нашего класса есть ни что иное, как функция конструктора. Параметры конструктора предназначены для установки свойств объекта при его создании на базе класса.
Свойства определяются простыми ссылками на их имена с указанием ключевого слова this. Это ключевое слово здесь указывает, что в операторе выполняется ссылка на свойства того объекта, для которого вызван конструктор, то есть для создаваемого объекта.
Обратите внимание, что наш конструктор инициализирует свойство с именем secure, записывая в него значение false. Соответствующий параметр в конструкторе не предусмотрен, что вполне допустимо.
Как пользоваться определенным классом?

На базе этого класса вы можете создать произвольное количество объектов. Ниже мы привели фрагмент сценария JavaScript, где на базе класса myRecord создается два объекта rec1 и rec2:

var rec1;

var rec2;

rec1 = new myRecord("Иван", "Иванов",

  "000-322-223", "Малая Большая ул., д. 225, кв. 226");

rec2 = new myRecord("Петр", "Петров",

  "001-223-3334", "Большая Малая ул., д. 552, кв. 662");

rec2.secure = true;

Объекты создаются при помощи оператора new, знакомого тем, кто составлял программы на языках С++ и Java. Здесь мы передаем конструктору параметры для инициализации свойств создаваемых объектов.

Что же касается свойства с именем secure, то в объекте rec2 оно инициализируется уже после создания последнего. В него записывается значение true. Мы не изменяли свойство secure объекта rec1, поэтому в нем хранится значение false.

Теперь наша задача - добавление в определенный нами класс новых методов с именами printTableHead, printTableEnd и printRecord. Первые два из этих методов выводят в документ HTML, соответственно, начальный и конечный фрагмент таблицы, а третий - строки таблицы, отражающие содержимое записей.

В сокращенном виде новое определение класса myRecord представлено ниже:

function printTableHead()

{

  . . .

}

function printTableEnd()

{

  . . .

}

function printRecord()

{

  . . .

}

function myRecord(name, family, phone, address)

{

  this.name    = name;

  this.family  = family;

  this.phone   = phone;

  this.address = address;

  this.secure  = false;

  this.printRecord    = printRecord;

  this.printTableHead = printTableHead;

  this.printTableEnd  = printTableEnd;

}

Здесь перед определением конструктора мы расположили определения для функций-методов нашего класса. Кроме этого, в конструктор добавлено определение новых свойств:

this.printRecord    = printRecord;

this.printTableHead = printTableHead;

this.printTableEnd  = printTableEnd;

Эти свойства хранят ссылки на методы, определенные выше.


После такого определения класса вы можете создавать объекты и обращаться к определенным методам:

rec1.printTableHead();

rec1.printRecord();

rec1.printTableEnd();

rec2.printTableHead();

rec2.printRecord();

rec2.printTableEnd();

Возвращаясь к документу, показанному выше на рис. 2.3, приведем его полный исходный текст (листинг 2.2).

Листинг 2.2. Файл chapter2/NewObject/NewObject.html



 

    Просмотр записей

   

 

 

   

Просмотр записей



   

 



Определение нового класса myRecord и его методов мы расположили в области заголовка документа HTML, как это принято делать.

Метод printTableHead выводит в документ HTML заголовок таблицы.  Внешний вид этого заголовка зависит от содержимого свойств объекта.

Прежде всего метод printTableHead проверяет свойство secure, получая его значение при помощи ключевого слова this:

var szSec = "";

if(this.secure)

  szSec = " (Secure)";

else

  szSec = " (Unsecure)".fontcolor("red");

Здесь это ключевое слово означает, что необходимо использовать свойство того объекта, для которого был вызван метод printTableHead.

Если содержимое свойства secure равно true, в текстовую переменную szSec записывается строка " (Secure)". Если же оно равно false, в эту переменную заносится строка " (Unsecure)", причем для строки устанавливается красный цвет.


Так как в JavaScript все текстовые строки (в том числе и литералы) являются объектами встроенного класса String, то для них можно вызывать определенные в этом классе методы. В частности, метод fontcolor позволяет установить цвет строки, чем мы и воспользовались.

Далее метод printTableHead выводит в документ HTML оператор с параметром BORDER, с которого начинается определение таблицы, имеющей рамку. Надпись над таблицей задается с помощью динамически формируемого оператора
. В эту надпись включается имя и фамилия, извлеченные из соответствующих свойств объекта, для которого был вызван метод printTableHead. Затем этот метод выводит надписи для столбцов таблицы.

Метод printTableEnd выводит в документ HTML оператор
, завершающий определение таблицы, а также пустой параграф для отделения таблиц, следующих друг за другом:

function printTableEnd()

{

  document.write("");

  document.write(" ");

}

Последний метод, определенный в нашем классе, называется printRecord. Он печатает содержимое первых четырех свойств объекта как строку таблицы, определенной в документе HTML только что описанной функцией printTableHead.

Обратите внимание, что содержимое свойств объекта печатается наклонным шрифтом, для чего мы вызываем метод italics:

document.write("Name:" +  

  this.name.italics() + "");

Определение класса myRecord мы уже описали выше.

Перейдем теперь ко второй части нашего сценария, расположенной в теле документа HTML.

Здесь мы создаем два объекта rec1 и rec2 на базе класса myRecord, а затем устанавливаем свойство secure объекта rec2 в состояние true.

Далее сценарий последовательно выводит в документ HTML две таблицы, соответствующие созданным объектам, вызывая для этого методы printTableHead, printRecord и printTableEnd.

Как видите, применение собственного класса позволили сильно упростить задачу инициализации и отображения содержимого записей нашей воображаемой телефонной базы данных. Фактически мы свели эту задачу к вызовам нескольких методов, определенных заранее в нашем классе.

Объекты, входящие в состав форм

Далее мы приступим к изучению свойств и методов перечисленных в предыдущем разделе объектов. Для каждого объекта мы приведем пример сценария JavaScript, иллюстрирующего основные приемы работы с объектом.

Объявление переменных

Все переменные в JavaScript объявляются с помощью ключевого слова var, как это показано ниже:
var szHelloMsg;
Еще раз обращаем ваше внимание на то, что при объявлении тип переменной не указывается. Этот тип присваивается переменной только тогда, когда ей присваивается какое-либо значение.
Ниже мы записываем в переменную, которая не была предварительно объявлена, текстовую строку:
szMsg = “Привет!”;
После такого присвоения имя переменной szMsg становится доступным.
При выборе имен переменных вы должны придерживаться следующих простых правил:
  • имя переменной должно начинаться с буквы или с символов “_”, “$” и может состоять только из букв, цифр, а также символов “_”, “$”;

  • имя переменной не должно совпадать с зарезервированными ключевыми словами JavaScript.

  • Список зарезервированных ключевых слов JavaScript приведен ниже:

    break
    if
    case*
    import*
    catch*
    in
    class*
    new
    const*
    null
    continue
    return
    debugger*
    super*
    default*
    switch*
    delete
    this
    do*
    throw*
    else
    true*
    enum*
    try
    export*
    typeof
    extends*
    var
    false
    void
    finally*
    while
    for
    with
    function

    Ключевые слова, представленные в этом списке, еще только планируется применять в языке JavaScript при его развитии. Эти слова отмечены символом *. Мы рекомендуем избегать их использования в ваших программах в качестве имен переменных.
    Нужно также следить, чтобы имена переменных не совпадали с именами встроенных объектов, методов и функций.

    Обработчики событий объекта text

    Обработчики событий вызываются в следующих случаях:

    Обработчик
    Когда вызывается
    onFocus
    Вызывается, когда поле редактирования получает фокус ввода
    onBlur
    Вызывается, когда поле редактирования теряет фокус ввода
    onChange
    При изменении содержимого поля редактирования
    onSelect
    При выделении содержимого поля редактирования


    Обработчики событий объекта textarea

    Обработчики событий вызываются в следующих случаях:

    Обработчик
    Когда вызывается
    onFocus
    Вызывается, когда поле редактирования получает фокус ввода
    onBlur
    Вызывается, когда поле редактирования теряет фокус ввода
    onChange
    При изменении содержимого поля редактирования
    onSelect
    При выделении содержимого поля редактирования


    Обработчики событий, связанные с объектом select

    Как видно из формата оператора   NAME="Имя_поля_text"
      VALUE="Значение"
      SIZE=Размер_поля>
    Для поля password можно указать параметры NAME, VALUE и SIZE. Заметим, что это поле не может иметь обработчики событий.
    Параметр NAME позволяет задать имя поля, которое необходимо для обращения к свойствам объекта password, соответствующего этому полю.
    С помощью параметра VALUE можно записать в поле произвольную текстовую строку.
    Параметр SIZE определяет размер (ширину) текстового поля в символах. Это размер видимой части поля. Он не ограничивает длину строки, которую можно ввести в данном поле.
    Поле password похоже на поле text, рассмотренное нами ранее. Главное отличие заключается в том, что символы введенного в этом поле текста заменяются на звездочки.

    Однострочное поле text

    Наверное, наиболее часто в формах, размещенных на страницах серверов Web встречаются однострочные поля, предназначенные для ввода и редактирования текста. Для того чтобы встроить такое поле в форму, необходимо использовать оператор с параметром TYPE, равным значению “text”:
      NAME="Имя_поля_text"
      VALUE="Значение"
      SIZE=Размер_поля
      onBlur="Обработчик_события"
      onChange="Обработчик_события"
      onFocus="Обработчик_события"
      onSelect="Обработчик_события">
    Дополнительно можно указать параметры NAME, VALUE и SIZE, а также четыре обработчика событий, создаваемых текстовым полем.
    Параметр NAME позволяет задать имя поля, необходимое для обращения к свойствам объекта text, соответствующего этому полю.
    С помощью параметра VALUE можно записать в поле произвольную текстовую строку. Эта строка будет отображаться сразу после загрузки документа HTML в окно браузера.
    Параметр SIZE определяет размер (ширину) текстового поля в символах. Это размер видимой части поля. Он не ограничивает длину строки, которую можно ввести в данном поле.

    Ограничение времени реакции пользователя

    Иногда пользователь, попав на страницу Web, долго не может понять, что нужно делать. Вы можете создать сценарий, который отображает в этой ситуации документ HTML с подсказкой. Разумеется, подсказка должна отображаться только в том случае, если пользователь не выполняет над вашей страницей никаких действий в течении достаточно продолжительного времени.
    Но как измерить время, в течении которого пользователь не активен?
    В этом вам помогут методы setTimeout и clearTimeout. Первый из этих методов мы уже использовали в предыдущем сценарии для организации периодического выполнения функции.
    Мы продемонстрируем применение этих методов для решения другой задачи, связанной с ограничением времени ввода пароля.
    Когда пользователь загружает документ HTML, исходный текст которого представлен в листинге 2.6, на экране появляется форма с полем, предназначенным для ввода текстовой строки пароля (рис. 2.12).
    Ограничение времени реакции пользователя
    Рис. 2.12. Форма в документе HTML для ввода пароля
    Сразу после загрузки документа в окно браузера сценарий запускает таймер, вызывая метод setTimeout из этого же класса. Таймер устанавливается на 10 секунд. Именно за это время вы должны ввести пароль и нажать кнопку “Enter Password” в форме, показанной на рис. 2.12, чтобы получить доступ к странице.
    Если повременить с вводом пароля или ввести неправильный пароль, сценарий загружает в окно браузера динамически сформированный документ HTML с сообщением о запрещении доступа (рис. 2.13).
    Ограничение времени реакции пользователя
    Рис. 2.13. Сообщение о запрещенном доступе
    Только в том случае, если пароль введен правильно и в течении 10 секунд, на экране появляется сообщение о предоставлении доступа и ссылка, с помощью которой можно перейти к просмотру главной страницы нашего сервера Web (рис. 2.14).
    Ограничение времени реакции пользователя
    Рис. 2.14. Сообщение о разрешении доступа и ссылка на главную страницу нашего сервера Web
    Разумеется, приведенный нами пример едва ли стоит использовать на практике для ограничения доступа к странице сервера Web.
    Во-первых, исходный текст сценария легко просмотреть и проанализировать (если только сценарий не находится в отдельном файле, адрес которого указан при помощи параметра SRC). Во-вторых, узнав один раз адрес страницы сервера, пользователь может просто отметить эту страницу закладкой и в дальнейшем посещать ее без ввода пароля.

    Мы привели данный пример сценария только для иллюстрации применения методов класса window. С помощью аналогичного сценария вы можете узнать, не заснул ли пользователь, пока смотрел на вашу страницу.

    Теперь рассмотрим исходный текст сценария JavaScript, встроенного в документ HTML (листинг 2.6).

    Листинг 2.6. Файл chapter2/Password/Password.html



     

       
          content="text/html; charset=windows-1251">

        Ввод пароля

       

     

     

       

    Доступ ограничен



    Мы ограничили доступ к нашему серверу :)   

    Вы должны ввести пароль (слово password)

    в течении 10 секунд.

       


       


         


         
          onClick="CheckPassowd();">

       
       

       


     



    Прежде всего обратим ваше внимание на заголовок документа HTML.

    В первой странице этого заголовка мы указали с помощью оператора  номер кодовой страницы 1251, соответствующей кириллице в Windows:


      content="text/html; charset=windows-1251">

    Без этой строки наш документ отображался неправильно браузером Microsoft Internet Explorer версии 4.0.

    В первых строках сценария, расположенного в заголовке документа, мы объявили переменную idTimer и определили функцию StartMyTimer:

    var idTimer=0;

    function StartMyTimer()

    {

      var cmd="NoAccess()";

      idTimer=window.setTimeout(cmd, 10000);

    }

    Функция StartMyTimer запускает таймер, сохраняя его идентификатор в глобальной переменной idTimer. Для запуска таймера мы применили знакомый вам метод с именем setTimeout.

    Когда таймер сработает (а это произойдет через 10 секунд после загрузки нашего документа HTML в окно браузера), будет вызвана функция NoAccess. Эта функция выводит в окно браузера сообщение о запрещении доступа к странице.

    Для того чтобы функция StartMyTimer запускалась сразу после загрузки документа HTML в окно браузера, мы указали ее имя в параметре onLoad оператора , организовав таким образом обработку соответствующего события:



    Итак, если пользователь загрузил документ и просто смотрит на него, через 10 секунд содержимое документа в окне браузера будет перезаписано функцией NoAccess, что иллюстрируется на рис. 2.13.

    Для ввода пароля необходимо использовать форму, которая определена в нашем документе HTML следующим образом:



     

     

        onClick="CheckPassowd();">

       

    Имя формы pwdForm указано в параметре NAME оператора
    . Это имя нам потребуется для извлечения строки пароля из текстового поля, определенного в форме с помощью оператора . Имя этого текстового поля pwd также задается параметром NAME.

    Помимо текстового поля, в форме имеется кнопка с надписью “Enter Password”. Для этой кнопки мы определили обработчик события onClick, который вызывается, когда пользователь нажимает мышью на кнопку. Обработчиком в нашем случае является функция CheckPassowd, определенная в нашем сценарии. Эта функция проверяет пароль и, если пароль введен правильно, останавливает таймер, запущенный при загрузке документа HTML.

    Как наш сценарий извлекает строку пароля из поля формы?

    Это делается следующим образом:

    var szPwd="";

    szPwd=document.pwdForm.pwd.value;

    Здесь мы выполняем ссылку на свойство value объекта pwd, которым является текстовое поле формы (вспомните, что это поле называется pwd). Объект pwd находится внутри формы с именем pwdForm, которая, в свою очередь располагается в документе HTML, загруженным в окно браузера. Этим документом является объект document.

    Получив введенную пользователем строку, функция CheckPassowd проверяет ее:

    if(szPwd=="password")

    {

      clearTimeout(idTimer);

        . . .

    }

    Если строка введена правильно, таймер останавливается методом clearTimeout. В качестве параметра этому методу передается идентификатор таймера, полученный от метода setTimeout. При ошибке в документ HTML записывается сообщение о запрещении доступа.

    Ограничения на использование cookie

    На использование cookie накладываются определенные ограничения, которые мы перечислили ниже:
  • всего может быть создано не более чем 300 cookie;

  • каждый cookie не может превышать по своему размеру 4 Кбайт;

  • для каждого домена может быть создано не более 20 cookie

  • Если указанные значения будут превышены, браузер может удалить самые старые cookie или обрезать значения параметров cookie.

    Оператор break

    С помощью оператора break можно прервать выполнение цикла, созданного операторами for или while, в любом месте. Например:
    var i = 0;
    while(true)
    {
      . . .
      i++;
      if(i > 10)
        break;
      . . .
    }

    Оператор continue

    Выполнение оператора continue внутри цикла for или while приводит к тому, что итерация прерывается, а затем возобновляется заново. Этот оператор не прерывает цикл.
    Ниже мы привели пример использования оператора continue:
    var i = 0;
    while(i < 100)
    {
      i++;
      if(i < 10)
        continue;
      . . .
    }
    Здесь фрагмент тела цикла, отмеченный многоточием, будет выполняться только после того, как значение переменной i  станет равным 10. Когда же это значение достигнет 100, цикл будет завершен.

    Оператор for-in

    Оператор for-in предназначен для просмотра всех свойств объекта и записывается в следующем виде:
    for(переменная in объект)
    {
      . . .
      строки тела цикла
      . . .
    }

    Оператор for

    Общий вид оператора for представлен ниже:
    for([инициализация;] [условие;] [итерация])
    {
      . . .
      строки тела цикла
      . . .
    }
    В области инициализации обычно выполняется присваивание начальных значений переменным цикла. Здесь допустимо объявление новых переменных при помощи ключевого слова var.
    Вторая область задает условие выхода из цикла. Это условие оценивается каждый раз при прохождении цикла. Если в результате оценки получается логическое значение true, выполняются строки тела цикла.
    Область итерации применяется для изменения значений переменных цикла, например, для уменьшения счетчика цикла.

    Оператор

    В наиболее общем виде оператор , предназначенный для создания форм в документах HTML, выглядит следующим образом:
      NAME="Имя_формы"
      TARGET="Имя_окна"
      ACTION="Адрес_URL_расширения_сервера"
      METHOD=GET или POST
      ENCTYPE="Кодировка_данных"
      onSubmit="Обработчик_события_Submit">
      . . .
      определение полей и органов управления
      . . .

    Параметр NAME задает имя формы. Вы можете его не указывать, если форма не предназначена для совместной работы со сценарием JavaScript, однако это не наш случай. Нам это имя нужно для адресации формы как свойства объекта Document, поэтому мы всегда будем его задавать.
    Назначение параметра TARGET аналогично назначению этого же параметра в операторе
    . Когда форма используется для передачи запроса расширению CGI или ISAPI сервера Web, ответ, полученный от сервера, отображается в окне. Имя этого окна задано параметром TARGET. Если ответ должен отображаться в том же окне, что и форма, то параметр TARGET задавать не нужно.
    С помощью параметра ACTION указывается адрес URL загрузочного файла программы CGI или библиотеки динамической компоновки DLL расширения ISAPI, а также передаваемые расширению параметры. В том случае, когда форма предназначена для передачи данных расширению сервера Web, параметр ACTION является обязательным. Но если данные, введенные в форме, обрабатываются сценарием JavaScript локально и не передаются серверу Web, этот параметр можно опустить.
    Параметр METHOD задает метод передачи данных из формы расширению сервера Web и может принимать значения GET или POST. Подробнее об этом вы можете прочитать в только что упомянутом нами 29 томе “Библиотеки системного программиста”. Если данные из полей формы обрабатываются сценарием JavaScript локально, параметр METHOD задавать не нужно.
    Параметр ENCTYPE задает тип MIME передаваемых данных и используется очень редко. Если форма предназначена для передачи текстовых данных (как это обычно бывает), этот параметр по умолчанию имеет значение application/x-www-form-urlencoded. В этом случае для передаваемых данных используется так называемая кодировка URL. Тип данных multipart/form-data позволяет передавать как текстовые, так и двоичные данные. Очевидно, при локальной обработке данных сценарием JavaScript параметр ENCTYPE не задается.
    Помимо параметров, для формы можно определить обработчик события, связанный с кнопкой типа SUBMIT. Такая кнопка предназначена для посылки данных из заполненной формы расширению сервера Web. Назначив обработчик события, сценарий JavaScript может управлять этим процессом.

    Оператор присваивания

    Оператор присваивания применяется для присваивания значений переменным. В языке сценариев JavaScript, так же как и в языке программирования С, допускается комбинирование этого оператора с другими для изменения содержимого переменных.
    Ниже мы перечислили все возможные комбинации оператора присваивания и других операторов:

    Оператор
    Описание
    =
    Простое присваивание
    +=
    Увеличение численного значения или слияние строк
    -=
    Уменьшение численного значения
    *=
    Умножение
    /=
    Деление
    %=
    Вычисление остатка от деления
    >>=
    Сдвиг вправо
    >>>=
    Сдвиг вправо с заполнением освобождаемых разрядов нулями
    <<=
    Сдвиг влево
    |=
    ИЛИ
    &=
    И
    ^=
    ИСКЛЮЧАЮЩЕЕ ИЛИ

    Для тех, кто никогда не программировал на языке С, комбинации оператора присваивания с другими операторами могут показаться непривычными и сложными для использования. На самом деле они упрощают сценарии, сокращая листинги исходных текстов.
    Рассмотрим, например, применение оператора += для увеличения содержимого числовой переменной.
    Вначале решим эту задачу без использования данного оператора. Ниже мы объявили переменную с именем nCounter и присвоили ей начальное значение 1, а затем увеличили это значение на  5:
    var nCounter = 1;
    nCounter = nCounter + 5;
    Теперь сделаем то же самое, но по-другому:
    var nCounter = 1;
    nCounter += 5;
    Как видите, второй способ короче первого.
    Для того чтобы сдвинуть содержимое переменной на три разряда вправо, вы можете воспользоваться оператором >>=, как это сделано в следующем фрагменте исходного текста:
    nCounter >>= 3;
    Результат при этом будет такой же, как и при выполнении следующей строки:
    nCounter = nCounter >> 3;

    Оператор while

    Для организации циклов с проверкой условия их завершения перед выполнением итерации используется оператор while:
    while(условие)
    {
      . . .
      строки тела цикла
      . . .
    }
    Если в результате оценки условия получается значение true, тогда итерация выполняется, если false - цикл прерывается.

    Операторы цикла

    В языке JavaScript есть несколько операторов, предназначенных для организации циклов.

    Операторы для работы с отдельными битами

    В своих сценариях вы можете применять операторы, выполняющие над битами переменных такие логические операции, как И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ, НЕ:

    Оператор
    Логическая операция
    &
    И
    |
    ИЛИ
    ^
    ИСКЛЮЧАЮЩЕЕ ИЛИ
    ~
    НЕ

    Перечисленные выше операторы перед выполнением своих функций преобразуют значения переменных в 32-разрядные целые числа.

    Операторы языка JavaScript

    Операторы языка сценариев JavaScript напоминают общеизвестные операторы языка C, поэтому мы ограничимся только кратким их описанием.

    Операторы отношения

    Операторы отношения используются для сравнения значений переменных. Эти операторы возвращают логические значения true или false в зависимости от результата сравнения и применяются главным образом в условных операторах. Эти операторы мы опишем позже в этой главе.
    Итак, ниже мы представили список операторов отношения языка сценариев JavaScript:

    Оператор отношения
    Условие, при котором оператор возвращает значение true
    >
    Левый операнд больше правого
    >=
    Левый операнд больше или равен правому
    <
    Левый операнд меньше правого
    <=
    Левый операнд меньше или равен правому
    ==
    Левый операнд равен правому
    !=
    Левый операнд не равен правому

    Примеры использования этих операторов вы найдете в разделе, посвященном условным операторам.
    В условных операторах также часто применяются логические операторы:

    Логический оператор
    Описание
    Оператор ИЛИ. Возвращает значение true, когда один из операндов равен true
    &&
    Оператор И. Возвращает значение true, когда оба операнда равны true


    Операторы сдвига

    Для выполнения операций сдвига в языке JavaScript предусмотрено три оператора:

    Оператор сдвига
    Назначение
    >>
    Сдвиг в правую сторону
    <<
    Сдвиг в левую сторону
    >>>
    Сдвиг в правую сторону с заполнением освобождаемых разрядов нулями

    Перед использованием операторов сдвига значение переменной преобразуется в 32-разрядное целое число.
    Ниже мы привели пример, в котором в переменную nValue записывается значение, полученное в результате сдвига бит числа 4. Сдвиг выполняется на два бита влево:
    var nValue;
    nValue = 4 << 2;

    Открываем новое окно

    При открытии нашего следующего документа HTML на экране появляется диалоговая панель с сообщением, показанная на рис. 2.7.
    Открываем новое окно
    Рис. 2.7. Сообщение об открытии документа HTML
    Если нажать на кнопку OK в этой диалоговой панели, то в окне браузера появится содержимое документа (рис. 2.8).
    Открываем новое окно
    Рис. 2.8. Содержимое документа NewWnd.html
    В этом окне расположена кнопка “Open Hello window”. Если нажать на эту кнопку, будет создано еще одно окно браузера, в которое загрузится содержимое файла Hello.html. Однако внешний вид этого окна будет несколько необычен (рис. 2.9).
    Открываем новое окно
    Рис. 2.9. Новое окно для просмотра содержимого документа Hello.html
    Как видите, в окне нет ни полос просмотра, ни меню, ни инструментальной линейки. Дело в том, что создавая это окно в нашем сценарии, мы указали, что перечисленные выше элементы пользовательского интерфейса отображать не нужно. Кроме того, мы определили точные размеры окна.
    Если теперь закрыть окно документа NewWnd.html, на экране появится диалоговая панель с приглашением, показанная на рис. 2.10.
    Открываем новое окно
    Рис. 2.10. Диалоговая панель с приглашением
    Исходный текст документа HTML NewWnd.html представлен в листинге2.4.
    Листинг 2.4. Файл chapter2/NewWnd/NewWnd.html

     
        Window object
       
     
     
       

    Open second window


       
       

         
          onClick="OpenHelloWnd();">

       
       

     



    В операторе мы задали обработку событий onLoad и onUnload:



    Когда пользователь загружает наш документ, после окончания загрузки браузер вызывает функцию Hello, назначенную нами для обработки события onLoad. Перед удалением окна с документом вызывается обработчик события onUnload, реализованный в функции Bye.

    Функции Hello и Bye определены в заголовке документа HTML и не имеют никаких особенностей. Для вывода диалоговой панели с сообщением эти функции вызывают метод alert.

    Когда пользователь нажимает кнопку "Open Hello window", определенную в форме, вызывается функция OpenHelloWnd. Эта функция открывает новое окно браузера, загружая в него новый документ HTML.

    Окно открывается следующим образом:

    wndNewWindow = window.open("hello.html", "",

    "toolbar=no,menubar=no,scrollbars=no,width=300,height=100");

    В качестве первого параметра методу open передается адрес URL документа HTML, который должен быть загружен в окно. Второй параметр определяет имя окна (мы его не задали), а третий - определяет параметры окна.

    Отображение нескольких документов HTML

    На рис. 4.2 мы показали внешний вид содержимого нашего авторского компакт-диска, первый выпуск которого появился недавно в продаже.
    Отображение нескольких документов HTML
    Рис. 4.2. Авторский компакт-диск
    Информация отображается в трех фреймах. Верхний фрейм используется для заголовка, левый выполняет роль оглавления, и, наконец, правый - служит для показа содержимого. Нажимая кнопки, расположенные в левом фрейме, вы можете просматривать в правой части окна различные документы HTML.
    В первом выпуске компакт-диска мы не использовали сценарии JavaScript. Сейчас мы покажем, как можно с помощью несложного сценария усовершенствовать интерфейс пользователя.
    Мы будем использовать фрейм заголовка, расположенный в верхней части окна, для размещения аннотации на материал, представленный в правом фрейме.
    При этом если нажать кнопку с надписью “Добро пожаловать”, в заголовке появится наш логотип, показанный на рис. 4.2. Если же нажать кнопку “Книги” или “Статьи”, заголовок будет выглядеть так, как это показано на рис. 4.3 и 4.4, соответственно.
    Отображение нескольких документов HTML
    Рис. 4.3. Просмотр информации о книгах
    Отображение нескольких документов HTML
    Рис. 4.4. Просмотр информации о статьях
    В листинге 4.5 мы показали исходный текст файла описания фреймов.
    Листинг 4.5. Файл chapter4/ourCD/index.html


     
        Авторский диск Александра Фролова и Григория Фролова
     
     
       
       
         
         
       
       
         
         
       

     


    Так же как и в предыдущем примере, здесь описаны три фрейма.

    Документ заголовка, который отображается сразу после загрузки фрейма, а также после того как пользователь нажмет кнопку “Добро пожаловать”, показан в листинге 4.6.

    Листинг 4.6. Файл chapter4/ourCD/title.html



     

       

     

     

       

       

         

           

       
    Александр Фролов и Григорий Фролов, технические писатели из Москвы 

           
    Александр Фролов и Григорий Фролов, технические писатели из Москвы

         


       

     



    Файл main.html представлен в листинге 4.7 (в сокращенном виде). Он не имеет никаких интересных особенностей.

    Листинг 4.7. Файл chapter4/ourCD/main.html



     

       

        Untitled

     

     

       

    Добро пожаловать!



       

       

       

        Вы приобрели первый выпуск авторского компакт-диска технических писателей Александра Фролова и Григория Фролова.

          . . .

       

       
    © Александр Фролов, Григорий Фролов, 1997   


     




    Гораздо важней для нас файл toc.html. В этом файле находятся функции сценария JavaScript и ссылки на другие документы HTML. Этот файл с несущественными сокращениями показан в листинге 4.8.

    Листинг 4.8. Файл chapter4/ourCD/toc.html



     

     

     

      

      Добро пожаловать

     

      Книги

     

      Статьи

     

        . . .

     

     



    Функция loadPage загружает в фреймы mainpage и title документы HTML, адреса URL которых передаются ей через параметры. Для загрузки мы устанавливаем свойство location.href для окна соответствующего фрейма:

    parent.mainpage.window.location.href=szNewURL;

    parent.title.window.location.href=szTitle;

    Для вызова функции loadPage мы использовали следующую конструкцию:

    Добро пожаловать

    Здесь в параметре HREF оператора ссылки после ключевого слова javascript мы расположили строку вызова функции. Обратите внимание на использование одинарных и двойных кавычек. Так как в сценариях JavaScript вложение одинаковых кавычек недопустимо, для строк, передаваемых функции в качестве параметров, мы применили одинарные кавычки. Значение параметра HREF выделено при этом двойными кавычками.

    Ожидание загрузки всех изображений

    Если вы собираетесь разместить в своем документе HTML анимационное изображение, состоящее из отдельных кадров, которые, в свою очередь, расположены в отдельных файлах, возникает одна проблема. Она связана с непредсказуемостью времени загрузки всех изображений анимационной последовательности через медленный и нестабильный канал Internet.
    Чтобы анимационное изображение было показано без искажений, необходимо вначале дождаться завершения процесса загрузки файлов отдельных кадров, и лишь затем запускать анимацию.
    В листинге 5.3 мы привели исходный текст документа HTML со сценарием, который работает подобным образом.
    Листинг 5.3. Файл chapter5/noise/noise2.html

     
        Animation with JavaScript
       
     
     
        
       
     

    В теле документа HTML расположен сценарий, вызывающий последовательно функции loadAllImages и showNextImage:

    loadAllImages(nNumberOfImages);

    showNextImage();

    Функции loadAllImages в качестве параметра передается общее количество изображений в анимационной последовательности. В нашем случае оно равно 18.

    Задача функции loadAllImages заключается в заполнении массива объектов класса Image. Этот массив определен в области заголовка нашего документа HTML:

    var imgArray = new Array(18);

    Заполнение массива выполняется в цикле:

    var i;

    for(i=0; i
    {

      imgArray[i] = new Image();

      imgArray[i].src = "img0" + (i+1) + ".gif";

    }

    Для каждого элемента массива вначале с помощью ключевого слова new создается объект класса Image, а затем устанавливается значение свойства src этого объекта. Последняя операция и приводит к инициированию загрузки файла изображения, выполняемой асинхронно.

    После того как массив заполнен, можно вызывать функцию showNextImage. Она идентична описанной в предыдущем примере, за исключением того что для установки свойства src изображения Img используются элементы заранее подготовленного массива imgArray:

    document.Img.src = imgArray[i-1].src;

    Параметры оператора

    Между операторами и располагаются операторы , определяющие параметры отдельных фреймов. Это параметры SRC и NAME. Первый из этих параметров задает адрес URL документа HTML, который будет загружен в данный фрейм, а второй - имя фрейма, которое можно использовать в сценарии JavaScript для адресации объектов, расположенных во фрейме. Заметим, что адрес URL не должен содержать ссылки на локальные метки (anchor).
    Оператор имеет следующие параметры:

    Параметр
    Описание
    ALIGN
    Используется только для “плавающих фреймов” в браузере Microsoft Internet Explorer. Задает выравнивание фрейма или текста, расположенного рядом с фреймом. Этот параметр может принимать следующие значения: LEFT, CENTER, RIGHT, TOP, BOTTOM
    MARGINHEIGHT
    Размер отступа по вертикали от границ фрейма в пикселах
    MARGINWIDTH
    Размер отступа по горизонтали от границ фрейма в пикселах
    FRAMEBORDER
    Если значение этого параметра равно 1, фреймы будут иметь трехмерную рамку, ширина которой задается в пикселах. В том случае, когда указано значение 0, рамка не создается
    NAME
    Этот параметр задает имя фрейма, которое используется в операторе ссылки для указания, в какой фрейм нужно загрузить новый документ
    NORESIZE
    Если указан этот параметр, пользователь не сможет изменять размеры фрейма, передвигая его границы мышью
    SCROLLING
    Параметр SCROLLING определяет, нужно ли создавать полосы просмотра для свертки содержимого фрейма. Для этого параметра можно указывать следующие значения:
    YES        полосы просмотра создаются всегда;
    NO          полосы просмотра не создаются;
    AUTO     полосы просмотра создаются только при необходимости, когда документ HTML не помещается полностью в окне фрейма
    SRC
    Адрес URL файла с документом HTML, который загружается в окно фрейма


    Параметры оператора

    Рассмотрим подробнее параметры оператора , предназначенного для определения набора фреймов.

    Параметр
    Описание
    COLS
    Ширина колонки в процентах, пикселах или относительный размер
    ROWS
    Высота строки в процентах, пикселах или относительный размер
    FRAMEBORDER
    Если значение этого параметра равно 1, фреймы будут иметь трехмерную рамку, ширина которой задается в пикселах. В том случае, когда указано значение 0, рамка не создается
    BORDER
    Используется только браузером Netscape Navigator. Задает толщину рамки фрейма в пикселах
    FRAMESPACING
    С помощью этого параметра можно задать дополнительное расстояние между фреймами в пикселах

    Параметры COLS и ROWS нужны в том случае, когда фреймы, определенные в наборе, располагаются в виде таблицы. Первый из этих параметров указывает ширину колонки, а второй - высоту строки. Если фреймы располагаются в одном столбце, параметр COLS указывать не надо. Аналогично, если фреймы занимают только одну строку, не нужно указывать параметр ROWS.
    Вы можете задать значения для параметров COLS и ROWS либо в процентном отношении, соответственно, к ширине и высоте окна браузера, либо в пикселах. Если вместо значения указан символ *, колонка или строка занимают всю оставшуюся часть окна.
    Например, ниже указано, что высота первого фрейма равна 90 пикселам, а второй фрейм занимает всю нижнюю часть окна браузера:

    В следующем примере два фрейма, расположенные рядом, занимают, соответственно, 20% и 80% ширины окна браузера.


    Parse

    Метод parse возвращает количество миллисекунд, прошедших с 00 часов 00 минут 1 января 1970 года по время, указанное в параметре функции. Для вызова этого метода вам не нужно создавать объект класса Date, а можно просто сослаться на имя этого класса:
    nMS = Date.parse(szDataString);
    Через параметр szDataString вы можете указать время, например, так:
    “12 Oct 1998 12:00:00”
    “12 Oct 1998 12:00:00 GMT”
    “12 Oct 1998 12:00:00 GMT+0330”
    Первая из этих строк задает локальную дату и время, вторая - дату и время по Гринвичу, и, наконец, последняя, - время и дату по Гринвичу со смещением на 3 часа и 30 минут.
    Метод parse обычно применяют вместе с конструктором объекта Date или с методом setTime, который мы рассмотрим ниже.

    Переключатель checkbox

    Переключатели checkbox обычно применяются для выбора каких-либо независимых друг от друга параметров или возможностей.
    В форме переключатель checkbox создается с помощью оператора с параметром TYPE, равным строке "checkbox":
      NAME="Имя_переключателя_checkbox"
      VALUE="Значение"
      CHECKED
      onClick="Обработчик_события">
      Текст, отображаемый рядом с переключателем
    Параметр NAME задает имя переключателя. Это имя можно использовать для определения состояния этого переключателя в сценарии JavaScript.
    С помощью параметра VALUE вы можете определить строку, которая передается расширению сервера при посылке заполненной формы, если переключатель находится во включенном состоянии. Если этот параметр не указан, то по умолчанию посылается строка “on”. Сценарий JavaScript также может получить значение параметра VALUE.
    Необязательный параметр
    CHECKED указывается в том случае, если при начальном отображении формы переключатель должен отображаться во включенном состоянии.
    Если для переключателя определен обработчик события, вы можете задать сценарий JavaScript, получающий управление после того как пользователь изменит состояние переключателя.

    Переключатель radio

    Переключатели типа radio применяются в тех случаях, когда нужно организовать выбор одной из нескольких возможностей. Исходя из этого, в форме обычно располагается несколько таких переключателей.
    Определение переключателя radio выглядит следующим образом:
      NAME=" Имя_переключателя_radio"
      VALUE="Значение"
      CHECKED
      onClick="Обработчик_события">
      Текст, отображаемый рядом с переключателем
    Назначение параметров NAME, VALUE и CHECKED переключателя radio такое же как и назначение аналогичных параметров переключателя checkbox. Отличие заключается в том, что все переключатели radio, принадлежащие к одной группе, должны иметь одинаковые имена, определенные параметром NAME. Что же касается переключателей checkbox, то если их несколько, то все они должны называться  по-разному.
    Для того чтобы расширение сервера Web или сценарий JavaScript, обрабатывающие форму, могли узнать, какой же из переключателей radio группы находится во включенном состоянии, все такие переключатели должны иметь различные значения VALUE.
    Кроме того, только один из переключателей radio может быть определен с параметром CHECKED.

    Переменные в JavaScript

    В сценариях JavaScript вы можете использовать переменные, адресуясь к ним по имени. Переменные могут быть как глобальные, так и локальные. Глобальные переменные доступны из любого места сценария. Область действия локальных переменных ограничивается функцией, внутри которой эти переменные объявлены.
    Так же как и в языке программирования Basic, при составлении сценариев JavaScript вы можете использовать переменные без их предварительного объявления. Исключение из этого правила - локальные переменные, определенные в функциях.
    Мы рекомендуем объявлять переменные перед их использованием, а также присваивать им начальные значения. Это упростит отладку сценариев и уменьшит вероятность возникновения ошибок при составлении исходного текста, особенно если вы применяете одновременно глобальные и локальные переменные.

    Первый способ: создание cookie расширением сервера Web

    Для того чтобы создать cookie первым способом, расширение сервера Web обычно добавляет в заголовок HTTP динамически создаваемого документа HTML поле с именем Set-Cookie. В этом поле определяются имена и значения параметров cookie.
    Когда расширение сервера Web вызывается из документа HTML, имеющего cookie, параметры cookie предаются этому расширению через поле Cookie заголовка HTTP и могут быть проанализированы.
    Заголовок HTTP, предназначенный для создания cookie, выглядит следующим образом:
    Set-Cookie: Имя=Значение; expires=Дата_GMT;
    path=Адрес_URL; domain=Домен; secure
    Описание отдельных полей заголовка Set-Cookie приведено ниже:

    Поле
    Описание
    Имя
    Произвольное имя параметра, определенного в cookie. Здесь вы можете использовать любую строку, лишь бы в ней не было пробелов, запятых и двоеточий. В том случае, когда имя должно содержать перечисленные выше символы, используйте кодировку URL
    Значение
    Текстовая строка значений параметров. В этой строке не должно быть пробелов, запятых и двоеточий, поэтому вы должны использовать для нее кодировку URL
    expires
    Дата автоматического удаления cookie по Гринвичу. Если эта дата не указана, а параметр expires отсутствует, cookie будет удалено сразу после того, как браузер закончит сеанс связи с сервером Web
    domain
    Доменная часть адреса URL, для которой действует данный cookie. Если этот параметр не указан, то по умолчанию используется доменный адрес URL документа HTML, где был установлен cookie
    path
    Часть адреса URL, задающая путь к документу HTML, для которой действует данный cookie. Если этот параметр не указан, то по умолчанию используется адрес URL документа HTML, где был установлен cookie
    secure
    Если указано это поле, данные cookie необходимо предавать только с использованием защищенного протокола SSL. Такой протокол используется серверами HTTPS

    Все поля, кроме первых двух (Имя и Значение), необязательны.
    Дата должна быть записана в формате День_недели, ДД-Мес-ГГ ЧЧ:ММ:СС GMT, где:
  • День_недели - английское трехбуквенное сокращение названия дня недели (например, Mon);


  • ДД - номер дня недели;


  • Мес - английское трехбуквенное сокращение названия месяца (например, Jun);


  • ГГ - две последние цифры года;


  • ЧЧ - часы;


  • ММ - минуты;


  • СС - секунды


  • Например, дата может быть указана так:

    Mon, 07-Jun-93 14:45:00 GMT

    Сделаем небольшое замечание относительно полей domain и path, определяющих условие, при котором выполняется установка cookie.

    Когда браузер загружает документ HTML с сервера Web и среди заголовков HTTP этого документа присутствует заголовок Set-Cookie, он проверяет возможность установки cookie. В процессе проверки анализируется адрес URL, откуда был загружен этот документ, а также содержимое полей domain и path.

    Если эти поля не указаны, то по умолчанию считаются, что они соответствуют адресу URL, по которому находится загруженный документ HTML. В этом случае выполняется установка cookie.

    В том случае, когда указано поле domain, установка cookie выполняется только тогда, когда документ был загружен с сервера Web, принадлежащего данному домену.

    С помощью параметра path можно установить ограничение на адреса URL в рамках домена, для которых выполняется установка cookie. При этом значение “/” соответствует всем адресам данного домена.

    Одновременно сервер Web может создать несколько параметров cookie, включив в заголовок документа HTML несколько заголовков Set-Cookie.

    PI

    Свойство PI - это число p. Оно также является константой с приблизительным значением, равным 3,14.
    Пример использования свойства PI:
    var nL;
    var nR;
    nL = 2 * Math.PI * nR;
    Здесь свойство PI используется для вычисления длины окружности по ее радиусу. Вычисление выполняется по следующей формуле:
    l = 2pR,
    где R - радиус окружности.

    Плавное изменение цвета фона документа HTML

    Просматривая страницы некоторых серверов Web, вы могли обратить внимание, что цвет их фона начинает плавно изменяться сразу после загрузки, становясь постепенно светлее или наоборот, темнее. Аналогичный эффект может быть получен не только для цвета фона, но и для цвета текста, а также гипертекстовых ссылок. Вы можете сделать, например, так, чтобы строки текста постепенно проявлялись на фоне страницы или исчезали (чтобы посетитель не успел их прочесть).
    Сложный на первый взгляд эффект достигается чрезвычайно просто: изменением свойства bgColor объекта document. В листинге 2.10 мы привели пример сценария, который после загрузки документа HTML в окно браузера изменяет цвет его фона с белого на черный.
    Листинг 2.10. Файл chapter2/ChangeBkg/ChangeBkg.html

     
        Color Links
       

      

     

       

    Cookies Notepad



       


         

         
          onClick="btnClick();">

         
          onClick =

            "removeCookie('MyText');TestForm.Comment.value=''">

         

       
       

       

     



    В нем, по сравнению с документом из раздела “Записная книжка Cookies Notepad”, мы добавили параметр ACTION в оператор
    , а также кнопку типа submit с надписью Send. С помощью этой кнопки данные из формы отправляются расширению ISAPI:


      . . .



      . . .



    . . .

    Исходный текст расширения ISAPI представлен в листинге 7.5. Он сделан на базе примера, взятого из 29 тома нашей “Библиотеки системного программиста” (раздел “Приложение ISHELLO” восьмой главы).

    Листинг 7.5. Файл chapter7/NotebookISAPI/ishello.c

    // ===============================================

    // Расширение ISAPI ishello.c

    // Пример расширения ISAPI, отображающего

    // содержимое cookie

    //

    // (C) Фролов А.В., 1997, 1998

    // E-mail: frolov@glas.apc.org

    // WWW:    http://www.glasnet.ru/~frolov

    //         или

    //         http://www.dials.ccas.ru/frolov

    // ===============================================

    #include

    #include

    // =========================================================

    // Функция 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"

        " Simple ISAPI Extension\n"

        "

    Hello from ISAPI Extension!

    \n");

      // Добавляем разделительную линию

      strcat(szBuff, "
    ");

     

      // Добавляем версию интерфейса ISAPI

      wsprintf(szTempBuf, "Extension Version: %d.%d",

        HIWORD(lpECB->dwVersion), LOWORD(lpECB->dwVersion));

      strcat(szBuff, szTempBuf);

     

      // Название метода передачи данных

      wsprintf(szTempBuf, "
    Method: %s", lpECB->lpszMethod);

      strcat(szBuff, szTempBuf);

     

      // Строка параметров запуска расширения ISAPI

      wsprintf(szTempBuf, "
    QueryString: %s",

        lpECB->lpszQueryString);

      strcat(szBuff, szTempBuf);

     

      // Физический путь к программному файлу расширения ISAPI

      wsprintf(szTempBuf, "
    PathTranslated: %s",

        lpECB->lpszPathTranslated);

      strcat(szBuff, szTempBuf);

      // Полный размер данных, которые нужно получить

      wsprintf(szTempBuf, "
    TotalBytes: %d",

        lpECB->cbTotalBytes);

      strcat(szBuff, szTempBuf);

      // Тип данных

      wsprintf(szTempBuf, "
    ContentType: %s",

        lpECB->lpszContentType);

      strcat(szBuff, szTempBuf);

      // Отображаем содержимое COOKIE

      strcat(szBuff, "
    Cookie:
    ");

      dwSize = 4096;

      lpECB->GetServerVariable(lpECB->ConnID,

        (LPSTR)"HTTP_COOKIE", (LPVOID)szTempBuf, &dwSize);

      strcat(szBuff, szTempBuf);

      // Конечный фрагмент документа HTML

      strcat(szBuff, ""); 

      // Посылаем содержимое буфера удаленному пользователю

      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

    Итак, вы научились создавать cookie в сценариях JavaScript. Теперь решим другую задачу - определение значения параметров cookie.
    Эта задача сводится к простому сканированию текстовой строки, полученной следующим образом:
    var szCookieString = document.cookie; 
    В этой строке вам нужно найти подстроку “Имя=Значение;”, а затем извлечь полученное значение.
    Для облегчения этой работы вы можете воспользоваться функцией findCookie. Исходный текст этой функции приведен ниже:
    function findCookie(szName)
    {
      var i = 0;
      var nStartPosition = 0;
      var nEndPosition = 0; 
      var szCookieString = document.cookie; 
      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;
          return document.cookie.substring(
              nStartPosition,nEndPosition); 
          break;   
        }
        i++; 
      }
      return "";
    }
    После извлечения строки из свойства document.cookie и записи этой строки в переменную szCookieString функция findCookie организует цикл по всем символам этой строки. Условием завершения цикла является просмотр всех szCookieString.length символов.
    Сравнивая имя параметра с подстрокой, извлеченной из строки szCookieString при помощи метода substring, функция findCookie пытается найти нужный параметр. Если такая попытка оказывается успешной, функция findCookie пропускает символ присваивания, извлекая значение параметра, ограниченное символом точка с запятой. Это значение возвращается функцией findCookie.
    Если же поиск оказывается неудачным, функция findCookie возвращает пустую строку.
    Как пользоваться функцией findCookie?
    Во-первых, с помощью этой функции вы можете проверить, установлен ли для данного документа cookie с заданным именем:
    if(findCookie("Visit") == "")
    {
      // cookie с именем Visit установлен
      . . .
    }
    else
    {
      // cookie с именем Visit не установлен
      . . .
    }
    Для того чтобы записать в текстовую переменную значение параметра cookie с заданным именем, вы должны сделать следующее:
    var szVisitValue = findCookie("Visit");
    Как видите, пользоваться функцией findCookie достаточно просто.

    Pow

    Возведение числа в заданную степень.
    Пример использования:
    var nValue;
    nValue = Math.pow(2, 3);
    Здесь число 2 возводится в степень 3, а результат, равный 8, записывается в переменную nValue.

    В этой книге мы расскажем

    В этой книге мы расскажем о новой технологии, предназначенной для разработчиков серверов Web. Это язык сценариев JavaScript, получивший широкое распространение в глобальной сети Internet.
    Для тех, кто еще не знаком с Internet, предназначен наш 23 том “Библиотеки системного программиста”, который называется “Глобальные сети компьютеров. Практическое введение в Internet, E-Mail, FTP, WWW и HTML, программирование для Windows sockets”. Здесь вы найдете всю информацию, необходимую для того чтобы подключиться к этой сети и приступить к работе.
    Тем из вас, кто интересуется созданием собственных серверов в сети Internet, мы рекомендуем прочитать 29 том “Библиотеки системного программиста” с названием “Сервер Web своими руками”. В этом томе мы рассказали о языке разметки гипертекста HTML, о программах CGI и приложениях ISAPI, а также, конечно, о том, как установить и настроить свой сервер Web.
    Многие современные серверы Web являются активными или содержат активные страницы, которые взаимодействуют с пользователем. Описанные в только что упомянутом 29 томе программы CGI и приложения ISAPI позволяют создавать активные серверы Web, способные получать данные от удаленного пользователя, обрабатывать их и посылать результат обработки обратно в виде документа HTML. В качестве примера активных приложений, работающих на сервере Web, можно назвать чрезвычайно популярные счетчики посещений, гостевые книги, базы данных, доступные через Internet и так далее.
    Что же касается активных страниц Web, то с их помощью также можно создавать диалоговые приложения, однако обработка введенных данных выполняется не на сервере, а на рабочей станции пользователя, то есть локально. Активными мы будем называть документы HTML, которые содержат в себе аплеты Java, а также программы, составленные на таких языках, как JavaScript и VBScript.
    Преимущества, которые можно получить при использовании активных страниц, заключаются не только в улучшении внешнего вида страниц (что само по себе немаловажно), но и в снижении потока данных между рабочей станцией пользователя и сервером Web, а также в снижении загрузки этого сервера. Это, в свою очередь, благоприятно сказывается на скорости реакции сервера.


    Что касается аплетов и полноценных приложений Java, то им посвящены тома 30 и 32 “Библиотеки системного программиста”, которые называются “Создание приложений Java. Часть 1” и “Создание приложений Java. Часть 2”, соответственно. Размещая на страницах сервера Web аплеты Java, вы можете выполнять на рабочей станции достаточно сложную локальную обработку данных. Реализация такой обработки с помощью программ CGI или приложений ISAPI была бы затруднительной или вовсе невозможной.
    Предметом изучения книги, которую вы сейчас держите в руках, является еще одно средство, предназначенное для создания активных страниц - язык JavaScript.
    Заметим сразу, что язык JavaScript не имеет никакого отношения к языку Java, несмотря на схожее название.
    Язык программирования Java был создан фирмой Sun и произошел от языка Oak. По своему синтаксису он сильно похож на С++, однако есть немаловажные отличия, описанные нами в 30 томе “Библиотеки системного программиста”.
    Первоначальное название языка JavaScript, разработанного фирмой Netscape Communication Corporation, было LiveScript. Затем, после того как язык Java получил всемирную известность, LiveScript переименовали в JavaScript. Возможно, это было сделано фирмой Netscape из коммерческих соображений: все, что имело в своем названии ключевое слово “Java”, вызывало живой интерес.
    При разработке языка программирования JavaScript предполагалось, что он будет предназначен для непрофессионалов. По простоте использования JavaScript больше всего напоминает Basic, хотя с помощью него квалифицированные программисты могут решать достаточно серьезные и, что немаловажно, полезные задачи.
    В первой главе нашей книги мы приведем семь сценариев JavaScript, демонстрирующих основные возможности этого языка, расскажем о переменных и операторах JavaScript.
    Во второй главе мы расскажем о классах и объектах JavaScript. Заметим, что несмотря на свою простоту, JavaScript является объектно-ориентированным языком. Мы приведем достаточно полное описание классов, доступных разработчикам сценариев JavaScript, и многочисленные примеры применения этих классов.


    Третья глава посвящена описанию приемов обработки сценариями JavaScript данных, которые пользователи вводят в полях формы, а также другим аспектом интеграции сценариев JavaScript и форм. Мы подробно расскажем об объектах JavaScript, создаваемых для органов управления форм, и научим их использовать в практике разработки интерактивных документов HTML. Отдельно будут рассмотрены вопросы проверки содержимого полей формы перед их отправкой расширению сервера Web для обработки.
    В четвертой главе мы расскажем о том, как с помощью сценариев JavaScript можно передавать данные между различными фреймами и получать эффекты, недостижимые в случае применения одного только языка разметки гипертекста HTML.
    Сценарий JavaScript может работать с растровыми графическими изображениями, расположенными в документе HTML, обращаясь к ним как к объектам JavaScript. В пятой главе мы описали методику динамической замены растрового графического изображения, которую можно использовать для “оживления” документа HTML.
    Шестая глава затрагивает вопросы взаимодействия сценария JavaScript с аплетами Java, встроенными в документ HTML. Такое взаимодействие предусматривает вызов из сценария JavaScript методов, определенных в аплете, а также обращение к полям классов аплета.
    В седьмой главе мы подробно рассмотрим механизм cookie, предназначенный для организации локального хранения информации пользователя. Эту информацию можно устанавливать и считывать как при помощи сценариев JavaScript, так и расширениями сервера Web (программами CGI или приложениями ISAPI). Мы приведем исходные тексты сценариев JavaScript и расширений сервера Web, работающих с cookie.
    Что вам потребуется для работы с книгой?
    Прежде всего, нужен компьютер, оснащенный 8-16 Мбайт оперативной памяти с операционной системой Microsoft Windows 95 или Microsoft Windows NT. Вам также потребуются браузер Microsoft Internet Explorer версии 4.0 и отладчик Microsoft Script Debugger. Последние две программы вы можете бесплатно переписать к себе с сервера Web корпорации Microsoft по адресу http://www.microsoft.com/ie. Для проверки совместимости созданных вами программ неплохо также иметь браузер Netscape Navigator 3.0 или 4.0, демонстрационную версию которого можно бесплатно получить с сервера http://www.netscape.com.


    Для редактирования программ JavaScript вы можете применять любые средства создания документов HTML, хотя вполне достаточно редактора, входящего в комплект отладчика Microsoft Script Debugger или даже приложения Notepad.
    Кроме всего прочего, чтобы составлять программы на JavaScript, вы должны быть знакомы с языком HTML. Для изучения этого языка мы рекомендуем вам прочитать 29 том нашей “Библиотеки системного программиста”, содержащей описание HTML в необходимом объеме.
    Для отладки сценариев JavaScript, описанных в седьмой главе и взаимодействующих с расширениями сервера Web, вам потребуется сервер Microsoft Internet Information Server. Вы можете использовать также сервер Web, входящий в комплект операционной системы Microsoft Windows NT Workstation версии 4.0 или даже Microsoft Personal Web Server, разработанный для Microsoft Windows 95. Сервер Microsoft Personal Web Server доступен для бесплатной загрузки из Internet.
    Исходные тексты всех программ вы можете найти на компакт-диске, который продается вместе с книгой. Эти тексты, так же как и исходные тексты программ из всех предыдущих томов “Библиотеки системного программиста”, есть также и на нашем авторском компакт-диске. Подробная информация об авторском компакт-диске есть в сети Internet на сервере авторов этой книги по адресу http://www.glasnet.ru/~frolov или http://www.dials.ccas.ru/frolov.
    Мы выражаем благодарность генеральному директору АО “ДиалогНаука” Антимонову Сергею Григорьевичу и его заместителю Лященко Юрию Павловичу за возможность размещения информации о наших книгах на сервере Web по адресу http://www.dials.ccas.ru/frolov, а также за возможность доступа к сети Internet через сервер АО “ДиалогНаука”.
    Мы также благодарим корректора Кустова В. С. и сотрудников издательского отдела АО “Диалог-МИФИ” Голубева О. А., Дмитриеву Н. В., Виноградову Е. К., Кузьминову О. А.

    Предметный указатель

    --, 18
    -, 18
    !, 18
    !=, 19
    %, 18
    %=, 20
    &, 19
    &&, 19
    &=, 20
     , 17
    (), 22
    *, 18
    *=, 20
    ,, 22
    ., 22
    /, 18
    /=, 20
    ?:, 21
    [], 22
    ^, 19
    ^=, 20
    _blank, 48
    _parent, 48
    _self, 48
    _top, 48
    |, 19
    , 19
    |=, 20
    ~, 19
    +, 18
    ++, 18
    +=, 20
    <, 19
    <<, 19
    <<=, 20
    <=, 19
    , 46; 48; 95
    , 108
    , 45
    , 31
    , 32; 60
    , 95
    , 35; 94
    , 102
    , 62
    , 43
    , 94