JavaScript - язык программирования

Оглавление

 

Введение

 

1 Глава. Описание языка.

2 Глава. Включение JavaScript в HTML-документы

3 Глава. Использование объектов Navigatorа

 

Введение

При создании документов для WWW-серверов можно воспользоваться различными средствами. Самое распространенное из них - это язык HTML, но возможности этого языка ограничены созданием документов, содержащих статические тексты, таблицы и изображения. Для разработки WEB-страниц, на которых ведется диалог с клиентом, выполняется анимация изображений, реализуется контекстно-зависимый текстовый и графический ввод-вывод, используются другие средства, расширяющие возможности HTML. Среди них - CGI (Common Gateway Interface), Java и JavaScript.

CGI предполагает использование традиционных языков программирования: компилируемых (таких как C, C++, Fortran), и интерпретируемых (как, например Perl). При запросе клиента на услуги CGI-программы сервер выступает в роли посредника между ними. Ответ от CGI-программы должен быть в форме HTML-документа, GIF-файла, видеоклипа и данных любого типа, поддерживаемого браузером клиента. Естественно, что CGI-программы ориентированы на конкретные НТТР-серверы, работающие под управлением конкретных операционных систем, из этого следует вывод, что CGI-программы являются зависимыми от платформы.

JAVA - язык программирования высокого уровня, ориентированный на создание сетевых приложений. Разработанные с его помощью приложения являются независимыми от типа используемой ЭВМ и ОС, поскольку результаты компиляции программ представляются в кодах виртуальной JAVA-машины, так называемых “байт-кодах. В WEB-технологии язык JAVA используется для создания аплетов - приложений, байт-коды которых передаются по сети клиенту и немедленно исполняются его браузером. Создание таких приложений является трудоемкой и требует достаточно высокой квалификации разработчиков.

JavaScript - язык программирования, который проистекает из JAVA, но существенно проще его. Использование JavaScript дает возможность автору HTML-документа, не являющемуся профессиональным программистом, создавать динамические страницы и обрабатывать заполненные клиентом формы. JavaScript - компактный, объектно-ориентированный язык для разработки клиентских и серверных сетевых приложений. Браузеры, такие, например, как Netscape Navigator, интерпретируют JavaScript-операторы, вложенные в HTML страницу. Имеются два типа JavaScript: Navigator JavaScript, также называемый клиентским JavaScript и LiveWire JavaScript, называемый серверным JavaScript. LiveWire JavaScript позволяет создавать серверные приложения, подобные CGI-программам.

JavaScript в Navigator’е. Netscape Navigator 2.0 ( и более поздние версии ) может интерпретировать JavaScript операторы, вложенные в HTML страницу. Когда Navigator запрашивает такую страницу, сервер посылает полное содержание документа, включая HTML и JavaScript операторы, по сети клиенту. Навигатор обрабатывает HTML-теги и выполняет JavaScript- операторы, выводя результаты на экран. Этот процесс иллюстрируется следующим рисунком.

Could not find Image

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

JavaScript в LiveWire. LiveWire - инструментальная среда разработки, в которой используется JavaScript для создания серверных приложений, подобных CGI (Commonn Interface Gateway ) программам. В отличие от Navigator JavaScript, LiveWire JavaScript операторы компилируются в выполняемые байт-коды. Процесс работы таких приложений иллюстрируется следующим рисунком:

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

Как видно из ранее сказанного, клиент и сервер JavaScript значительно отличаются, но они имеют и общие элементы:

    • синтаксис предложений и правила грамматики для выражений,
    • переменные и литералы,
    • встроенные объекты и функции

То есть, если у вас сеть LiveWire, то вы можете писать функции, которые работают или на клиенте, или на сервере.

Различные версии JavaScript работают с определенными версиями Navigator. Например, JavaScript 1.1 - с Navigator 3.0.

Языки JavaScript и Java. JavaScript и Java в чем-то очень похожи, а в чем-то существенно различаются, например JavaScript не имеет статических типов Java и строгой проверки типов. JavaScript поддерживает синтаксис выражений Java. JavaScript является интерпретатором, в то время как Java - компилятором, JavaScript поддерживает малое число типов данных: числовой, Boolean, и строковый. JavaScript также поддерживает функции без предварительных деклараций. Java - объектно-ориентированный язык программирования, похожий на язык С++ и программирование на нем значительно сложнее, чем на JavaScript. Существует как бы в двух вариантах. В первом варианте это универсальный язык программирования, основным достоинством которого является независимость от платформы. Во втором варианте это язык написания аплетов для WEB-серверов. Более корректно сравнивать JavaScript со вторым вариантом языка Java. Наиболее существенные отличия заключаются в следующем: JavaScript - является интерпретируемым; используются встроенные, расширяемые объекты, но никаких классов или наследований; вложен в HTML; типы данных не обьявляются; выполняется динамическое связывание, ссылки проверяются во время выполнения, Java - компилируемый в байт-коды, исполняющиеся на клиенте; аплеты состоят из классов объектов с наследованием; аплеты не связаны с HTML; типы данных должны быть объявлены; статические ссылки, проверяемые во время компиляции. В то же время нельзя сказать, что Java и JavaScript просто алгоритмические языки, в чем-то похожие друг на друга, программы, напиманные на этих языках могут быть связаны доcтаточно тесно. В рамках HTML-страниц существует возможность взаимного влияния аплетов и JavaScript-программ.

 

1. Глава. Описание языка.

 

1.1 Типы данных, переменные и литералы.

Типы данных. JavaScript распознает следующие типы:

    • Numbers, такие как 17 или 3.1415928
    • Logical (Boolean) , true или false
    • Strings, такие как "Hello !"
    • null, специальное ключевое слово для обозначения пустого значения.

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

1.1.1 Преобразование типов данных.

В JavaScript необязательно определять тип данных данных и они преобразуются автоматически в процессе выполнения программы. Так, например, можно определить переменную var str15 = 42, а позже можно присвоить этой же переменной строковое значение str15 = "This is new value..." и это не вызовет ошибки. В выражениях, где используются одновременно числовые и строковые значения, JavaScript преобразует числовое значение к строковому. Например, в следующих операторах

x = "This is new value - " + 42

y = 42 + " - is new value"

первый возвратит строку " This is new value - 42", второй - "42 -is new value".

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

    • - eval - пытается конвертировать строковое значение к типу number;
    • - parseInt - преобразует строковое значение в целое, если это возможно;
    • - parseFloat - преобразует строковое значение в число с плавающей запятой, если это возможно.

1.1.2 Переменные.

Имена переменных в JavaScript должны начинаться с буквы или подчеркивания("_"), последующие символы могут быть также и цифрами (0-9). Следует учитывать, что JavaScript чувствителен к регистру. Некоторые примеры правильных имен - Number_hits, temp99, и _name.

Переменные можно объявить двумя способами: просто назначая это значение, например, x = 42 или же с ключевым словом var, например, var x = 19.

Различают глобальные и локальные переменные. Если переменная объявлена вне функции, то это глобальная переменная и ее можно использовать везде в текущем документе. Локальная переменная доступна только в пределах функции. Использование var необязательно, но нужно использовать это ключевое слово, если желаете иметь локальную переменную с таким же именем как у глобальной. Имеется доступ к глобальным переменным одного окна или фрейма в другом окне или фрейме через их имя. Например, если переменная phoneNumber обьявлена в родительском фрейме, можно обратиться к этой переменной из дочернего фрейма как parent.phoneNumber.

1.1.3 Литералы.

Литералы - это константы различных типов.

Целые. Целые могут выражаться десятичным числом (основание системы счисления-10), шестнадцатеричным (16), и восьмеричным (8). Различаются он следующим образом: десятичное обязательно начинается не с нуля, предшествующий нуль означает, что это восьмеричное число, а предшествующие 0x ( или 0X ) означают шестнадцатеричное. Шестнадцатеричное целое может включать цифры (0-9) и символы a-f и A-F. Восьмеричное целое только цифры 0-7. Некоторые примеры целых литералов: 17, 0xFFF, и -345.

Литералы с плавающей точкой. Они могут иметь следующие части: десятичное целое число, десятичная точка("."), дробная часть (десятичное целое), признак порядка ("e" или "E") и порядок (десятичное целое со знаком). Некоторые примеры литералов с плавающей точкой - 3.1415, -3.1E1, .107e2, и 2E-10.

Литералы Boolean. Тип Boolean имеет два значение: true и false.

Строковые литералы. Это ноль или больше символов, заключенных в двойные ( " ) или одинарные кавычки ('). Примеры строковых литералов: "row" , 'row' , "4321" , "one line \n another line" В дополнение к обычным символам, можно также включить специальные символы, как это показано в последнем элементе. В следующую таблицу внесены специальные символы, которые можно использовать в JavaScript.

 

Символ Значение
\b забой
\f перевод страницы
\n новая строка
\r возврат каретки
\t табуляция
\\ двойной обратный слеш

Для того чтобы использовать обратный слеш внутри строки необходимо использовать двойной обратный слеш. Например, чтобы определить путь к файлу (c:\temp) как строку следует указать var home = "c:\\temp"

 

1.2 Выражения и простые операторы.

Выражение - любой, имеющий значение набор литералов, переменных, операторов, и выражений, который приводит к единственному значению. Значение может быть числом, строкой или Boolean. Специальное ключевое слово null обозначает пустое значение. Следует различать null и переменные, которым не были присвоены значения, последние не определены и будут вызывать ошибку во время выполнения, если используются как числовые переменные. Однако элементы массива, которым не было присвоено значение оцениваются как false. В следующем примере исполняется оператор str="Hello !", потому что элемент массива не определен: myArray=new Array() if (!myArray["notThere"]) str="Hello !"

1.2.1 Условные выражения.

Условное выражение может иметь одно из двух значений, в зависимости от условия.

Его синтаксис таков: (condition)? value1: value2

Если условие (condition) истинно, выражение имеет значение value1, иначе - value2. Можно использовать условное выражение везде, где допустимо стандартное выражение. Например, status = (age >= 50) ? "old" : "young"

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

Оператор присваивания (=) присваивает значение правого операнда левому. То есть x =y присваивает x значение y. Существует сокращенная форма оператора присваивания, общий вид которой:

<переменная> <знак операции> = <выражение>

при этом подразумевается выполнение следующего оператора присваивания: <переменная>=<переменная><знак операции><выражение>

Знаком операции могут быть: +(сложение), -(вычитание), *(умножение), /(деление), %(деление по модулю), <<(сдвиг влево), >>(сдвиг вправо), >>>(сдвиг вправо с заполнением нулями), &(побитовое И), ^(побитовое исключающее ИЛИ), |(побитовое ИЛИ).

1.2.3 Операторы cравнения.

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

оператор описание оператора пример
равно(==) возвращает true, если операнды равны x == y
не равно(!=) озвращает true, если операнды не равны x != y
больше(>) возвращает true, если левый операнд больше x > y
больше или равно(>=) возвращает true, если левый операнд больше или равен правому x >= y
меньше (<) возвращает true, левый операнд меньше x < y
меньше или равно (<=) возвращает true, левый операнд меньше или равен правому x <= y

 

1.2.4 Арифметические операторы.

Стандартные арифметические операторы - сложение(+), вычитание(-), умножение (*) и деление (/). Эти операторы работают также, как и в других языках программирования.

Деление по модулю (%). Оператор деления по модулю используется следующим образом:var1 % var2, возвращается остаток от деления var1 на var2. Например, 12%5 возвращает 2.

Приращение(++)(инкремент). Оператор приращения используется следующим образом: var++ или ++var. Этот оператор увеличивает (добавляет единицу) операнд и возвращает значение. Если используется постфиксная форма, то сначала возвращается значение, затем происходит увеличение. При использовании префиксной формы сначала происходит увеличение, затем возращение значения. Например, если x=3, тогда выражение y=x++ приведет к тому, что у=3 и х=4, а выражение у=++х к тому, что х=4 и у=4.

Уменьшение(--)(декремент). Оператор уменьшения используется следующим образом: var -- или --var. Этот оператор уменьшает (вычитает единицу) операнд и возвращает значение. Если используется постфиксная форма, то сначала возвращается значение, затем происходит уменьшение. При использовании префиксной формы сначала происходит уменьшение, затем возращение значения. Например, если x=3, тогда выражение y=x-- приведет к тому, что у=3 и х=2, а выражение у=--х к тому, что х=2 и у=2. Одноместное отрицание (-). Одноместное отрицание предшествует операнду и инвертирует его. Например, x =-x инвертирует значение x; то есть если x было равно 3, станет -3.

1.2.5 Битовые операторы.

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

Оператор использование описание
AND a&b возвращает 1 в каждый бит результата, если оба соответствующих бита операндов равны 1
OR а|b возвращает 1 в каждый бит результата, если хотя бы один из соответствующих битов операндов равен 1
XOR a^b возвращает 1 в битовую позицию, если биты операндов различны
NOT ~a инвертирует биты операнда
Сдвиг влево a<<b операнд а сдвигается влево на b позиций, справа а заполняется нулями (соответствует умножению на 2)
Сдвиг вправо a>>b операнд а сдвигается вправо на b позиций, освобождающиеся разряды заполняются знаковым значением
беззнаковый сдвиг вправо a>>>b операнд а сдвигается вправо на b позиций, освобождающиеся разряды заполняются нулями

 

1.2.6 Логические операторы.

Логические операторы должны иметь логические операнды и возвращают логический результат.

 

Оператор использование описание
AND a&&b возвращает true, если a=true и b=true
OR a||b возвращает false, если a=false и b=false
NOT !a возвращает true, если a=false и наоборот

 

1.2.7 Строковые операторы.

В дополнение к операторам сравнения, которые могут использоваться для сравнения строк, имеется оператор конкатенации, который используется для слияния строк. Например, "two " + "words" возвращает значение "two words". Оператор присваивания += может также использоваться при конкатенации, например, если переменная mystring имеет значение "alpha" и вычисляется выражение mystring+="bet", то возвращается результат равный "alphabet", который присваивается переменной mystring.

1.2.8 Специальные операторы.

new.

Можно использовать оператор new, для того чтобы создать объект, встроенный или определенный пользователем, встроенные объекты могут иметь тип Array, Boolean, Date, Function, Math, Number, или String.

Синтаксис этого оператора следующий:

name = new typ( param1 [,param2] ...[,paramN] )

где name - имя вновь созданного объекта, typ - его тип и param - параметры.

typeof.

Оператор typeof может быть записан следующим образом:

    1. typeof операнд
    2. typeof (операнд)

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

    • var myFun = new Function("5+2")
    • var typ="round"
    • var count=1
    • var today=new Date()

Оператор typeof возвратит следующие результаты для них.

    • typeof myFun is object
    • typeof typ is string
    • typeof count is number
    • typeof today is object typeof dontExist is undefined

Для ключевых слов true и null, оператор typeof возвратит результаты:

    • typeof true is boolean
    • typeof null is object

Для числа или строки результат будет выглядеть следующим образом:

    • typeof 745 is number
    • typeof 'Hello !' is string

Свойства объектов (см. далее) оцениваются следующим образом:

    • typeof document.lastModified is string
    • typeof window.length is number
    • typeof Math.LN2 is number

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

    • typeof blur is function
    • typeof eval is function
    • typeof parseInt is function
    • typeof shape.split is function

Для объектов возвращается результат:

typeof Date is function

typeof Function is function

typeof Math is function

typeof Option is function

void.

Синтаксис оператора:

    1. javascript:void (expression)
    2. javascript:void expression

Оператор void определяет выражение, которое не возвращает никакого значения. Круглые скобки необязательны, но их использование является хорошим стилем. Можно использовать оператор void, чтобы определить гипертекстовую ссылку, по которой будет что-нибудь выполнено, но перехода по ссылке не последует. Следующий оператор создает ссылку, которая ничего не делает, когда пользователь активизирует ее. <A HREF="javascript:void(0)">Click here to do nothing</A>

1.2.9 Приоритеты операторов.

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

()              []              .
++              --              ~               !
/               %
+               -
>>              <<              >>>
>               >=              <               <=
==              !=
&
^
|
&&
||
?:
=

1.3 Управляющие операторы JavaScript.

Операторы подразделяются на следующие категории:

- условный оператор: if...else

- операторы цикла: for, while, break, and continue

- оператор манипулирования объектами: for...in, new,this, and with

- комментарии:(//) и(/*...*/)

 

1.3.1 Условный оператор.

Синтаксис: if (condition) { statements1 [ } else { statements2 ] }

Если условие condition истинно, выполняется оператор statements1, иначе statements2. Условие может быть любым JavaScript-выражением, которое можно оценить как истинное или ложное. Операторы, которые нужно выполнить, могут быть любыми JavaScript-операторами, включая условные. Более чем один оператор должен быть заключен в фигурные скобки, { }. В следующем примере функция checkData возвращает true, если число символов в объекте Тext равно трем, в противном случае выводит аварийный бокс и возвращает false.

function checkData () {
          if (document.form1.threeChar.value.length == 3) {
                    return true
          } else {
                    alert("Enter exactly three characters. " +  
          document.form1.threeChar.value + " is not valid.")
          return false
          }
}

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

Цикл - набор команд, который выполняется неоднократно до выполнения указанного условия.

JavaScript поддерживает два вида оператора цикла - for и while.

Внутри операторов могут быть использованы break и continue. Оператор for ... in также является оператором цикла, но используется для манипулирования объектом (см. ниже)

Оператор for.

Цикл повторяется до тех пор, пока специфицированное условие не станет false.

Синтаксис: for ( [начальное выражение]; [условие]; [выражение приращения] ) {операторы}

При выполнении цикла происходит следующее:

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

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

 
var numberSelected=0
          for (var i=0; i < selectObject.options.length; i++) {
                    if (selectObject.options[i].selected==true)
                              numberSelected++
          }

Оператор while.

Цикл повторяется до тех пор, пока условие истинно (true).

Синтаксис: while (условие) {операторы}

Если условие становится ложным (false), цикл прекращается и управление передается операторам после цикла. Условие проверяется не непрерывно, а первоначально и после выполнения всех операторов цикла.

Пример 1. Следующий цикл выполняется, пока n - меньше 3:

n = 0
x = 0
while( n < 3 ) {
          n ++
          x += n
}

С каждой итерацией, n увеличивается на 1 и добавляется к x. Поэтому, x и n принимают следующие значения:

    • После первого прохода: n = 1 и x = 1
    • После второго прохода: n = 2 и x = 3
    • После третьего прохода: n = 3 и x = 6

После завершения третьего прохода, условие n < 3 не выполняется, поэтому цикл заканчивается.

Пример 2: Бесконечный цикл. Необходимо удостовериться, что условие в цикле в конечном счете становиться ложным; иначе, цикл никогда не будет закончен, как это происходит в данном примере.

while (true) {alert("Hello, world")}

Оператор break.

Этот оператор прерывает цикл for или while и передает управление оператору, следующему за оператором цикла. Пример. В следующем фрагменте программы оператор break прерывает цикл, когда i=3 , и передает управление опера- тору z=i*x.

var i = 0
          while (i < 6) {
                    if (i == 3)
                              break
                    i++
          }
  z= i*x

Оператор continue.

Этот оператор прерывает выполнение операторов внутри цикла (while или for) и продолжает выполнение цикла с новой итерации. В противоположность оператору break выполнение цикла не заканчивается, вместо этого :

- в цикле while происходит переход к проверке условия;

- в цикле for происходит переход к выражению приращения.

В следующем примере приведен оператор while с continue, который выполняется, когда значение i равно 3. Таким образом n принимает значения 1, 3, 7 и 12.

i = 0
n = 0
while (i < 5) {
          i++
          if (i == 3)
                    continue
          n += i
}

1.3.3 Оператор манипулирования объектами.

Таким оператором в JavaScript являются for..in. Оператор for..in используется для итерирования по всем свойствам объекта. Для каждого свойства выполняется тело цикла. Выглядит оператор следующим образом: for (переменная in объект) {операторы}

 

1.3.4 Комментарии.

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

-комментарий, распространяющийся на одну строку, этому комментария предшествует двойной слеш (//).

-многострочный комментарий, начинающийся с символов /* и заканчивающийся символами */.

Следующий пример показывает два комментария:

// Это - однострочный комментарий.

/* Это - многострочный комментарий.

Он может иметь любую длину. */

 

1.4 Функции.

Функции - один из фундаментальных блоков JavaScript. Функция - JavaScript-процедура - набор операторов, который исполняет определенную задачу. Чтобы использовать функцию, необходимо сначала определить ее.

Определение функции состоит из ключевого слова function, за которым следуют:

    • имя функции.
    • список аргументов функции, заключенный в круглые скобки.Друг от друга аргументы отделяются запятыми.
    • операторы JavaScript, заключенные в фигурные скобки {}.

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

function simplefun(str) {
          document.write("<HR><P>" + str)
}

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

 

1.4.1 Использование функций.

В Navigator’е можете использовать любую функцию, определенную в текущей странице. Можно также использовать функции, определенные в других поименованных окнах и фреймах. В LiveWire-приложениях можно использовать любую функцию скомпилированную с приложением. Как уже было сказано, определение функции не исполняет ее. Для того, чтобы функция выполнилась ее необходимо вызвать. Предположим функция simplefun была определена в разделе HEAD документа, тогда выполнить ее можно, например, следующим образом:

<SCRIPT> simplefun(«Call function simplefun») </SCRIPT>

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

function factorial(n) {
          if ((n == 0) || (n == 1))
                    return 1
          else {
                    result = (n * factorial(n-1) )
          return result
          }
}

Можно вывести результат от одного до пяти следующим образом:

for (x = 0; x < 5; x++) { document.write("<BR>", x, " factorial is ", factorial(x)) }

Результаты:

0 factorial is 1

1 factorial is 1

2 factorial is 2

3 factorial is 6

4 factorial is 24

5 factorial is 120

 

1.4.2 Использование массива аргументов.

Аргументы функции хранятся в массиве. Внутри функции можно адресоваться к параметрам следующим образом:

functionName.arguments [i]

где functionName - имя функции и i - порядковый номер аргумента, начинающийся с нуля. Так, первый аргумент функции, названной myfunc, есть myfunc.arguments [0]. Общее число аргументов обозначается переменной arguments.length. При использовании массива аргументов, можно вызывать функцию с большим количеством аргументов, чем объявлено. Это часто полезно в том случае, когда заранее не известно, сколько аргументов будут переданы функции. Чтобы определить число аргументов фактически переданных функции, можно использовать arguments.length Например, рассмотрим функцию, которая создает списки в HTML-документе. Единственный формальный аргумент функции - строка, которая имеет значение "U" для ненумерованного списка или "O" для нумерованного. Определение функции:

function list(type) {
          document.write("<" + type + "L>") // начало списка
          // цикл по аргументам
          for (var i = 1; i < list.arguments.length; i++) 
                    document.write("<LI>" + list.arguments[i])
          document.write("</" + type + "L>") // end list
}

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

list("О", "one", 1967, "three", "etc., etc...")

выводит информацию в виде пронумерованного списка, так как первый аргумент равен О:

 

1.5 Объекты. Модель объекта.

JavaScript основан на простой объектно-ориентируемой парадигме. Объект строят со свойствами, которые являются переменными JavaScript или другими объектами. Объект также имеет функции, связанные с ним, которые называются методами объекта. В дополнение к объектам, которые встроены в Navigator клиента и LiveWire server, можно определить свои собственные объекты.

 

1.5.1 Объекты и свойства.

Свойства объектов JavaScript доступны следующим образом:

NameObject.Property

где NameObject- имя объекта, Property - его свойство.

Предположим имеется объект с именем department(отдел). Можно определить свойства этого объекта:

название(name),

руководитель(chief),

число сотрудников(number_of_workers) следующим образом:

department.name = "rk6"

department.chief = "Norenkov I.P."

department.number_of_workers = 23;

Второй способ доступа к свойствам - через массивы. Свойства и массивы в JavaScript - довольно близки, фактически они представляют собой различные интерфейсы к одной и той же структуре данных. Так, например, можно определить свойства объекта department следующим образом:

department["name"] = "rk6"

department["chief"] = "Norenkov I.P."

department["number_of_workers "] = 23

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

function show_props(obj, obj_name) {
          var result = ""
          for (var i in obj)
              result += obj_name + "." + i + " = " + obj[i] + "\n"
          return result
}

Так функция, show_props(department, "department") выведет следующий результат: department.name = rk6

department.chief = Norenkov I.P.

department.number_of_workers = 23

 

1.5.2 Создание новых объектов.

И клиент и сервер JavaScript имеют набор предопределенных объектов. Кроме этого, есть возможность создавать свои собственные объекты, для этого необходимо:

    1. Определить тип объекта с помощью конструктора.
    2. Создать экземпляр объекта с помощью оператора new.

Для того, чтобы определить тип объекта, создается функция, в которой определяется имя, свойства, и методы объекта. Например, предположим, что мы хотим создать объект типа отдел. Мы хoтим, чтобы он назывался department и имел свойства - название(name), руководитель(chief), число сотрудников(number_of_workers) и тема над которой работает отдел(theme). Функция будет выглядеть следующим образом:

function department(name, chief, number_of_workers, theme) 

{ this.name = name
  this.chief = chief
  this.number_of_workers = number_of_workers
}

Заметим, что значения свойств объекта определяются значениями, переданными функции. Теперь создадим объект типа department с именем ourdep:

 ourdep = new department("rk6", "Norenkov I.P.", 23) 

В том операторе объекту ourdep назначаются следующие свойства: ourdep.name присваивается строковое значение "rk6", ourdep. number_of_workers - целое 23 и т.д. Можно создать любое количество таких объектов, еще один пример: iu6dep = new department("iu6", "Smirnov U.M", 34). Объект может иметь свойства, которые являются свойствами другого объекта. Предположим мы определяем объект person:

function person(name, age, sex) {
          this.name = name
          this.age = age
          this.sex = sex
}

и создаем два экземпляра этого объекта:

fed = new person("Fedoruk V.G.", 43, "M")

trudon = new person("Trudonoshin V.A.", 46, "M")

Теперь мы хотим переопределить объект department, чтобы он включал новое свойство - сотрудников:

 function department(name, chief,number_of_workers, collab)
 { this.name = name 
   this.chief = chief
   this.number_of_workers = number_of_workers
   this.collab =collab }

Создаем новые объекты типа department:

ourdep = new department("rk6", "Norenkov I.P.", 23,trudon)

iu6dep = new department("iu6", "Smirnov U.M", 34,fed)

Можно обратить внимание, что при создании объектов типа department, им в качестве аргументов передаются имена объектов. Теперь, если мы хотим найти имя сотрудника отдела iu6, то можем воспользоваться следующей записью:

iu6.collab.name

Заметим, что всегда можно добавить свойства к ранее определенному объекту, например оператор rk6.theme = "rk6-07" добавит свойство theme к rk6, и назначит ему значение "rk6-07". Однако это не повлияет на другие объекты, для добавления новых свойств ко всем объектам данного типа необходимо изменить определение объекта.

 

1.5.3 Использование индексов для свойств объекта.

В Navigator 2.0, можно обратиться к свойствам объекта по их названию или по их порядковому индексу. В Navigator3.0, если первоначально свойство определено с помощью названия, то при обращении к нему нужно использовать название, если первоначально воспользовались индексом, то и обращение должно быть с индексом. Исключением из этого правила - объекты типа form, к ним можно обратиться как к элементу массива в соответствии с их порядковым номером (он определяется порядком появления формы в документе) или по имени. Например, если второй тег <FORM> в документе имеет аттрибут NAME "myForm", можно обратиться к этой форме двумя способами:

document.forms[1]

document.forms["myForm"]

 

1.5.4 Определение свойств объекта по умолчанию.

Используя свойство prototype можно назначать свойства всем представителям данного типа, после этого их можно индивидуально переопределить. В следующем примере имена всех руководителей отделов (объект типа department) определяется как null, затем они могут быть изменены

department.prototype.chief=null

 

1.6 Методы.

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

object.methodname = function_name

где object - существующий объект, methodname - имя, которое назначается методу, function_name - имя функции. Метод вызывается следующим образом:

Object.methodname (params);

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

function displayDep() {
    var result = " this.name + " " + this.chief 
                    + " " + this.number_of_workers 
    show_props (result)
}

где show_props - функция из раздела “Функции” Можно включить эту функцию в качестве метода department, добавив в конструктор строку

this.displayDep = displayDep;

То есть полное определение объекта department будет выглядеть так:

function department(name, chief, number_of_workers, collab) {
 this.name = name
 this.chief = chief
 this.number_of_workers = number_of_workers
 this.collab =collab
 this.displayDep = displayDep
}

Тогда вызов метода displayDep для конкретных экземпляров выполняется следующим образом :

ourdep.displayDep()

iu6dep.displayDep()

 

1.6.1 Использование this для ссылок на объект.

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

function validate(obj, lowval, hival) {
   if ((obj.value < lowval) || (obj.value > hival))
      alert("Invalid Value!")
}

Теперь можно вызвать validate в обработчике событий (см.далее) onChange при заполнении формы:

<INPUT TYPE = "text" NAME = "age" SIZE = 3 onChange="validate(this, 18, 99)">

Здесь this относится к вызывающему объекту. При комбинировании со свойствами формы this может относиться к текущей форме родительского объекта. В следующем примере форма myForm содержит объекты text и button. Когда пользователь нажимает кнопку, значение объекта text устанавливается равным имени формы. Обработчик событий onClick использует this.form для ссылки на родительскую форму myForm.

<FORM NAME="myForm">

Form name:<INPUT TYPE="text" NAME="text1" VALUE="Moscow">

<P> <INPUT NAME="button1" TYPE="button" VALUE="Show Form Name" onClick="this.form.text1.value=this.form.name"> </FORM>

 

1.6.2 Удаление объекта.

В JavaScript для Navigator 2.0 нельзя удалять объекты - они существуют, пока вы не покинете страницу, содержащую объект. В JavaScript для Navigator 3.0, можно удалять объекты, устанавливая ссылку на пустой указатель (если это - последняя ссылка на объект) в этом случае объект удаляется немедленно.

 

1.7 Встроенные объекты и их методы.

Некоторые объекты встроены в JavaScript и могут использоваться как в клиенте, так и на сервере. Ими являются объекты типа Array, Boolean, Date, Function, Math, Number, and String.

 

1.7.1 Объекты Array.

JavaScript не имеет явного типа данных -массив(array). Однако, можно использовать встроенный объект Array и его методы и работать с массивами в приложениях. Объект Array имеет методы для соединения, перевертывания и сортировки массивов. У него есть свойство для определения длины массива. Массив есть упорядоченный набор значений, к которым можно обратиться по имени и индексу. Создание массивов:

    1. arrayObjectName = new Array([arrayLength])
    2. arrayObjectName = new Array([element0, element1, ..., elementn])

аrrayObjectName является или названием нового объекта или свойством существующего объекта, аrrayLength - начальная длина множества. Можно получить доступ к этому значению используя свойство length; elementn - список значений для элементов множества, когда использована вторая форма инициализации массива, его длина определяется количеством аргументов.

Объект Array имеет следующие методы:

- join - связывает все элементы массива в строку;

- reverse переворачивает элементы массива: первый элемент становится последним и наоборот;

- sort сортирует элементы массива.

Например, предположим, что мы определяем следующий массив:

myArray = new Array("Wind","Rain","Fire")

тогда myArray.join() возвратит "Wind,Rain,Fire";

myArray.reverse преобразует массив так, что myArray[0] есть"Fire", myArray[1] есть "Rain", и myArray[2] есть "Wind".

myArray.sort сортирует элементы массива в лексикографическом порядке, так что myArray[0] есть "Fire", myArray[1] есть "Rain", и myArray[2] есть "Wind".

Определение элементов массива. Можно определять элементы массива с помощью оператора присваивания, например:

emp[1] = "Casey Jones"

emp[2] = "Phil Lesh"

emp[3] = "August West"

Можно это сделать при при создании массива:

myArray = new Array("Hello", myVar, 3.14159)

В следующем примере создается двумерный массив и выводится на экран.

a = new Array(4)
for (i=0; i < 4; i++) {
   a[i] = new Array(4)
   for (j=0; j < 4; j++) {
      a[i][j] = "["+i+","+j+"]"
   }
}
for (i=0; i < 4; i++) {
   str = "Row "+i+":"
   for (j=0; j < 4; j++) {
      str += a[i][j]
   }
   document.write(str,"<p>")
}

Этот пример показывает следующие результаты:

Row 0:[0,0][0,1][0,2][0,3]

Row 1:[1,0][1,1][1,2][1,3]

Row 2:[2,0][2,1][2,2][2,3]

Row 3:[3,0][3,1][3,2][3,3]

Можно обратиться к элементам массива используя значение элемента или его индекс. Например, в следующем примере myArray = new Array("Wind","Rain","Fire") Можно обратиться к первому элементу массива как myArray [0] или myArray ["Wind"].

 

1.7.2 Объекты Boolean.

Встроенные объекты Boolean нужно использовать тогда, когда необходимо преобразовать не-boolean значение в boolean значение. Можно использовать Boolean в любом месте JavaScript, где ожидается значение такого типа. JavaScript возвращает значение объекта Boolean автоматически вызывая метод valueOf.

Создание объектa Boolean:

booleanObjectName = new Boolean(value)

booleanObjectName - или имя нового объекта или свойство существующего, value - начальное значение объекта. Значение преобразуется к типу boolean, если необходимо. Если значение опущено или 0, null, false или пустая строка "", объект инициализируется значением false, Во всех других случаях, включая строку "false", создается объект с начальным значением true. В следующем примере создаются два объекта Boolean

bfalse = new Boolean(false)

btrue = new Boolean(true)

 

1.7.3 Объект Date.

JavaScript не имеет данных типа date. Однако, можно использовать объект Date и его методы для работы с датами и временами в приложениях. Объект Date имеет большое количество методов для установки, получения, и управления датами. У него нет свойств. JavaScript обращается с датами подобно языку Java. Эти два языка имеют много одинаковых методов и хранят даты как число миллисекунд. прошедших с 1 января 1970г, 00:00:00.

Примечание. В настоящее время нельзя работать с датами до 1 января 1970г.

Создание объекта Date:

dateObjectName = new Date([parameters])

где dateObjectName - имя создаваемого объекта, это может быть новый объект или свойство существующего объекта. Параметры могут задаваться следующим образом:

- опущены: создается текущие дата и время, например, today= new Date();

- определяется строка в формате “месяц день, год часы:минуты:секунды”, например, Xmas95 =new Date("December 25, 1995 13:30:00"). Если опускаются часы, минуты или секунды они устанавливаются в нуль;

- задается целое значение года, месяца и дня, например, Xmas95 = new Date(95,11,25).

- задается целое значение года, месяца, дня, часов, минут, секунд.

Методы объекта Date.

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

    • "set" методы, для установки дат и времен;
    • "get" методы, для получения дат и времен;
    • "to" методы, для получения строковых значений;
    • parse и UTC методы, для грамматического разбора строк с датами.

С помощью "get" и "set" методов можно получать и устанавливать секунды, минуты, часы, дни месяца, дни недели, месяцы, и годы независимо друг от друга. Имеется метод getDay, возвращающий день недели, но нет соответствующего метода setDay, поскольку день недели устанавливается автоматически.

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

-секунды и минуты: 0 - 59

-часы: 0 - 23

-день недели: 0 - 6

-день месяца: 1 - 31 -месяц: 0 (январь) - 11 (декабрь)

-год: с 1900

Например, если вы установили следующую дату:

Xmas95 = new Date("December 25, 1995")

то Xmas95.getMonth() возвратит 11, а Xmas95.getYear() возвратит 95. Методы getTime и setTime полезны для сравнения дат. Метод getTime возвращает число миллисекунд начиная с 01.01.1970. Следующий пример выводит число дней, прошедших в текущем году:

today = new Date()

endYear = new Date("December 31, 1990") // Установили день и месяц endYear.setYear(today.getYear()) // Установили текущий год

msPerDay = 24 * 60 * 60 * 1000 // Число миллисекунд за день

daysLeft = (endYear.getTime() - today.getTime()) / msPerDay

daysLeft = Math.round(daysLeft) document.write("Number of days left in the year: " + daysLeft)

В этом примере создается объект Date c именем today, который содержит текущую дату. endYear определяет начало текущего года. Тогда, используя число миллисекунд за день, вычисляем число дней между today и endYear, используя getTime, и округляем число дней до целого.

Метод parse полезен для присваивания даты существующему объекту из строкового значения. Например, следующий пример использует parse и setTime для назначения даты объекту mydate:

mydate = new Date() mydate.setTime(Date.parse("Aug 9, 1995"))

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

The current time is

Раздел <BODY> документа выглядит так:

<BODY onLoad="JSClock()">

<FORM NAME="clockForm"> The current time is <INPUT TYPE="text" NAME="digits" SIZE=12 VALUE=""> </FORM> </BODY>

Тег <BODY> включает обработчик событий onLoad. Когда страница загружается обработчик вызывает функцию JSClock, определяемую в разделе <HEAD>. Форма clockForm включает простое текстовое поле digits, в котором инициализирована пустая строка. В разделе <HEAD> документа JSClock определяется следующим образом:

<HEAD> <SCRIPT language="JavaScript">

<!-- function JSClock() {

var time = new Date()

var hour = time.getHours()

var minute = time.getMinutes()

var second = time.getSeconds()

var temp = "" + hour

temp += ((minute < 10) ? ":0" : ":") + minute

temp += ((second < 10) ? ":0" : ":") + second

document.clockForm.digits.value = temp

id = setTimeout("JSClock()",1000) } //-->

</SCRIPT>

Функция JSClock сначала создает новый объект Date, с именем time; так как аргументы не заданы, устанавливаются текущие значения. Запросы к getHours, getMinutes, и getSeconds выделяют значение текущего часа, минуты и секунды. Следующие четыре оператора строят строковое значение времени. Полученное значение присваивается области текста: document.clockform.digits.value = temp, тем самым время будет показано в документе. Конечный оператор в функции - рекурсивный запрос к JSClock: id=setTimeout("JSClock()",1000) Встроенная в JavaScript функция setTimeout определяет время задержки для для обращения к JSClock. Второй аргумент указывает задержку в 1000 миллисекунд. Таким образом модернизируется показ времени в форме с интервалом одна секунда. Обратите внимание, функция возвращает значение присваиваемое id, которое в данном случае нигде не используется, но может быть использовано в методе clearTimeout для обнуления.

 

1.7.4 Объект Function.

Создание объекта Function:

functionObjectName = new Function ([arg1, arg2, ... argn], functionBody)

functionObjectName - имя переменной или свойство существующего объекта. При использовании свойств функции, functionObjectName должен быть или именем существующего объекта или свойством существующего объекта. аrg1, arg2, ... argn - аргументы, которые используются функцией как формальные параметры. Каждый из параметров должен быть строкой, которая допустима в JavaScript как идентификатор; например " x "или"theForm ". functionBody - строка, специфицирующая JavaScript-коды, которые нужно компилировать как тело функции.

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

Следующий пример назначает функцию переменной setBGColor. Эта функция устанавливает цвет фона текущего документа.

var setBGColor = new Function("document.bgColor='antiquewhite'")

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

var colorChoice="antiquewhite" if (colorChoice=="antiquewhite") {setBGColor()}

Можно назначить функцию обработчиком событий следующими способами:

    1. document.form1.colorButton.onclick=setBGColor
    2. <INPUT NAME="colorButton" TYPE="button" VALUE="Change background color" onClick="setBGColor()">

Создание переменной setBGColor похоже на обычное декларирование функции.

function setBGColor() { document.bgColor='antiquewhite' }

Назначение функции переменной подобно объявлению функции, но есть различия: когда для функции назначается переменная setBGColor = new Function("..."), setBGColor является переменной, текущее значение которой относиться к функции, созданной с помощью new Function(), когда создается функция с помощью function setBGColor() {...}, setBGColor не является переменной, это имя функции.

 

1.7.5 Объект Math.

Встроенный объект Math имеет свойства и методы для ма- тематических констант и функций. Например, свойство PI объекта Math имеет значение 3.141..., который можно использовать как Math.PI Стандартные математические функции являются методами Math. Они включают тригонометрические, логарифмические, показательные, и другие функции. Например, если нужно использовать синус, следует писать Math.sin (1.56) Обратите внимание что все тригонометрические методы Math используют аргументы в радианах. В следующей таблице приведены методы Math.

Метод Описание
abs абсолютное значение
sin, cos, tan стандартные тригонометрические функции, аргумент в радианах
acos, asin, atan обратные тригонометрические функции, возвращают значение в радианах
exp, log экспонента и натуральный логарифм
ceil возвращает наименьшее целое, большее или равное аргументу
floor возвращает наибольшее целое, меньшее или равное аргументу
min, max возвращает меньшее или большее (соответственно) из двух аргументов
pow возведение в степень, первый аргумент основание, второй показатель степени
round округляет аргумент до ближайшего целого
sqrt квадратный корень

Часто удобно использовать оператор with, когда есть раздел, в котором используется набор констант и методов, чтобы не повторять слово "Math".

Например:

with (Math) { a = PI * r*r; y = r*sin(alfa); x = r*cos(alfa) }

 

1.7.6 Объект Number.

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

biggestNum = Number.MAX_VALUE

smallestNum = Number.MIN_VALUE

infiniteNum = Number.POSITIVE_INFINITY

negInfiniteNum = Number.NEGATIVE_INFINITY

notANum = Number.NaN

В следующей таблице приведены свойства Number:

Название Описание
MAX_VALUE наибольшее значение
MIN_VALUE наименьшее значение
NaN неопределенность
NEGATIVE_INFINITY отрицательная бесконечность
POSITIVE_INFINITY положительная бесконечность

 

1.7.7 Объект String.

У JavaScript нет типа данных string. Однако можно пользоваться объектом String и его методами для работы со строками в прилoжениях. Этот объект имеет множество методов и одно свойство - длину строки.

Создание объекта String:

stringObjectName = new String(string)

stringObjectName - имя нового объекта String, string - любая строка.

Например, следующий оператор создает объект String, названный mystring:

mystring = new String ("Hello, World!")

аналогичные действия выполняет и оператор:

mystring="Hello, World!"

Строковые литералы также являются объектами String. Свойство length для строки указывает число символов в ней, так x = mystring.length присвоит значение х равное тринадцати, потому что "Hello, World!" имеет 13 символов.

Объект String имеет два типа методов - те, которые возвращают в качестве результата преобразованную исходную строку (как, например, подстроку или строку, у которой все символы переведены в верхний регистр) и те, которые возвращают строку в формате HTML (например link).

Например mystring.toUpperCase() and "hello,world!".toUpperCase() возвратят строку "HELLO, WORLD!". Метод substring имеет два аргумента и возвращает подстроку, располагающуюся между указанными номерами, например, mystring.substring(4, 9) возратит строку "o,Wo".

Методы bold и link используются для HTML- форматирования, первый создает жирный текст, второй гипертекстовую ссылку. Например, для создания ссылки к гипотетическому URL с помощью метода link можно воспользоваться следующим оператором:

mystring.link("http://www.helloworld.com")

Следующая таблица показывает методы объектов Sring:

Метод описание
anchor создает HTML-якорь
big, blink, bold, fixed, italics, small, strike, sub, sup создает строку HTML, соответствующего вида
charAt возвращает символ по его номеру в строке
ndexOf, lastIndexOf возвращают первую (последнюю) позицию специфицированной подстроки
link создает гипертекстовую ссылку
split разбивает объект String на массив подстрок
substring извлекает подстроку из строки
toLowerCase, toUpperCase возвращает строку в нижнем или верхнем регистре, соответственно

 

1.8 Встроенные функции.

1.8.1 Функция isNaN.

Функция оценивает аргумент на неопределенность.

Синтаксис: isNaN(testValue)

где testValue -значение, которое вы хотите оценить.

На платформах, которые поддерживают NaN, функции parseFloat и parseInt (см. ниже) возвращают "NaN", когда значение не является числом. isNaN возвращает true если "NaN," и false в другом случае. В следующей программе оценивается значение floatValue и вызывается соответствующая процедура:

floatValue=parseFloat(toFloat) if (isNaN(floatValue))

{ notFloat() } else { isFloat() }

 

1.8.2 Функции parseInt и parseFloat.

Эти функции возвращают числовое значение строкового аргумента.

Синтаксис parseFloat: parseFloat(str)

parseFloat выполняет лексикографический разбор строки и, если это возможно, возвращает число с плавающей точкой.

Если в строке встречаются символы отличные от знака (+ или -), цифры (0-9), десятичной точки или экспоненты, разбор прекращается и возвращается значение, полученное до этого момента, остальные символы игнорируются. Если самый первый символ не может быть преобразован в число возвращается"NaN" (not a number).

Синтаксис parseInt: parseInt(str [, radix])

parseInt выполняет лексикографический разбор первого аргумента - строки str, и возвращает целое по основанию, заданным вторым необязательным аргументом radix. Например radix 10 показывает, что строку нужно преобразовывать в десятичное число, 8 в восьмеричное, 16 в шестнадцатиричное и так далее. При основании больше десяти для обозначения цифр используются буквы в алфавитном порядке. Преобразование выполняется до первого недопустимого символа, остальные символы игнорируются, если первый символ не может быть преобразован возвращается "NaN".

 

2. Глава. Включение JavaScript в HTML- документы.

Существуют следующие способы подключения JavaScript- программ к HTML документу:

    1. Использование тега <SCRIPT>.
    2. Объявление JavaScript-файла, содержащего текст про- граммы.
    3. Определение JavaScript-выражения в качестве значения для HTML-атрибутов.
    4. Объявление JavaScript-программы в качестве обработчика событий.

2.1 Использование тега SCRIPT.

Тег <SCRIPT> - расширение к HTML, который может включать любое число JavaScript-операторов.

<SCRIPT> JavaScript операторы ... </SCRIPT>

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

<SCRIPT LANGUAGE= "JavaScript"> определяет JavaScript для Navigator 2.0.

<SCRIPT LANGUAGE= "JavaScript1.1"> определяет JavaScript для Navigator 3.0.

Операторы в пределах тега <SCRIPT> игнорируются, если браузер пользователя не имеет уровня поддержки JavaScript, указанного в признаке LANGUAGE. Если признак LANGUAGE опущен, Navigator 2.0 принимает LANGUAGE="JavaScript". Navigator 3.0 предполагает LANGUAGE="JavaScript1.1". Поскольку появился VBScript (альтернатива JavaScript, базирующаяся на Visual Basic, разработка Microsoft) , то признак LANGUAGE становиться обязательным.

Можете использовать признак LANGUAGE, для написания программ, которые содержат особенности Navigator 3.0, и эти программы не будут приводить к ошибкам, если пользоваться Navigator 2.0. Следующие примеры показывают некоторые методы ис- пользования признака LANGUAGE.

Пример 1. Этот пример показывает, как определить функции дважды, для JavaScript 1.0, и для JavaScript 1.1.

< SCRIPT LANGUAGE= "JavaScript" > // функции для JavaScript 1.0 </SCRIPT>
< SCRIPT LANGUAGE= "JavaScript1.1" > // те же функции,для JavaScript 1.1
// функции только для версии 1.1 </SCRIPT>
<FORM > <INPUT TYPE="button" onClick="doClick(this)"
...> . . . </FORM>

Пример 2. Этот пример показывает, как использовать две отдельных версии JavaScript документа, для JavaScript 1.0 и для JavaScript1.1. По умолчанию документ загружается для JavaScript 1.0. Если пользователь имеет Navigator 3.0, то replace-метод заменит страницу.

< SCRIPT LANGUAGE= "JavaScript1.1" > // Замена страницы при работе с версией 1.1
location.replace("js1.1/mypage.html" ) </SCRIPT>
[здесь продолжается страница с 1.0-совместимыми операторами ... ]

Пример 3. Этот пример показывает, как проверить браузер с помощью navigator.userAgent, чтобы определить его версию.

<SCRIPT LANGUAGE="JavaScript"> if (navigator.userAgent.indexOf("3.0")!= -1) jsVersion = "1.1" else jsVersion = "1.0" </SCRIPT>

[ После этого, проверяете переменную jsVersion перед использованием любых расширений для JavaScript 1.1]

 

2.1.1 Сокрытие программ в пределах признаков комментария.

Только начиная с версии 2.0 Netscape Navigator распознает JavaScript. Чтобы гарантировать, что другой браузер будет игнорировать JavaScript, можно размещать SCRIPT-операторы в пре- делах HTML-комментариев, как это показано ниже:

<SCRIPT> 
<! -  Здесь начинаются SCRIPT-операторы, которые нужно 
скрыть от старого браузера.
JavaScript операторы ... 
// здесь заканчивается сокрытие. - >
</SCRIPT>

Navigator должным образом интерпретирует признаки SCRIPT и игнорирует строки в программе, начинающиеся двойным слешем (//). В настоящее время большинство пользователей имеют браузеры, интерпретирующие программы на JavaScript, но если вы не хотите доставить неприятности для пользователей со старыми браузерами, следует использовать эту технику. Примечание. Для простоты, некоторые из примеров в этой книге не скрывают программ, то есть написаны определенно для Navigator 2.0. Пример:

<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!--- Скрываем текст от старых браузеров.
document.write ("I am from JavaScript!")
// Заканчиваем сокрытие -->
</SCRIPT>
<P>This is HTML-text.
</BODY>

Этот SCRIPT показывает в Navigator’е следующее:

I am from JavaScript!
This is HTML-text.

Заметим, что для клиента нет никакого различия в появлении первой строки, произведенной с помощью JavaScript, и второй строкой, выполненной с помощью HTML. Точка с запятой (;) в конце оператора необходима только в том случае, если он является не единственным на этой строке.

 

2.2 Определение файла для JavaScript.

Признак SRC тега <SCRIPT> позволяет вам определять файл как источник операторов JavaScript. Например:

<HEAD>
<TITLE>My Page</TITLE>
<SCRIPT SRC="myprog1.js">
...
</SCRIPT>
</HEAD>
<BODY>
...

Этот признак особенно полезен для разделения функций при большом количестве страниц. JavaScript операторы в пределах тега <SCRIPT> с признаком SRC игнорируются, если в файле нет ошибок. Например, вы можете поместить следующий оператор между <SCRIPT SRC="..." > и </ SCRIPT >:

document.write("Included JS file not found")

Этот оператор будет выполняться только в том случае, если при загрузке файла произойдет какая-либо ошибка. Признак SRC может определить любой URL, относительный или абсолютный. Например:

< SCRIPT SRC= "http://home.netscape.com/functions/jsfuncs.js ">

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

 

2.3 Использование JavaScript-выражения как значения HTML-атрибутов.

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

- символ & (амперсанд);

- числовой код или символьное имя;

- символ ; (точка с запятой).

Например, можно включить символ "больше" ( > ) с помощью последовательности $GT; и "меньше" ( < ) с помощью $LT;. Применение таких последовательностей связано с тем, что указанные символы являются зарезервированными в языке HTML. JavaScript-объекты также начинаются с символом & и заканчиваются точкой с запятой(;). Вместо имени или номера используется JavaScript-выражение, заключенное в фигурные скобки { }. Можно использовать JavaScript-объекты только там, где употребимо значение тега HTML. Например, пусть в документе определена средствами JavaScript переменная barWidth, имеющая значение равное 50. Теперь можно создать горизонтальную линию на половину окна следующим образом:

<HR WIDTH="&{barWidth};%" ALIGN="LEFT">

Как и для других HTML-элементов, после того, как расположение произошло, образ страницы может измениться, после ее перезагрузки. Следующий пример определяет простую функцию в части HEAD документа и вызывает ее в части BODY документа:

<HEAD> 
<SCRIPT LANGUAGE="JavaScript">
<!-- Скрываем от старых браузеров
function myfunc(number) { return number + number}
// Конец сокрытия -->
</SCRIPT>
</HEAD>
<BODY>
<SCRIPT>
          document.write("Two arguments is ", myfunc(7), ".") 
</SCRIPT>
<P> OK !
</BODY>

Функция myfunc имеет один аргумент, названный number. Состоит она из одного оператора return number+number, который должен возвратить удвоенное значение аргумента функции. Вызывается функция с аргументом 7. Результат, выводимый на экран выглядит следующим образом:

Two arguments is 14.
OK !

В функции myfunc использовался оператор document.write(...) для вывода результата в Navigator’е. Этот оператор вызывает write-метод для объекта document в стандартной нотации: objectName.methodName(arguments...) где objectName есть имя объекта, methodName есть имя метода, и arguments есть список аргументов метода, отделяемых запятыми.

 

2.3.1 Использование write-метода.

С помощью write-метода можно выводить информацию в окно навигатора, в общем-то так же, как и с помощью HTML- операторов, но write-метод обладает большими возможностями, например можно работать с переменными аргументами. По этим причинам, write - один из наиболее часто используемых JavaScript-методов. write-метод работает с любом числом строковых аргументов, которые могут быть строковыми литералами или переменными. Можно также использовать строковую конкатенацию - оператор ( + ), чтобы создать одну строку из нескольких. Рассмотрим следующий пример, который производит динамический HTML:

<HEAD> <SCRIPT>
<!--- Скрываем от старого браузера
// Эта функция выводит горизонтальную линию заданной ширины
function bar(widthPct) { document.write("<HR ALIGN='left' 
WIDTH=" + widthPct + "%>")}
// Эта функция показывает заголовок указанного уровня и неко-
// торый текст 
function output(headLevel, headText, text) {
         document.write("<H", headLevel, ">", headText, "</H", 
         headLevel, "><P>", text)
}
// конец сокрытия-->
</SCRIPT> </HEAD>
<BODY>
<SCRIPT>
<!--- начало сокрытия
bar(25) 
output(2,"Это заголовок 2-го уровня", "JavaScript это очень просто...")
// конец сокрытия -->
</SCRIPT>
<P> Это стандартный HTML, в отличие от предыдущей строки,
которая сгенерирована.
</BODY>

Раздел HEAD этого документа определяет две функции:

-bar - функция выводит горизонтальную линию заданной ширины

-output - функция показывает заголовок указанного уровня и некоторый текст

Раздел BODY вызывает обе функции с фактическими параметрами и результат вызова показан ниже.

Это стандартный HTML, в отличие от предыдущей строки,которая сгенерирована.

Следующий оператор выводит линию заданной ширины:

Document.write ("<HR ALIGN='left' WIDTH=", widthPct, "%>")

Замечание: здесь использованы одинарные кавычки внутри двойных. Это нужно делать всякий раз, когда хотите указать строку в кавычках внутри строкового литерала. Тогда вызов bar с аргументом двадцать пять производит продукцию эквивалентную следующему HTML:

< HR ALIGN= "left" WIDTH=25 % >

Имеется вариант write - writeln, который добавляет перевод строки. Поскольку HTML вообще игнорирует перевод строки, то нет разницы между write и writeln, кроме раздела .

 

2.4 Обработка событий в JavaScript.

Приложения JavaScript в Navigator’е в значительной степени управляются событиями. Например, нажатие кнопки мыши, изменение области текста, перемещение мыши по ссылке и т.п.- события. Можно определить события, на которые будет реагировать ваша программа. Список событий, обрабатываемых в JavaScript приведен в следующей таблице.

Событие Применяется к Появляется когда Обработчик события
abort images Пользователь прерывает загрузку изображения onAbort
blur windows, frames и все формы элементов Пользователь убирает фокус ввода onBlur
click button, radio button, checkboxes, submit button, reset button, links Пользователь выбирает форму или ссылку onClick
change текстовые поля, текстовые области Пользователь меняет значение элемента onChange
error images, windows Ошибка загрузки документа или изображения onError
focus windows, frames, и все формы элементов Пользователь передает фокус ввода onFocus
load тело документа Пользователь загружает страницу в браузер onLoad
mouseout areas, links Пользователь перемещает указатель мыши по области onMouseout
mouseover links Пользователь очищает форму (нажимает клавищу Reset) onMouseover
reset forms Пользователь выбирает область ввода элемента формы onReset
select текстовые поля, текстовые области Пользователь указывает форму onSelect
submit submit button Пользователь выбирает поле ввода элемента формы onSubmit
unload тело документа Пользователь закрывает страницу onUnload

Название программы-обработчика события обычно состоит из названия самого события, которому предшествует “on”

Например, программа-обработчик получения фокуса ввода называется onFocus. Чтобы создать программу-обработчик события для HTML тега, нужно добавить обработчик события к тегу, указав в двойных кавычках программу-обработчик. Аргументы программы обработчика, если таковые имеются, задаются в круглых скобках. Типовой синтаксис имеет вид:

<ТЕГ обработчик события="Имя программы-обработчика (аргументы) ">

Предположим, что вы создали функцию JavaScript, названную myobr. Можно заставить Navigator исполнять эту функцию, когда пользователь нажмет на кнопку. Нажатие кнопки сопровождается событием Click, обработчиком этого события является onClick, которой соответствует программа compute

<INPUT TYPE="button" VALUE="Calculate" onClick="myobr(this.form)">

Если хотите включить более чем один оператор для обработки события, то их следует разделять точкой с запятой (;). В предыдущем примере this.form относится к текущей форме. Ключевое слово this относится к кнопке. OnClick-обработчик обращаетcя к compute, с текущей формой как аргументом.

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

В следующем примере, можно ввести выражение (например, 2+3 ) в первой области текстового ввода, и после нажатия кнопки во второй текстовой области получить результат (например, 5).

<HEAD> <SCRIPT> <!--- Скрываем от старых браузеров function compute(f) { if (confirm("Are you sure?")) f.result.value=eval(f.expr.value) else alert("Please come back again.") } // конец сокрытия --> </SCRIPT> </HEAD> <BODY> <FORM> Введите выражение: <INPUT TYPE="text" NAME="expr"SIZE=15 > <INPUT TYPE="button" VALUE="Calculate" onClick="compute(this.form)"> <BR> Результат: <INPUT TYPE="text" NAME="result" SIZE=15 > </FORM> </BODY>

Navigator покажет следующее:

Введите выражение:
Результат:

HEAD документа определяет единственную функцию, compute, с одним аргументом f. Функция использует диалоговый бокс для подтверждения ввода с кнопками OK и Cancel. Если пользователь нажимает OK, подтверждая правильность ввода, вызывается встроенная функция eval(f.expr.value). Если пользователь нажимает Cancel, происходит выход из функции. Обратите внимание на использование значения полей NAME в функции, эти имена входят составной частью в имена переменных в функции.

 

2.4.1 Явный запрос программ-обработчиков событий.

В JavaScript для Navigator 3.0, можно повторно переопределить программу-обработчик события, как это показано ниже:

 <SCRIPT LANGUAGE="JavaScript">
function fun1() { ... }
 function fun2() { ... }
 </SCRIPT>
 <FORM NAME="myForm">
 <INPUT TYPE="button" NAME="myButton"
onClick="fun1()"> </FORM> <SCRIPT> document.myForm.myButton.onclick=fun2
</SCRIPT>

Обратите внимание, что новая программа-обработчик записывается как fun2, не fun2()

 

2.5 Проверка правильности заполнения формы.

Проверка правильности заполнения формы у клиента полезна, так как:

    1. снижает нагрузку на сервер, поскольку "плохие данные " будут уже фильтрованы.
    2. сокращает задержки в случае ошибки пользователя. Поскольку при проверке отсутствуют сетевые обращения.
    3. упрощает серверную программу.

Пример функции с проверкой правильности заполнения форм

<HEAD>
<SCRIPT LANGUAGE="JavaScript">
function isaPosNum(s) {
return (parseInt(s) > 0) }
function qty_check(item, min, max) {
 var returnVal = false 
     if (!isaPosNum(item.value)) 
        alert("Please enter a postive number" )
     else
        if (parseInt(item.value) < min) alert("Please enter a "
                + item.name + " greater than " + min)
        else if (parseInt(item.value) > max)
                alert("Please enter a " + item.name
                      + " less than " + max)
             else returnVal = true return returnVal
}
 
function validateAndSubmit(theform){
  if (qty_check(theform.quantity,0, 999))
   { alert("Order has been Submitted") return true }
  else { alert("Sorry, Order Cannot Be Submitted!") return false } }
</SCRIPT>
 </HEAD>

isaPosNum - простая функция, которая возвращает TRUE, если аргумент -положителен, и FALSE - иначе. qty_check имеет три аргумента: item - соответствующий элементу формы и минимальное и максимальное допустимое значение. Эта функция проверяет значение item, которое должно находиться между min и max, и вызывает alert-бокс, если это не так.

validateAndSubmit имеет в качестве аргумента форму и использует qty_check, чтобы проверить значение элемента формы и принимает форму, если она заполнена правильно, или вызывает alert-бокс и не принимает форму.

В следующем примере выполняется вызов этих функций: qty_check- как программы-обработчика onChange для текстового поля и validateAndSubmit- как обработчика onClick для клавиши

<BODY>
<FORM NAME="widget_order" ACTION="lwapp.html"
    METHOD="post">How many widgets today?
 <INPUT TYPE="text" NAME="quantity"
onChange="qty_check(this, 0, 999)">
 <BR> <INPUT TYPE="button"
VALUE="Enter Order" onClick="validateAndSubmit(this.form)">
</FORM>
</BODY>

Форма выглядит следующим образом:

How many widgets today?

Эта форма задает значение для LiveWire-приложения, названного lwapp.html.

 

 

 

 

3. Глава. Использование объектов Navigator'а

Излагаемый здесь материал относится в основном к JavaScript-клиенту.

 

3.1 Иерархия объектов.

Объекты Navigator’а имеют следующую иерархию:

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

document.form1.

Каждая страница имеет следующие объекты:

    1. navigator - имеет свойства для названия и версии используемого Navigator, для типов MIME, поддерживаемых клиентом и встроенную (plug-in) поддержку, инсталлированную у клиента;
    2. window - объект, имеющий свойства, которые применя- ются к полному окну. Имеется также объект window для каждого "дочернего окна" в документе .
    3. document - имеет свойства, основанные на оформлении документа, типа заглавия, цвета фона, ссылок и форм.
    4. location - определяется текущим URL.
    5. history - имеет свойства, представляющие URL, которые клиент предварительно использовал.

В зависимости от содержания, документ может иметь и другие объекты.: например, каждая форма (определяемая в теге FORM) в документе представляет объект Form. Следующая ссылка относится к свойству value текстового поля с именем text1 в форме, названной myform, текущего документа:

document.myform.text1.value

Когда объект включен в форму, для обращения к нему необходимо указывать имя формы, даже в том случае, когда объект может существовать вне формы. Например рисунок (image) может существовать вне формы, но если он в нее включен, то обращение должно выглядеть следующим образом:

 document.imageForm.aircraft.src='f15e.gif'

В том случае, если рисунок вне формы, обращение будет следующим:

 document.aircraft.src='f15e.gif'

3.1.1 Примеры свойств документа.

Предположим мы создали страницу, поименованную simple.html, со следующим содержимым:

<HEAD><TITLE>My Document</TITLE>
<SCRIPT>
function update(form) {
          alert("Form being updated")
}
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="myform" ACTION="foo.cgi" METHOD="get" >
Enter a value:
<INPUT TYPE="text" NAME="text1" VALUE="everything" 
SIZE=20>
Check if you want:
<INPUT TYPE="checkbox" NAME="Check1" CHECKED  
onClick="update(this.form)"> Option #1
<P>
<INPUT TYPE="button" NAME="button1" VALUE="Press Me"
          onClick="update(this.form)">
</FORM>
</BODY>

Базовые объекты могут иметь следующие свойства:

Свойства значения
document.title “My Document”
document.fgcolor #000000
document.bgColor #ffffff
location.href "http://www.sampson.com/samples/simple.html"
history.length 7

Значение document.title определяется содержимым тега TITLE, значения document.fgColor и document.bgColor явным образом не определены, поэтому они выбираются по умолчанию из установок диалогового бокса Preferences (когда пользователь выбирает General Preferences из меню Options).

Полные имена объектов в выше приведенном документе будут следующими:

    • document.myform, для form
    • document.myform.Check1, для checkbox
    • document.myform.button1, для button.

Объект myform имеет свойства, основывающиеся на аттрибутах тега FORM:

- action есть http://www.sampson.com/samples/foo.cgi, URL, на который указывает форма.

- method есть "get" как указано в аттрибуте METHOD .

- length равна 3, поскольку в форме три элемента ввода.

Объект Form имеет дочерние объекты button1 и text1, эти объекты обладают своими собственными свойствами, например: button1.value имеет значение "Press Me" , button1.name - "Button1" text1.value - "everything" text1.name - "text1". На эти свойства следует ссылаться, используя полные имена, например: document.myform.button1.value.

 

3.2 Исполнение JavaScript-программ

Чтобы понимать исполнение JavaScript-программы, важно знать как они исполняются Navigator'ом - то есть как Navigator преобразует HTML теги в графическое отображение. В общем случае Navigator исполняет файл HTML сверху вниз. Например, предположим, что определена форма с двумя элементами ввода текста:

<FORM NAME="statform">
<INPUT TYPE = "text" name = "userName" size = 20>
<INPUT TYPE = "text" name = "Age" size = 3>

Эти элементы формы определены как JavaScript-объекты и их можно использовать после того, как форма определена следующим образом:

document.statform.userName и document.statform.Age.

Например, можно показать значение этих объектов в программе после заполнения формы:

<SCRIPT> 
document.write(document.statform.userName.value)
document.write(document.statform.Age.value)
</SCRIPT>

(Чтобы увидеть только что введенные значения необходимо перезагрузить документ.)

Однако, если попробовать сделать это перед определением формы (выше заполнения формы в HTML странице), получите ошибку, потому что объекты не существуют еще в Navigator’е. Аналогично, если расположение объекта на экране произошло, то установка нового значения не приведет к изменению изображения. Например, предположим заголовок документа определен следующим образом:

<TITLE>My JavaScript Page</TITLE>

Для JavaScript это значение переменной document.title. Navigator выводит этот заголовок в своей верхней строке. Если позже попытаться изменить значение этой переменной, то это не вызовет изменение изображения, не приведет к изменению переменной и может вызвать ошибку. Имеются некоторые важные исключения из этого правила: Можно модернизировать значения элементов формы динамически. Например, следующее описание определяет область текста, который первоначально показывает строку "Source value". Когда вы нажимаете кнопку, добавляется новый текст "...Updated".

<FORM NAME="demoForm">
<INPUT TYPE="text" NAME="mytext" SIZE="40" VALUE="Source value
 ">
<P><INPUT TYPE="button" VALUE="Click to Update Text Field"
 onClick="document.demoForm.mytext.value += '...Updated ' ">
</FORM>

Это простой пример обновления элемента формы после расположения. При использовании программ-обработчиков событий можно также изменить некоторые другие свойства после того, как расположение произошло, например, document.bgcolor.

 

3.3 Ключевые объекты Navigator'a.

Этот раздел описывает некоторые наиболее полезные объекты Navigator’а, включая окна, фреймы, документ, формы, местоположение, и историю.

 

3.3.1 window и Frame объекты.

Объект window - "родительский" объект для всех других объектов в Navigator’е. Можно создать несколько окон с помощью JavaScript-приложений. Объект Frame - определяется с помощью тега FRAME в разделе FRAMESET. Frame имеет те же свойства и методы, что и window и отличаются только способом вывода. Объект window имеет многочисленные полезные методы:

open и close: Открывает и закрывает окно, можно специфицировать размер окна, его контекст - имеет ли кнопки, ссылки и другие атрибуты.

alert: Выводит аварийный бокс с сообщением.

confirm: Выводит диалоговый бокс с кнопками OK и Cancel.

prompt: Выводит диалоговый бокс с текстовым полем для ввода значения.

blur и focus: Убирает или дает фокус окну.

scroll: Скроллирует окно к указанной координате.

setTimeout: Оценивает выражения после указанного времени

window имеет также два свойства, которые могут быть полезны:location и status. Можно направить клиента к другому URL. Например, следующее предложение направляет клиента к домашней странице Netscape, как будто он воспользовался гиперссылкой или загрузил URL:

location = "http://home.netscape.com"

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

 

3.3.2 Объект document.

Поскольку write и writeln методы генерируют HTML, объект document- один из наиболее полезных объектов Navigator’а. Страница имеет только один объект класса document. Он имеет ряд свойств, которые отражают цвет фона, текста, и ссылок на странице: bgColor, fgColor, linkColor, alinkColor, и vlinkColor. Другие полезные свойства документа включают lastModified - дату последнего изменения документа, referrer- предыдущий URL, посещенный клиентом, и URL - URL самого документа. Объект document - предок для Anchor, Applet,Area, Form, Image, Link, and Plugin объектов в странице.

3.3.3 Объект Form.

Каждая форма в документе создает объект класса form. Поскольку документы можут содержать более, чем одну форму, они храняться в виде массива. Первая форма (верхняя в странице ) - form[0], вторая form[1], и так далее. То есть в дополнение к обращению к форме по имени, можно обращаться и с использованием индекса, например к первой форме в документе можно обратиться следующим образом:

document.forms [0]

Аналогично, элементы в форме, типа текстовых полей, радио-кнопок, и так далее, организованы в массивы элементов. Так, можно обратиться к первому элементу (независимо от того, какой это элемент) в первой форме как

document.forms[0].elements[0].

Каждый элемент формы имеет возможность сослаться на родительскую форму. Это осбенно полезно в программах- обработчиках событий, где можно обратиться к другому элементу текущей формы. В следующем примере, форма myForm содержит объект text и button. Когда пользователь нажимает кнопку, значение объекта text меняется на название формы. onClick программа- обработчик событий использует this.form, чтобы обратиться к родительской форме, myForm.

<FORM NAME="myForm">
Form name:<INPUT TYPE="text" NAME="text1" 
VALUE="Beluga">
<P>
<INPUT NAME="button1" TYPE="button" VALUE="Show Form 
Name" onClick="this.form.text1.value=this.form.name">
</FORM>

3.4 Использование окон и фреймов.

JavaScript позволяет создавать окна и фреймы и управлять ими, что необходимо для организации HTML-страниц. Объект window - самый верхний объект в иерархии клиентов JavaScript; frame- похожие на window объекты, но соответствуют “подокнам”, созданным с тегом FRAME в разделе FRAMESET.

3.4.1 Открытие и закрытие окон.

Окно создается автоматически, когда запускается Navigator; можно открыть другое окно, выбирая New Web Browser от меню File. Можно также открыть и закрыть окно программно с помощью JavaScript. Открытие окна. Можно создать окно с помощью метода open. Следующий оператор создает окно, называемое msgWindow, которое выводит содержимое файла sesame.html:

msgWindow=window.open("sesame.html")

Еще один пример: создается окно, которое называется homeWindow, которое выводит домашнюю страницу Netscape:

homeWindow=window.open("http://home.netscape.com")

Окна могут иметь два имени. Следующий оператор создает окно сдвумя именами. Первое имя msgWindow, можно использо- вать для определения свойств окна, его методов, второе имя displayWindow, может использоваться для указания форм:

msgWindow=window.open("sesame.html","displayWindow")

Имя окна не требуется при его создании. Но, если необходимо обратиться к нему из другого окна, то имя обязательно. Когда окно открывается, можно определить его высоту и ширину, указать содержит ли окно toolbar - линейку с набором кнопок для управления, location - строку, в которой выводится URL текущей страницы, или scrollbars - средство для скроллинга. Следующий оператор создает окно без toolbar, но с scrollbars:

MsgWindow=window.open ( "sesame.html", "displayWindow",
"toolbar=no, scrollbars=yes " )

Закрытие окна. Можно закрыть окно с помощью метода close. Нельзя закрыть frame без закрытия родительского окна. Каждое из следующих утверждений закрывает текущее окно:

Window.close ( ) 
self.close ( )
// нельзя использовать следующий оператор в программе-обработчике событий
close()

Следующей оператор закрывает окно, названное msgWindow

msgWindow.close()

3.4.2 Использование фреймов.

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

Could not load image

Фрейм слева вверху, имеет имя listFrame; фрейм справа вверху, имеет имя contentFrame; и фрейм внизу, имеет имя navigateFrame. Верхние фреймы занимают 90% высоты, левый фрейм занимает 30% ширины.

<FRAMESET ROWS="90%,10%">
   <FRAMESET COLS="30%,70%">
      <FRAME SRC=category.html NAME="listFrame">
      <FRAME SRC=titles.html NAME="contentFrame">
   </FRAMESET>
   <FRAME SRC=navigate.html NAME="navigateFrame">
</FRAMESET>

Следующая диаграмма показывает иерархию фреймов.

Все три фрейма имеют одного и того же родителя, несмотря на то, что два из них определены в отдельном frameset. Это потому, что родитель фрейма - родительское окно, a не frameset.

Вершина | +---- listFrame (category.html) | +---- contentFrame (titles.html) | +---- navigateFrame (navigate.html)

К предыдущим фреймам можно обратиться следующим образом. ListFrame - top.frames [0] contentFrame - top.frames [1] navigateFrame -top.frames [2]

Пример 2. Можно создать образ экрана подобно предыдущему примеру, но два верхних фрейма будут иметь родителя отдельно от navigateFrame.

<FRAMESET ROWS="90%,10%">
   <FRAME SRC=muskel3.html NAME="upperFrame">
   <FRAME SRC=navigate.html NAME="navigateFrame">
</FRAMESET>

В этом FRAMESET определяются верхний и нижний фреймы, у которых родителем будет окно. Файл muskel3.html содержит следующую информацию:

<FRAMESET COLS="30%,70%">
   <FRAME SRC=category.html NAME="listFrame">
   <FRAME SRC=titles.html NAME="contentFrame">
</FRAMESET>

Следующая диаграмма показывает иерархию структур. UpperFrame и navigateFrame имеют родителем окно верхнего уровня, для ListFrame и contentFrame родителем является upperFrame.

 Вершина
    |
    |                              +--listFrame (Category.html)
    |                              |
    +--upperFrame (Muskel3.html) --+
    |                              |
    |                              +--contentFrame (Titles.html)
    +--navigateFrame (Navigate.html) 

Можно обратиться к предыдущим фреймам следующим образом:

 UpperFrame - top.frames [0]
 navigateFrame - top.frames [1]
 listFrame - upperFrame.frames [0] или Top.frames [0] .frames [0] 
 contentFrame - upperFrame.frames [1] или top.frames [0] .frames [1]

3.4.3 Обновление фреймов

Можно изменять содержимое фреймов, используя свойство location, для установки нового URL. Например предположим, что мы хотим позволить пользователю закрывать все фреймы, и видеть только аннотации учебников. В этом случае необходимо добавить следующую клавишу в navigateFrame:

<INPUT TYPE="button" VALUE="Titles Only"
   onClick="top.location='annotation.html'"> 

Когда пользователь нажмет эту клавишу, файл annotation.html загрузиться в текущее окно, а фреймы navigateFrame, listFrame и contentFrame закроются и больше не существуют. Пример создания и обновления фреймов. Предположим, что:

-файл category.html, загружается во фрейм listFrame, содержит список авторов учебников, рассортированных по категориям.

-файл titles.html, загружается во фрейм contentFrame, содержит алфавитный список авторов и названия учебников.

-файл navigate.html, загружается во фрейм navigateFrame, содержит гипертекстовые ссылки, пользователь может выбрать способ вывода авторов - по алфавиту или по категориям. Этот файл содержит также гипертекстовые ссылки, для того чтобы пользователь мог вызвать описание каждого учебника.

В дополнительном файле alphabet.html содержится список авторов учебников, отсортированных по алфавиту. Этот файл выводится в listFrame, когда пользователь выбирает ссылку для алфавитного списка. Файл category.html может выглядеть следующим образом:

<P><FONT SIZE=+4>Каталог:</FONT></P>
<P>Физика</P>

<LI><A HREF=titles.html#0005 
TARGET="contentFrame">Дж.Орир</A>
<LI><A HREF=titles.html#0001 
TARGET="contentFrame">В.Демкович</A>
<LI><A HREF=titles.html#0002 
TARGET="contentFrame">В.Зубов</A>
<LI><A HREF=titles.html#0010 
TARGET="contentFrame">В.Шальнов</A>
<P>Математика</P>

<LI><A HREF=titles.html#0011 
TARGET="contentFrame">М.Сканави</A>
<LI><A HREF=titles.html#0003 
TARGET="contentFrame">А.Кутасов</A>
<LI><A HREF=titles.html#0012 
TARGET="contentFrame">Т.Яковлева</A>

<P>Информатика</P>

<LI><A HREF=titles.html#0006 
TARGET="contentFrame">Ю.Семенов</A>
<LI><A HREF=titles.html#0004 
TARGET="contentFrame">П.Нотон</A>

Файл alphabet.html :

<LI><A HREF=titles.html#0001 
TARGET="contentFrame">В.Демкович</A>
<LI><A HREF=titles.html#0002 
TARGET="contentFrame">В.Зубов</A>
<LI><A HREF=titles.html#0003 
TARGET="contentFrame">А.Кутасов</A>
<LI><A HREF=titles.html#0004 
TARGET="contentFrame">П.Нотон</A>
<LI><A HREF=titles.html#0005 
TARGET="contentFrame">Дж.Орир</A>
<LI><A HREF=titles.html#0006 
TARGET="contentFrame">Ю.Семенов</A>
...

Файл navigate.html;

 
<A HREF=alphabet.html TARGET="listFrame"> 
<B>Алфавитный</B></A>
<A HREF=category.html TARGET="listFrame"> <B>По предме-
там</B></A>
<A HREF=annotation.html TARGET=_parent> 
<B>Аннотация</B></A>
<FORM NAME="form1">
<INPUT TYPE="button" VALUE="Titles Only" 
onClick="top.location='annotation.html'">
</FORM>

Файл titles.html;

 
<A NAME="0001"><H3>В.Демкович</H3></A>
<P>Сборник вопросов и задач по физике

<A NAME="0002"><H3>В.Зубов</H3></A>
<P>Задачи по физике

<A NAME="0003"><H3>А.Кутасов</H3></A>
<P>Пособие по математике

<A NAME="0004"><H3>П.Нотон</H3></A>
<P>Пособие по JAVA

<A NAME="0005"><H3>Дж.Орир</H3></A>
<P>Физика

...

Работающую иллюстрацию этого примера можно посмотреть по кнопке

<>

Замечание относительно использования имен окна и фрейма. Имя, которое используется для обращения к окну, зависит от того является ли обращение к свойствам окна, его методам и программам-обработчикам или к окну, как содержащему форму и гипертекстовые ссылки. Что касается свойств окна, его методов, и программ- обработчиков для текущего окна или любого другого (если оно имеет имя), то можно воспользоваться следующими методами:

- self или window: это синонимы для текущего окна, например можно закрыть текущее окно оператором window.close() или self.close().

- top или parent: top и parent также синонимы, top ссылается к самому верхнему окну Navigator’а, а parent можно использовать для навигации по frameset.Например, оператор parent.frame2.document.bgColor="teal" изменяет цвет фона для фрагмента frame2; где frame2 имя фрейма в текущем frameset.

- переменная окна: Эта переменная получает значение, когда окно открывается. Например оператор msgWindow.close() закрывает окно, имеющее имя msgWindow.

- опускание имени окна: когда, используются операции с окном, без указания его имени, подразумевается текущее окно. Например close() закрывает текущее окно. Однако. когда вы открываете или закрываете окно внутри обратотчика событий, использование имени окна обязательно, поскольку, например, ис- пользование close() эквивалентно document.close().

Пример 1: ссылка на текущее окно. Следующий оператор проверяет checkbox у формы myForm в текущем окне и выводит аварийный бокс, если checkbox выбран.

if (document.myForm.checkbox1.checked) {
      alert('The checkbox on the myForm is checked!')}

Пример 2: ссылка на другое окно. Следующие операторы обращаются к форме, названной youForm в окне, названном checkboxWin. Несмотря на то, что значения объекта изменяются в checkboxWin, текущее окно остается активным.

// Определяем выбран ли бокс
if (checkboxWin.document.youForm.checkbox2.checked) {
 alert(' checkbox формы youForm окна checkboxWin выбран!')}
// установка checkbox
checkboxWin.document.youForm.checkbox2.checked=true
// Проверить, установлены ли опции выбранного объекта
if (checkboxWin.document.youForm.youTypes.options[1].selected)
   {alert('Option 1 is selected!')}
// установить первую опцию выбранного объекта
checkboxWin.document.youForm.youTypes.selectedIndex=1

Пример 3: обращение к фрейму в другом окне. Следующий оператор обращается к фрейму frame2, который находится в окне window2. Оператор изменяет цвет фона в фрейме frame2.

window2.frame2.document.bgColor="violet"

3.4.4 Использование имени окна.

Имя окна (не переменная окна) используется, когда необходимо сослаться на окно, как на цель в форме (аттрибут TARGET для FORM) или по гипертекстовой ссылке ( тег А).

Пример 1. При нажатии на кнопку создается пустое второе окно, в которое по ссылке загружается файл doc2.html, и создается кнопка для закрытия второго окна.

<P>
<INPUT TYPE="button" VALUE="Open window2" 
onClick="msgWindow=window.open('','window2', 
'resizable=no,width=200,height=200')">
<P>
<A HREF="doc2.html" TARGET="window2">
 Load a file into window2</A>
<P>
<INPUT TYPE="button" VALUE="Close window2"
          onClick="msgWindow.close()">

Пример 2: Создается гипертекстовая ссылка на якорь во втором окне. Связь показывает якорь, названный numbers, в файле doc2.html. Если окно window2 не существует, оно создается.

<A HREF=doc2.html#numbers 
TARGET="window2">Numbers</A>

Пример 3: Создается гипертекстовая ссылка на якорь abs_method из файла sesame.html во фрейме contentFrame. Фрейм должен быть внутри текущего набора фреймов и его имя должно быть определено в аттрибуте NAME тега FRAME

<A HREF=sesame.html#abs_method TARGET="contentFrame"> 
abs</A>

3.5 Навигация среди окон и фреймов.

Навигация среди фреймов аналогична навигации среди окон. Может быть открыто одновременно несколько окон Navigator'а. Пользователь может путем нажатия кнопки мыши сделать окно активным или передать ему фокус. Когда окно получает фокус, оно выводится на первый план и, кроме того, меняется цвет заголовка окна. Можно передать фокус окну и программно, передавая фокус объекту окна или специфицируя окно в гипертекстовой ссылке.

Пример 1: передача фокуса объекту в другом окне. В следующих операторах передается фокус объекту класса text, который называется city, в окно, названное checkboxWin, предварительно это окно создается.

checkboxWin=window.open("doc2.html")
...
checkboxWin.document.musicForm.city.focus()
...

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

<A HREF=»doc2.html» TARGET=»window2»> Load a file into window 2</A> 

 
Назад
 

Rambler's Top100 Rambler's Top100
YarTop support