Фреймы
Создание многооконного интерфейса
Использование HTML для определения полей заголовка сообщения протокола HTTP
Программирование сценариев просмотра. JavaScript
Идущие часы и бегущая строка
Массивы
Графика
Стеки гипертекстовых ссылок
Фреймы и окна
Наследование кода скриптов различными страницами
Java, JavaScript и модули расширения
Расширение возможностей создания таблиц
Заключение
Литература

Волна бурного развития технологий World Wide Web не обошла стороной и средства управления сценариями просмотра гипертекстовых баз данных. Сегодня авторы домашних страниц Web получили в свое распоряжение новые языки JavaScript и VBScript. Новые возможности по формированию баз данных Всемирной Паутины приобрел также уже зарекомендовавший себя язык HTML, что особенно видно в его версии 3.2 [1-8]. Темой данной статьи станет рассмотрение новых возможностей HTML и JavaScript, используемых для программирования сценариев просмотра страниц Web.

Как известно, язык гипертекстовой разметки HTML (HyperText Markup Language) был предложен Тимом Бернерсом-Ли в 1989 году в качестве одного из компонентов технологии разработки распределенной гипертекстовой системы World Wide Web. В основу гипертекстовой разметки была положена таговая модель описания документа, позволяющая представить документ в виде совокупности элементов, каждый из которых окружен тагами. По своему значению таги близки к понятию скобок "begin/end" в универсальных языках программирования и задают области действия имен локальных переменных, определяют область действия правил интерпретации текстовых элементов документа и т.п.

Общая схема построения элемента текста в формате HTML может быть записана в следующем виде:

"элемент":= <"имя элемента" "список атрибутов">
содержание элемента 

Конструкция перед содержанием элемента называется тагом начала элемента, а конструкция, расположенная после содержания элемента, - тагом конца элемента.

Структура гипертекстовой сети задается гипертекстовыми ссылками. Гипертекстовая ссылка - это адрес другого HTML документа или информационного ресурса Internet, который тематически, логически или каким-либо другим способом связан с документом, в котором эта ссылка определена.

Для записи гипертекстовых ссылок в системе WWW была разработана специальная форма - Universe Resource Locator. Типичным примером использования этой записи можно считать следующую запись:

Этот текст содержит 
 гипертекстовую ссылку .

Здесь элемент "A", который в HTML называют якорем (anchor), использует атрибут "HREF", обозначающий гипертекстовую ссылку для записи этой ссылки в форме URL. Данная ссылка указывает на документ с именем "index.html" в каталоге "altai" на сервере "polyn.net.kiae.su", доступ к которому осуществляется по протоколу "http".

Структура HTML-документа позволяет использовать вложенные друг в друга контейнеры. Собственно, сам документ - это один большой контейнер с именем "HTML":

 Содержание документа 

Сам элемент HTML или гипертекстовый документ состоит из заголовка документа (HEAD) и тела (BODY):


Содержание заголовка

Содержание тела документа

Приведенная форма записи определяет классический HTML-документ, например:

Пример 1.




 This is a 
        Baner


Администрирование Internet

Справочное руководство.

Каждый документ в WWW имеет свое имя, которое указывается в его заголовке. Его можно видеть в первой строке программы-интерфейса. Контейнер BODY открывает тело документа. В качестве фона в этом элементе определена картинка www_wall.jpg, которая в примере 1 задана частичной формой спецификации URL без указания полного адреса ресурса в сети. Далее в документе определена таблица, состоящая из двух ячеек: картинка и текстовый фрагмент. Текст определен как заголовок третьего уровня, который должен отображаться стилем Italic.

Фреймы

Компания Netscape Communication расширила классическую форму документа возможностью организации фреймов, а в Microsoft были разработаны фреймы без визуальных границ, имеющие или нет механизм прокрутки - так называемые, плавающие фреймы. Организация фрейма - это возможность разделить рабочее окно программы просмотра на несколько независимых панелей (или фреймов). В каждый фрейм может быть загружена своя страница HTML. Плавающие фреймы позволяют вставить одну Web-страницу в другую. Тогда как обычные фреймы позволяют лишь разделить область просмотра на несколько частей, плавающий фрейм можно поместить где угодно на странице, указав его размер и отступ справа или слева.

Для описания плавающих фреймов используется таг . В отличие от спецификации Netscape, не разрешающей пересечение фреймов, нотации Microsoft позволяет накладывать одни фреймы на другие с помощью отрицательного отступа.

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

В примере 2 представлен документ, состоящий из четырех окон внутри рабочего окна программы просмотра, в каждое из которых загружается обычный документ. Верхний и нижний фреймы имеют размер 100 пикселей, а оставшаяся область рабочего окна разбивается на две части: на левую отводится 30%, а на правую - 70% пространства. Если программа просмотра не поддерживает организацию фреймов: то отображается информация, заключенная между тагами ... , если же эта возможность реализована, то такая область на экране не отображается.

Пример 2.







<BODY>
Sorry, there is not a frame 
        support in your browser.
</BODY>








Создание многооконного интерфейса

С фреймами тесно связана возможность именования окон - любой фрейм может иметь свое собственное имя. Для того, чтобы документ загружался именно в то окно, которое определил автор страницы, в контейнер гипертекстовой ссылки вводится атрибут TARGET. При организации фреймов (пример 2) каждому из них было присвоено имя (атрибут NAME контейнера FRAME). Для загрузки документа в конкретный фрейм (left), автор должен использовать гипертекстовую ссылку вида:

В данном случае документ, указанный в атрибуте HREF, будет загружен во фрейм left.

Если в программе просмотра нет окна с именем left, то будет открыто новое окно с таким именем и в него будет загружен требуемый документ. Приведем пример открытия дополнительного окна (пример 3).

Пример 3.





How to create a multi-window interface

In the document "frame.html" there is no frame named "left".
That"s why the program will open a new window

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

Если теперь пользователь выберет гипертекстовую ссылку из окна notleft, то файл new.html будет загружен в окно фрейма right (примеры 4, 5).

Пример 4.












Пример 5.





  This is an 
        example of loading into 
        the right window  
You can do it using the TARGET element

В качестве реального примера можно привести открытие окна подсказки в базе данных проекта Radleg. http://www.polegn.kial.su/redleeg.

Окно подсказки появляется после выбора гипертекстовой ссылки "Help". При этом в данное окно загружается страница с фреймами, где среднее окно - это контекстный Help, верхнее - стандартная заставка базы данных, а нижнее окно - переход к "домашней" странице Radleg и закрытие окна подсказки.

Использование HTML для определения полей заголовка сообщения протокола HTTP

Важным свойством современных версий HTML является возможность записи полей заголовка сообщения протокола HTTP. Реализуется эта возможность через контейнер заголовка HTML - документа . Используя атрибут HTTP-EQUIV, в заголовок HTTP - сообщения можно включить любое поле, которое определено стандартом протокола HTTP (текущая версия 1.0). Рассмотрим в качестве примера организацию рекламных роликов. Идея состоит в том, чтобы использовать время обновления HTML страниц для их автоматической подмены при просмотре. Время жизни определяется полем Refresh заголовка сообщения HTTP:

Refresh = время; URL = документ 

Используя контейнер META с атрибутом HTTP-EQUIV, автор HTML - документа может определить следующий документ или кадр рекламного ролика:

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

В примере 6 описан документ, который после своей загрузки будет немедленно заменен документом ref2.html. В реальной практике такая немедленная замена происходит не мгновенно и зависит от скорости коммуникаций и особенностей ПО и ОС.

Пример 6.



 type_Document_ Title_ 
        here 



Document 1

Программирование сценариев просмотра. JavaScript

С задачей управления отображением во фреймы и окна тесно связано написание сценариев просмотра домашних страниц Web. Такие сценарии чаще всего пишутся на языке Java Script.

Java Script - это язык управления сценарием отображения документа. Все операции, которые можно исполнять в программе на JavaScript, описывают действия над хорошо известными и понятными объектам - элементами рабочей области программы Netscape Navigator и контейнерами языка HTML. В Java Script не реализованы классы объектов, наследование, инкапсуляция и полиморфизм. Имеются объекты с набором свойств и набор функций над объектами, которые называются методами. Функция пользователя выполняется по наступлении некоторого события: onChange, onClick, onLoad и др., а внутренние функции языка используются непосредственно.

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

Идущие часы и бегущая строка

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

Пример 7.



JavaScript



JavaScript


.

Для создания скрипта в заголовок документа (контейнер HEAD) включен контейнер SCRIPT. До недавнего времени атрибут LANGUAGE в этом контейнере не являлся обязательным. Но с момента появления VBSCRIPT смысл в указании типа языка появился - Navigator не понимает скриптов на других языках. Отсутствие атрибута может привести к ошибкам при отображении гипертекстовых страниц. Далее в тексте страницы определен комментарий, в который включен текст скрипта. Начинается комментарий строкой:



И кончается строкой:

// This is the end of code definition->

Функция, реализующая бегущую строку, использует метод open - встроенную в JavaScript функцию, которая определена над объектом window. В результате открывается новое окно Netscape Navigator и в него загружается документ. Вызов функции осуществляется после нажатия на соответствующую кнопку. Таким образом, функция будет выполнена только в том случае если произойдет событие, описанное атрибутом onClick в контейнере INPUT.

Изначально предполагалось, что программа просмотра, которая поддерживает JavaScript будет исполняться в среде многопотоковых операционных систем. В этом случае к моменту порождения нового потока старый уже завершится и setTimeout будет порождать последовательно исполняемые потоки. Однако, из-за неаккуратной реализации JavaScript, команда setTimeout стала просто "пожирать" ресурсы компьютера. Системы Windows 3.x вообще не являются многопоточными и в них просто происходит переполнение стека при выполнении данного скрипта, а как быстро "упадет" система зависит от объема исполняемой по setTimeout функции. Самое лучше, что можно посоветовать, если вдруг на экране появляется прокрутка - поскорее покинуть такую страницу. Справедливости ради следует отметить, что прокрутку можно организовать и другими способами, поэтому ее появление не обязательно должно вызывать крах системы или крах программы просмотра.

JavaScript - это не единственный язык управления сценариями просмотра документов. Имеется другая версия аналогичного языка - VBScript на основе Visual Basic. Кроме того, управлять сценарием просмотра можно и из Java-апплетов, что, конечно, сложнее, но зато более надежно и безопасно. При этом программист получает возможность наследования и прочие атрибуты объектно-ориентированного программирования. В конце концов, для создания фреймов и окон можно использовать атрибуты соответствующих контейнеров HTML, которые позволяют делить рабочую область экрана на фрагменты, перекрывать объекты и восстанавливать первоначальный вид страницы. В Navigator 3.0 появились новые типы объектов и функции над ними.

Массивы

Первый тип новых объектов, которые появились в JavaScript 1.1 - это массивы. Тип "Array" введен в JavaScript 1.1 для возможности манипулирования самыми разными объектами, отображаемыми навигатором. Это - список всех гипертекстовых ссылок данной страницы, список всех картинок на данной странице, список всех апплетов данной страницы, список всех элементов формы и т.п. Пользователь может создать и свой собственный массив, используя конструктор Array(). Делается это следующим образом:

new_array = new Array()
new_array5 = new Array(5)
colors = new Array 
("red", "white", "blue")

Размерность массива может динамически изменяться, требуется лишь сначала определить массив, а потом присвоить одному из его элементов значение. Как только это значение будет присвоено, изменится и размерность массива:

colors = new Array()
colors[5] = "red"

В данном случае массив будет состоять из 6 элементов, первым элементом считается элемент с индексом 0.

Для массивов определены три метода: join, reverse, sort. Join объединяет элементы массива в строку символов, в качестве аргумента в этом методе задается разделитель:

colors = new Array 
("red", "white", "blue")
string = acolors.join("+")

В результате выполнения операции присваивания значения строке символов string получим следующую строку:

string = "red"+"white"+"blue"

Метод reverse изменяет порядок элементов массива на обратный, а метод sort отсортировывает их в порядке возрастания.

У массивов есть два свойства: length и prototype. Length определяет число элементов массива. Если нужно выполнить некоторую рутинную операцию над всеми элементами массива, то можно воспользоваться циклом типа:

color = new Array
("red", "white", "blue")
n = 0
while(n != colors.length)
{... операторы тела цикла 
...}

Свойство prototype позволяет добавить свойства к объектам массива. Однако наиболее часто в программах на JavaScript используются встроенные массивы, главным образом графические образы (Images) и гипертекстовые ссылки(Links).

Графика

До появления версии Navigator 3.0 в JavaScript использовались только встроенные объекты типа Image. В новой версии языка появился конструктор для этого типа объектов:

new_image = new Image()
new_image = new Image (width,height)

Часто для реализации мультипликации создают массив графических объектов, которые потом прокручивают один за другим:

img_array = new Array()
img_array[0] = new Image(50,100)
img_array[1] = new Image(50,100)
....
img_array[99] = new Image(50,100)

У объекта Image существует 10 свойств, из которых самым важным является src. Для присваивания конкретных картинок элементам массива img_array следует воспользоваться следующей последовательностью команд:

img_array[0].src = "image1.gif"
img_array[1].src = "image2.gif"
...
img_array[99].src = "image100.gif"

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

В новой версии языка объект типа Image можно поименовать в HTML таге IMG, а затем обращаться к нему по имени. При этом следует учитывать, что если Image используется внутри формы, то он является свойством этой формы. Это значит, что для следующего графического объекта должны применяться разные составные имена:

 <-
document.car.src = "car1.gif"


document.kuku.car.src = "car1.gif"

Однако наиболее часто в примерах использования скриптов можно встретить обращение к Image по индексу в массиве всех графических объектов данной страницы. Если наш объект, например, является вторым Image на странице, то будь он внутри формы или за ее пределами к нему всегда можно обратиться по индексу:

document.images[1].src = "car1.gif"

Расширяя пример с массивом Image, создадим документ, в который будет встроена мультипликация, определенная нашим массивом:

Пример 8.








Довольно часто используют не мультипликацию, а выбор картинки через OPTION - еще один новый объект JavaScript. При этом можно через поле формы SELECT менять не только саму картинку, но и гипертекстовую ссылку, которая может быть связана с этой картинкой. На гипертекстовую ссылку также можно ссылаться по индексу:

document.links[index].href = kuku.html

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

Другой способ для сокращения числа нажатий на клавиши - аппарат событий. В том же объекте OPTION можно использовать событие onChange, что делает необязательным нажатие кнопок типа submit. В этом случае достаточно будет просто выбрать альтернативу и перейти к новой странице сразу после выбора.

Стеки гипертекстовых ссылок

В язык теперь введен новый тип объектов Area - это элемент контейнера MAP, который определяет client-site imagemap. Собственно, главное достоинство такого объекта состоит в том, что гипертекстовые ссылки, определенные в AREA стали доступны для переопределения. Они появляются в массиве обычных ссылок страницы и можно как получить значение URL, так и переопределить его. К объекту AREA нельзя обратиться по имени, а можно использовать только индекс массива гипертекстовых ссылок документа.

В контексте стека гипертекстовых ссылок интересно рассмотреть еще одну возможность JavaScript, связанную с переходом по гипертекстовой ссылке вообще. В обычном случае параметр HREF контейнера A должен иметь какое-нибудь значение. Если, например, по событию onClick необходимо открыть новое окно и в старом сохранить отображенный документ, то его URL следует указывать в качестве значения HREF. В противном случае, в старое окно будет загружена пустая страница, если HREF = " ".

В новой версии JavaScript введена функция void, точнее, тип void, который означает отсутствие какого либо значения. Если необходимо выполнить некоторые действия при выборе гипертекстовой ссылки, но при этом не перегружать текущие страницы, то в параметре HREF можно указать конструкцию:

kuku

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

Фреймы и окна

При работе с фреймами и окнами в предыдущих версиях JavaScript постоянно приходилось отслеживать последовательность открытия окон и фреймов для того, чтобы аккуратно их потом закрывать. На некоторых неточностях работы с окнами были основаны так называемые mail-bombs. Суть этих "подарков" заключалась в том, что если пользователь по почте принимает документ, состоящий только из одной команды:

window.close(),

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

Работа с окнами и фреймами на этом не исчерпывается. В систему введено новое свойство opener, которое определено для текущего окна или фрейма, а методы blur и focus распространены на работу с окнами. Свойство opener определяет окно документа, вызвавшего открытие окна текущего документа. Свойство определено для любого окна и фрейма. Если необходимо выполнить некоторые функции по отношению к окну, открывшему данное окно, то можно использовать выражение типа:

window.opener.[method]

Например, если требуется закрыть окно - предшественник, то можно просто выполнить close:

window.opener.close()

Точно таким же способом можно изменить содержание этого окна при помощи методов write или writeln.

Можно менять и другие свойства объектов в окне - предшественнике. Следующий пример взят из дополнений к спецификации JavaScript:

window.opener.document.bgColor = CcyanT

В данном случае для окна - предшественника определен светло-голубой цвет в качестве цвета фона.

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

window.opener = new_window
window.opener = null

Первый пример переназначает окно-предшественник, в то время как второй вообще защищает предшественника от каких-либо действий.

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

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

Наследование кода скриптов различными страницами

У контейнера SCRIPT появился атрибут SRC. Это дает возможность авторам страниц строить своеобразную библиотеку функций, к которым можно обращаться из любой страницы, имеющей ссылку на такую библиотеку. При этом вовсе не обязательно размещать саму библиотеку на том же сервере, где размещены и гипертекстовые страницы Web. Можно использовать и чужие функции на языке JavaScript.

В атрибуте SRC применяется обычный URL. Внутри файла скриптов не используются таги SCRIPT - это обычный файл с определениями функций и переменных.

Другой возможностью работы с функциями стало введение нового объекта Function, порождаемого конструктором Function:

new_Function = new Function 
(arg1, arg2, .., argn, function_body)

Главное отличие от обычного декларирования функции заключается в том, что в данном случае порождена переменная new_Function, с которой можно работать, как с любым другим объектом. При обычном определении функции такой переменной не порождается.

Как любой объект, Function имеет свои свойства, но не имеет методов. В качестве свойств функции выступают аргументы и возможность назначения новых свойств через prototype.

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

Java, JavaScript и модули расширения

В новой версии языка HTML есть возможность организовать взаимодействие между Java апплетами и JavaScript-скриптами. Достигается это за счет использования атрибута MAYSCRIPT в контейнере APPLET. Собственно, в JavaScript определен объект типа APPLET, к которому можно обращаться либо по имени, либо по индексу в массиве апплетов. У этого объекта имеется только одно свойство - имя. Какие-либо другие свойства или методы для данного типа объектов не определены.

Кроме апплетов JavaScript позволяет работать и с Plug-ins, представляющие собой массив соответствующего типа, для которого определен ряд свойств. Используя эти свойства, можно определить установленные plig-ins и их соответствия MIME-типам. Назначить plug-ins или манипулировать ими нельзя.

Расширение возможностей использования графических объектов

К расширению возможностей следует отнести:

  • обтекание графики текстом;
  • функция client-site imagemap.
  • Обтекание достигается за счет использования атрибута ALIGN элемента IMG. ALIGN может принимать значения: TOP, MIDDLE, BOTTOM, LEFT, RIGHT. Поскольку рисунок, встраиваемый по IMG, рассматривается программами просмотра как один большой символ, атрибут ALIGN определяет, где относительно других символов текста в строке будет располагаться этот рисунок. Если задано значение TOP, то картинка отображается как подстрочная - остальные символы строки выравниваются по верхнему краю рисунка, при значении MIDDLE картинка располагается как обычный символ и текст форматируется по центру. Если задано значение BOTTOM, рисунок отображается как надстрочная буква, текст выравнивается по его нижнему краю. Значения LEFT и RIGHT этого атрибута используются для размещения картинки в левой или правой части страницы, что приводит к обтеканию картинки текстом справа или слева соответственно.

    Client-site imagemap - это способ избавиться от многообразия реализаций стека графических гипертекстовых ссылок, которые применяются различными HTTP - серверами. Способ организации client-site imagemap состоит из двух частей: определения image как client-site imagemap и определения фрагментов image как гипертекстовых ссылок. Приведем пример:

    Пример 9.

    
    
    
    Graphics
    
    
    

    Язык ги- пертекстовой разметки HTML


    Графика в HTML


    Обои IMG GIF89a client-site maps

    Стеки графических ссылок



    Обычный IMG

    Обычно графика вставлялась в текст документа как символ.

    Поэтому приходилось вставлять ее между строк текста

    В HTML 2.0 Netscape Extensions появилась возможность обтекания графики текстом при применении атрибута align:


    Пример перехода по графической ссылке.

    В примере 9 графический образ, определенный в контейнере , является объектом, который разбит на прямоугольники. С каждым прямоугольником связана гипертекстовая ссылка. Эти ссылки определены в контейнере ... , а связь между контейнерами IMG и MAP осуществляется через контейнер MAP.

    Расширение возможностей создания таблиц

    Для организации таблиц используется элемент TABLE, который является контейнером для других элементов описания таблицы. Атрибут BORDER определяет разделяющие линии между графами таблицы, обычно они бывают трехмерные или простые. Сама форма этих линий задается в файле конфигурации программы просмотра.

    Элементы TH (Table Header) и TD (Table Data) используются в примере 10 не только для описания граф таблицы, но и для объединения граф при помощи атрибутов ROWSPAN -пропуск строки и COLSPAN - пропуск столбца. Цифра в этих атрибутах определяет количество последовательно расположенных граф таблицы, объединенных в одну.

    Пример 10.

    
    
    Versions
    
    
    

    Версии HTML


    HTML 1.0
    HTML 2.0
    HTML+Netscape Extensions Microsoft Extensions
    HTML 3.0
    (Project)
    Arena
    Navigator 2.0 Explorer
    ????? HTML3.0 ?????

    Заключение

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


    Литература

    [1] Chuck Musciano and Bill Kennedy, "HTML: The Definitive Guide", O"Reily&Associates, Inc (1996).

    [2] html.doc, "Время Microsoft", журнал Аурамедиа, спецвыпуск. "Решения Microsoft", выпуск 5 (1996).

    [3] Michael J. Hannah, "HTML Reference Manual" (1996), http://www.sandia.gov/ sci_compute/ html_ref.html

    [4] HTML 3.2. Features at a Glance, http://www.w3.org/pub/WWW/MarkUp/Wilbur/features.html

    [5] Netscape extensions to HTML 3.0, http://home.netscape.com/assist/net_sites/html_extensions_3.html

    [6] HTML 2.0 Standart, http://www.w3.org /pub /WWW/MarkUp/html-spec

    [7] Using JavaScript in HTML, http://home.netscape.com/eng/mozilla/2.0/handbook/javascript/index.html

    [8] Stefan Koch, "Introduction to JavaScript" (1996), http://www.webcom.com/java/java-script/intro/index.htm

    Поделитесь материалом с коллегами и друзьями