ПРИМЕРЫ СКРИПТОВ
- Калькулятор
- Бегущая строка
- Идущие часы
- Минимизация-максимизация окна и его удаление
- Использование окон для построения HELP
Современные гипертекстовые информационные системы условно можно представить в виде совокупности нескольких компонентов: систем хранения гипертекстовых объектов, систем отображения гипертекстовых объектов, систем подготовки гипертекстовых объектов и систем программирования просмотра совокупности гипертекстовых объектов. С этой точки зрения, технология World Wide Web только к 1996 году получила законченный, функционально полный вид. Первыми были разработаны системы хранения и просмотра (1989-1991), которые продолжают развиваться и в настоящее время. После 1990 года стали появляться первые системы подготовки документов. Наконец, в 1995 году были предложены первые языки управления сценариями просмотра. В данной статье речь пойдет как раз об одном из них - JavaScript.
Программирование процедуры просмотра гипертекстовой базы данных не является изобретением Netscape, Microsoft или Sun. Практически все локальные гипертекстовые системы в той или иной степени имеют программные средства манипулирования гипертекстовыми объектами.
В ряде случаев вся гипертекстовая база данных может быть представлена как одна большая программа, в которой гипертекстовые узлы - это программные модули, а связи между ними - это передача управления от одного модуля другому.
Преимущества такого подхода перед традиционной статической разметкой очевидны: гибкость построения гипертекстовой сети, возможность создания программ прокрутки фрагментов базы данных, генерация составных гипертекстовых объектов из существующих элементарных компонентов. Динамические объекты могут быть легко получены из статических, так как в случае существования браузера система может быть переведена из интерактивного режима просмотра гипертекстовой базы данных в пакетный, когда действия оператора будут заменяться командами программы.
Браузеры гипертекстовых страниц традиционно называют скриптами (scripts), по аналогии с исполняемыми файлами, написанными для командных интерпретаторов типа sh. Собственно, как это было и раньше в локальных системах, в программировании просмотра гипертекстовых документов World Wide Web существуют два подхода: создание интерпретируемых браузером скриптов или компиляция байт-кода. Первый подход не выходит за рамки традиции World Wide Web, согласно которой для разработки гипертекстовой страницы нужен только обычный текстовый редактор, и сам гипертекстовый документ должен легко читаться человеком-оператором. Второй подход позволяет повысить эффективность исполнения программы и защищенность кода от несанкционированных модификаций. Как первый, так и второй способы опираются на объектно-ориентированный подход к программированию. По поводу байт-кодов, или, как их еще называют, мобильных кодов, написано в контексте технологии программирования Java достаточно много, поэтому сосредоточим свое внимание на скриптах, а точнее, на скриптах, написанных на языке JavaScript.
Основы подхода к программированию на JavaScript
Идея JavaScript очень проста. Все операции, которые можно исполнять в программе на JavaScript, описывают действия над хорошо известными и понятными объектами, которыми являются элементы рабочей области программы Netscape Navigator и контейнеры языка HTML. Собственно объектная ориентированность JavaScript на этом и кончается. Никаких классов объектов, а тем более, наследования в JavaScript нет. Есть только объекты с набором свойств и набор функций над объектами, которые называются методами. Кроме методов существуют и другие функции, больше похожие на функции из традиционных языков программирования, которые позволяют работать со стандартными математическими типами или управлять процессом выполнения программы. Еще в JavaScript есть события - аналог программных прерываний. Эти события также ориентированы на работу в World Wide Web, например загрузка страницы в рабочую область Navigator или выбор гипертекстовой ссылки. Используя события, автор гипертекстовой страницы и программы, ее отображающей, может организовать просмотр динамических объектов, например бегущей строки, или управление многооконным интерфейсом.
Для встраивания скриптов в тело HTML-документа используется контейнер SCRIPT. Не все браузеры способны распознавать и исполнять скрипты, поэтому само тело скрипта помещается в контейнер комментария. Рассмотрим пример 1.
В этом примере в заголовок документа (контейнер HEAD) включен контейнер SCRIPT. До недавнего времени атрибут LANGUAGE в этом контейнере не являлся обязательным. Но с момента выхода VBSCRIPT появился смысл в указании типа языка - Navigator не понимает скриптов на других языках. Отсутствие атрибута может привести к ошибкам при отображении гипертекстовых страниц.
Далее, в тексте страницы определен комментарий, в который включен текст скрипта. Начинается комментарий со строки:
И кончается строкой:
// The end of JavaScript Functions Definition ->
Внутри контейнера SCRIPT определены две функции пользователя: help_win() и main_menu(). Смысл этих функций достаточно прозрачен. Help_win() предназначена для организации контекстно зависимого help, а main_menu() осуществляет допуск пользователя к главному меню Website. Обе функции используют один и тот же метод open (встроенную в JavaScript функцию, которая определена над объектом window) для того, чтобы открыть новое окно Netscape Navigator и загрузить в него гипертекстовые документы. При этом функция main_menu порождает стандартное окно (с кнопочками, иконками и т.п.), а функция help_win() - окно без стандартных атрибутов. У этого окна имеются только линейки прокрутки (scroll bars).
Вызов функций осуществляется после нажатия на соответствующие кнопки, которые определены в HTML-форме help_call. Таким образом, функции будут выполняться только в том случае, если произойдет событие, описанное атрибутом onClick в контейнере INPUT соответствующего поля формы.
Если быть более точным, то приведенный пример - это фрагмент, реализующий регистрацию пользователя. К моменту его выполнения окно главного меню уже открыто, поэтому при выборе кнопки NEXT окно не создается, а текст загружается в уже открытое окно.
Примеры скриптов.
Калькулятор
Теоретизировать на предмет написания скриптов на JavaScript можно долго. Но самый продуктивный способ получить представление о языке - это разбор примеров. Если посмотреть на список этих примеров, который можно найти в соответствующей директории Yahoo, легко убедиться, что больше всего там различного сорта калькуляторов. Разберем программу такого же типа, только это будет не калькулятор, а программа обучения устному счету.
Приведенный пример 2 содержит датчик случайных чисел (функции init и rand), таблицу, реализующую функции кнопок клавиатуры, и блок проверки результата вычислений. После загрузки программы пользователь должен выбрать тип вычислений (+,-), интервал вычислений (в пределах 10, 20, 100) и нажать кнопку "?" для генерации примера. После ввода числа с отображаемой клавиатуры пользователь нажимает на символ "=", что означает исполнить, и система проверяет правильность ответа. Если ответ правильный, то программа выдает "Молодец!", если нет - "Думай!". В системе Windows 3.x нет встроенного датчика случайных чисел, поэтому стандартная функция rand в этой версии JavaScript не реализована. Используемый в данной программе датчик был позаимствован из телеконференции по JavaScript. В скрипте, кроме этого, применяются объект типа "дата" и его методы, а также встроенные функции контроля вводимых данных. Как явствует из примера, обращение к полям HTML-формы представляет собой обращение к структуре, корнем которой является объект "окно", в котором определен объект "документ", внутри которого определена форма, а также ее поля и атрибуты полей. Не у всех полей можно менять значения атрибутов, так, например, атрибут VALUE в кнопке не меняет своего значения, если только не перезагрузить страницу.
Бегущая строка
Другой часто встречающийся пример - бегущая строка. Строка может бежать либо в поле статуса (низ экрана), либо внутри поля формы. Рассмотрим пример 3.1.
Здесь приведен фрагмент страницы компании "Демос", разработанный Дмитрием Алтуховым (ady@demos.su). Как видно из этого примера, прокрутка осуществляется за счет изменения содержания отображаемой переменной msg1. Запускается бегущая строка в момент загрузки страницы по событию onLoad. Из комментария к примеру следует, что автор не несет ответственности за проблемы, которые может данный скрипт породить при его отображении браузером на компьютере пользователя. Собственно проблема вызвана применением функции setTimeout. Изначально предполагалось, что пбраузер, который поддерживает JavaScript, будет исполняться в среде многопоточных операционных систем. В этом случае к моменту порождения нового потока старый уже завершится, и setTimeout будет, таким образом, порождать последовательно исполняемые потоки. Однако при реализации JavaScript в Netscape Navigator 2.0 не все было выполнено аккуратно, и setTimeout стала просто "пожирать" ресурсы компьютера. Системы Windows 3.x вообще не являются многопоточными, и в них просто происходит переполнение стека при выполнении данного скрипта. Весь вопрос заключается только в том, как быстро "упадет" система, а это зависит от объема исполняемой по setTimeout функции. Самое лучшее, что можно посоветовать, если вдруг на экране появляется прокрутка, - поскорее покинуть такую страницу. Справедливости ради, следует отметить, что прокрутку можно организовать и другими способами, поэтому ее появление не обязательно должно вызывать крах системы или браузера.
Прокручивать можно и вертикальные фрагменты. Достигается это за счет использования полей типа TEXTAREA (пример 3.2).
Собственно все организовано так же, как и в предыдущем примере, только прокрутка осуществляется в поле формы; для этого поля введен параметр переноса текста на новую строку, ширина поля подобрана под размер выводимых строк. Прокрутка осуществляется как по событию onLoad, так и при нажатии на кнопку Start/Stop. В этом случае не надо немедленно покидать страницу с прокруткой - достаточно просто ее остановить.
Идущие часы
Другой, часто встречающийся пример на странице со скриптами JavaScript - идущие часы (пример 4).
В этом примере реализовано сразу три приема использования JavaScript: часы, бегущая строка и предупреждение.
Часы реализованы в строках, которые следуют за комментарием "//Clock". В них также применяется функция setTimeout и объект DATE. Прежде чем отобразить время, программа получает текущее значение времени через объект DATE. Считается, что после выполнения программы все объекты будут удалены из памяти, что реально не всегда происходит. Для отображения времени используются методы, которые определены для объекта DATE. Значения часов минут и секунд объединяются в строку при помощи операции конкатенации "+", и результат отображается в поле формы.
О бегущей строке мы уже говорили достаточно подробно, поэтому теперь предлагаю обратить внимание на функцию alert в форме kuku. Это встроенная в JavaScript функция, которая предупреждает пользователя о том, что он запускает на сервере программу.
Минимизация-максимизация окна и его удаление
Выполнение вычислений и работа с таблицами весьма популярны, но не столь значимы, как управление окнами браузера. Рассмотрим пример такого управления. Идея состоит в том, чтобы средствами JavaScript реализовать "свертывание" и "развертывание" окна браузера. Примеры 5.1 и 5.2 демонстрируют связанные друг с другом HTML-страницы.
Пример 5.1 сворачивает окно. Для этой цели сначала создается маленькое окно с иконкой, а потом текущее окно удаляется. На самом деле в данном случае надежность работы этого скрипта будет зависеть от алгоритма интерпретации и назначения текущего окна программой интерпретации. В Netscape Navigator 2.0 текущим оставалось окно, в котором исполняется скрипт, поэтому наша программа будет работать правильно. Маленькое окно становится текущим только после удаления большого окна.
Максимизация окна показана на примере 5.2. Данный фрагмент по алгоритму точно совпадает с предыдущим, но выполняет прямопротивоположную функцию - разворачивает (восстанавливает) свернутое окно. При этом маленькое окно также удаляется. Собственно, первая страница - это файл iconize.htm, а вторая - test_icon.htm.
Использование окон для построения HELP
В заключение вернемся к первому примеру. В нем был описан вызов, который приводит к открытию окна контекстного help и загрузки в него HTML-страницы. На этой странице есть форма с кнопкой close, при нажатии на которую текущее окно закрывается. Так как в этом случае текущим является окно с help, то закрывается именно оно. Все это замечательно, если не используются фреймы в help. При применении фреймов текущим окном будет не главное окно, а окно фрейма. Если help состоит из нескольких фреймов, то простое выполнение функции window.close() не приведет к ожидаемому результату - закрытию всего окна. Корректнее всего будет загрузить в окно-предшественник (имя по умолчанию - _parent) пустую страницу, сделать ее текущей и после этого удалить. Вся страница, удаляющая окно _parent, состоит из контейнера SCRIPT (пример 6).
Вообще говоря, использовать такие страницы-терминаторы следует аккуратно. Ведь загрузка этой страницы может привести к завершению работы браузера, если других открытых страниц в данный момент нет.
Написание данных скриптов заставляет сожалеть о том, что в JavaScript нет наследования. Дело в том, что, даже если некоторое окно порождено из другого окна, функции, определенные в окне-родителе, в новое окно не передаются. Это означает, что автору придется их дублировать в каждом документе или прибегать к помощи включаемых файлов, что разрывает технологический процесс разработки страниц.
Единство в многообразии
Следует отметить, что JavaScript - это не единственный язык управления сценариями просмотра документов. Microsoft подготовила свою версию аналогичного языка - VBScript на основе Visual Basic. Кроме того, управлять сценарием просмотра можно и из Java-апплетов, что, конечно, сложнее, но зато более надежно и безопасно. При этом программист получает все преимущества наследования и прочие атрибуты объектно-ориентированного программирования. В конце концов, для создания фреймов и окон можно использовать атрибуты соответствующих контейнеров HTML, которые позволяют делить рабочую область экрана на фрагменты, перекрывать объекты и восстанавливать первоначальный вид страницы. Таким образом, к настоящему времени существует по меньшей мере три способа управления сценариями просмотра гипертекстовых баз данных Web, каждый из которых по-своему хорош. Какой из них выбрать - это дело автора Website.
Павел Храмцов - руководитель группы РНЦ "Курчатовский Институт". С ним можно связаться по электронной почте: paul@kiae.su
Пример 1.
Registration
ISTC. Project RADLEG(#245)
RRC "Kurchatov Institute"
Dec, 25, 1995
Registration Form
...... Текст страницы .....
Пример 2.
Проверка устного счета. Математический тест
Пример 3.1
Welcome to Demos Company - Moscow, Russia .....
Пример 3.2
Text Block Scrolling Text Block Scrolling.
Пример 4
type_Document_Title_here This is the start point:
This the document start point. kukuku
Пример 5.1
Iconize minimize page