Файл: Программирование клиентской части Интернет приложений с использованием JavaScript.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 01.12.2023

Просмотров: 98

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

document.write("<br>Сегодня <b>", time(), <br> "<br>"); <br>//--> <br> 19 20 5. Повторите упражнение 3, но только отсчет интервала времени следует вести от момента завершения обработки страницы браузером. Урок 3. Переменные и литералы Реализация JavaScript является примером языка свободного использования типов. Тип переменной зависит от типа хранимых в ней данных, причем при изменении типа данных, меняется и тип переменной. JavaScript поддерживает следующие простые типы данных: 1. Числовой (целый и вещественный) 2. Строковый 3. Булевый, или логический Сложные (ссылочные) типы данных: 1. Объектный 2. Массив Специальные типы данных: 1. null 2. undefined Числовой тип В языке JavaScript целые и вещественные числа не различаются — внутренне они представляются числами в формате плавающей точки. Используется стандарт IEEE 754 представления вещественных чисел в восьмибайтном формате чисел с плавающей точкой. Диапазон изменения абсолютных значений: от 5∙10-324 до 1.7976931348623157∙10 308Целые литералы 123, -123, +678 // целое: десятичные числа 0123, -0123, +0677 // целое: восьмеричные числа 0x18F, -0X8A, +0xAA // целое: положительное число Вещественные литералы 1.25 0.125е01 12.5Е-1 0.0125Е+2 Ошибка: 00.234 (начинается с нуля, а, следовательно, является восьмеричным целым и точки в литерале быть не должно) Специальные числовые литералы 1. NaN (Not a Number — не число) используется в качестве результата арифметических операций над строками и специальным значением undefined. 2. Infinity и -Infinity используются для значений чисел, выходящих за допустимый диапазон их изменения в JavaScript. 21 Строковый тип Строковое значение — последовательность ноль или более символов Unicode, которая используется в программе для представления текстовых данных. Строковые литералы В JavaScript строковые литералы можно задавать двумя равноправными способами — последовательность символов, заключенная в двойные или одинарные кавычки: "Анна" 'АННА' Один тип кавычек можно использовать в литерале, заданном другим типом кавычек: "It's a string" // значение строки равно It's a string "" // пустая строка В строковых литералах можно использовать ESC-последовательности, которые начинаются с символа обратной наклонной черты, за которой следует обычный символ. Некоторые подобные комбинации трактуются как один специальный символ: Esc-последовательности Символ \b Возврат на один символ \f Переход на новую страницу \n Переход на новую строку \r Возврат каретки \t Горизонтальная табуляция Ctrl-I \' Апостроф \" Двойные кавычки \\ Обратная наклонная черта ESC-последовательности форматирования "работают" при отображении информации в диалоговых окнах, отображаемых функциями alert(), prompt() и confirm(), а также если методом document.write() записывается содержимое элемента PPE. Булевый тип Имеет два значения — истина и ложь. Обычно значения этого типа используются в операторах принятия решения if и switch или в операторах цикла типа while. Булевы литералы Две лексемы true и false. Числовые значения в булевом контексте также трактуются как истина или ложь: 22 целый или вещественный нуль (0, 00, 0.0, 0e1), null и undefined трактуются как false; все остальные числовые значения рассматриваются как true. Строковые значения в булевом контексте также трактуются как истина или ложь: пустая строка "" трактуются как false; все остальные строковые значения рассматриваются как true. Специальные типы данных Тип данных null имеет одно значение null. Когда переменная имеет значение null, то это означает, что она "пуста" — ей не присвоено никакого значения допустимого типа. Присваивание переменной значения null не уничтожает ее, но просто делает ее переменной, не содержащей значения любого допустимого типа данных: числового, строкового, булевого, объектного или массива. Значение null трактуется как 0 в арифметических операциях и false в логических, но оно не равняется 0 (как в С и С++). Операция typeof для специального типа null возвращает Object (из-за совместимости с предыдущими версиями JavaScript). Тип данных undefined имеет единственное значение undefined, которое присваивается переменной в двух случаях: 1. переменная объявлена, но ей еще не присвоено никакое значение; 2. при попытке обратиться к несуществующему свойству объекта. В булевом контексте значение undefined трактуется как false, а в арифметическом как NaN. Нельзя сравнивать со значением undefined (такого просто не существует), но следует использовать операцию typeof, возвращающую тип undefined. Переменные Каждая переменная задается своим идентификатором — последовательностью буквенно-цифровых символов, начинающуюся с буквы (символ подчеркивания относится к букве): Temp1 MyFunction _my_Method Определить переменную можно двумя способами: оператором var; оператором присваивания. Оператор var используется как для задания, так и для инициализации переменной и может располагаться в любом месте сценария: var имя_переменной [= начальное_значение]; var weekDay = "Пятница"; 23 Оператор присваивания, составленный из единственной операции присваивания, для которой используется символ =, также может вводить новую переменную в любом месте сценария, а также он используется для изменения значения уже созданной переменной. В выражениях все переменные должны быть объявлены либо оператором var, либо в операторе присваивания. В противном случае будет сгенерирована ошибка, что отсутствует определение соответствующей переменной. Динамическое изменение типа переменной По ходу выполнения сценария переменной могут присваиваться разные значения, меняя, таким образом, ее тип: var weekDay // переменная определена, но не инициализирована // она имеет специальное значение undefined weekDay = "Пятница"; // Строковый тип weekDay = 5; // Целый тип Определение типа переменной Унарная операция typeof позволяет определить тип переменной, т. е. определить тип величины, хранящейся в данный момент в переменной. Синтаксис ее имеет вид: typeof(переменная) typeof переменная Эта операция возвращает одну из шести строк, соответствующих возможным типам данных JavaScript: "number" "string" "boolean" "undefined" "object" "function" Упражнения 1. Написать сценарий, который при загрузке страницы HTML в браузер методом document.write() формирует на странице элемент PRE и его содержимое в виде трех строк текста, в которых слова отделены символами табуляции. Это действие реализовать в одном вызове метода document.write(). 2. Написать сценарий, который после загрузки страницы отображает в диалоговом окне, создаваемом функцией alert(), три строки сообщения. 24 3. Проверить соответствие булеву значению false значений 0, 00, 0.0, 0e1, null, undefined, +1, -1.1, "", "0", "undefined", "xxxx". Для этого создать переменные с указанными значениями и распечатать, например, функцией alert(), результат вычисления выражения !v, где v является идентификатором переменной с одним из указанных значений. 4. Написать сценарий, в котором одной и той же переменной присваиваются разные значение. После изменения значения переменной распечатать ее тип (результат выполнения операции typeof). Урок 4. Выражения и операции Выражение – это комбинация переменных, литералов и операций, в результате вычисления которой получается одно единственное значение. Переменные в выражениях должны быть инициализированы либо в операторе var, либо оператором присваивания. Если при вычислении выражения встречается неинициализированная или вообще не определенная переменная, то в Internet Explorer версий меньше 6.0 интерпретатор генерирует ошибку "undefined variable" ("переменная не определена"), указывая ее местоположение на странице HTML. В Internet Explorer 6.0 ситуация с использованием в выражении неинициализированной переменной была приведена к стандарту — такая переменная, а с ней и все арифметическое выражение принимает значение NaN, трактуемое в булевом контексте как false, а в строковых операциях как строка "NaN", но при использовании необъявленной переменной интерпретатор генерирует ошибку "определение отсутствует". Присваивание является операцией, которая не только присваивает левому операнду значение правого, но и вычисляется равным значению выражения правой части. Таким образом, любая конструкция с операцией присваивания рассматривается как выражение. Кроме выражения присваивания в JavaScript определены еще три типа выражений: арифметическое — вычисляемым значением является число; строковое — вычисляемым значением является строка; логическое — вычисляемое значение равно true или false. Арифметические операции Операция Смысл + Сложение - Вычитание * Умножение / Деление (1/2=0.5) 25 % Остаток от деления чисел (12%5.1=1.5999999999999996) ++ Увеличение на 1 (префиксная и постфиксная) -- Уменьшение на 1 (префиксная и постфиксная) Пример: speed = 5.5; time = 4; distance = speed * time; distance = (speed ++)*time; Арифметические операции в выражении вычисляются слева направо с учетом общепринятого их математического старшинства. Скобками можно изменить порядок выполнения арифметических операций в выражении. Логические выражения Для создания логических выражений используются операции сравнения и логические операции, применяемые к переменным любого типа. Операции сравнения Операция Синтаксис Описание == a == b Истина, если оба операнда равны === a === b true, если значения операндов равны и сами операнды одного типа != a != b Не равно !== a !== b true, если значения операндов не равны и/или они не одного типа >= a >= b Больше или равно <= a <= b Меньше или равно > a > b Строго больше < a < b Строго меньше Логические операции Операция Синтаксис Описание && a && b логическое И Возвращает a, если оно преобразуется к false, иначе b || a || b логическое ИЛИ Возвращает a, если оно преобразуется к true, иначе b ! !a логическое НЕ Если a равно true, возвращает false; если a 26 равно false, возвращает true Вычисляются по укороченной схеме — если результат операции становится известным после вычисления первого операнда, то второй операнд вообще не вычисляется. В следующих выражениях второй операнд вычисляться не будет, так как результат их вычисления уже определен значением первого операнда вне зависимости от значения второго: false && операнд2 // всегда равно false true || операнд2 // всегда равно true Битовые логические операции Операция Синтаксис Описание И a & b Результирующий бит равен 1, если оба равны 1, иначе 0 ИЛИ a | b Результирующий бит равен 1, если хотя бы один бит равен 1 Исключающее ИЛИ a ^ b Результирующий бит равен 1, если хотя бы один бит равен 1, но не оба одновременно Отрицание a Инвертирует биты Смещение влево a << n Сдвигает все биты влево на n позиций, добавляя справа нулевые Смещение вправо a >> n Сдвигает все биты вправо на n позиций, используя значение знакового бита для заполнения "освобождаемых" слева битов Смещение вправо с заполнением нулями a >>> n Сдвигает все биты вправо на n позиций, заполняя "освобождаемые" слева биты нулями Строковые операции Существует только одна строковая операция – операция конкатенации (соединения) строк +, если не считать сокращенной формы операции присваивания со сложением += и сравнения строк. string = "Моя" + "строка"; // string равно "Моястрока" Операция конкатенации строк может использоваться со смешанными типами операндов. Все операнды приводятся к строковому типу, если хотя бы один из операндов содержит строковый литерал. "Май" + 2.003е3 результат "Май2003", "Май" + t результат "Майtrue", если переменная t содержит булево значение true. "1"+"1.1" результат "11.1" "1"+1.1 результат "11.1" 27 Комбинированные операции присваивания Под комбинированными операциями присваивания понимаются операции, совмещающие выполнение какой-либо определенной операции с одновременным присваиванием ее результата переменной, определяемой первым операндом. Общий синтаксис подобных комбинированных операций следующий: a OP= b, где OP заменяется на символ одной из рассмотренных ранее операций языка JavaScript. Операция Значение x *= y x = x * y x /= y x = x / y x += y x = x + y x -= y x = x - y x %= y x = x % y x <<= y x = x << y x >>= y x = x >> y x >>>= y x = x >>> y x &= y x = x & y x ^= y x = x ^ y x |= y x = x | y Условная операция Единственная операция в языке, требующая три операнда, причем первый операнд вычисляется в булевом контексте: (условие) ? операнд2 : операнд3; Семантика ее такова: если значение первого операнда-условия истинно, то возвращается вычисленное значение второго операнда, иначе третьего. Например, результатом выполнения следующего выражения будет присваивание переменной range строки "Пересдача", если значение переменной mark меньше или равно 2, в противном случае переменная range будет иметь значением строку "Зачтено": range = (mark <= 2) ? "Пересдача" : "Зачтено"; Приоритет операций В приводимой ниже таблице перечислены все операции JavaScript в нисходящем порядке. Операции с одинаковым приоритетом выполняются в выражении слева направо. Операции Описание . [] () Доступ к значению свойства объекта, вычисление 28 индекса массива, вызов функции и группирование в выражении ++ -- - ! delete new typeof void Унарные операции увеличения/уменьшения на единицу, вычисление числового содержимого с обратным знаком, побитовое инвертирование содержимого, логическое отрицание, удаление свойства объекта, создание объекта, получение типа данных, вычисление выражения, но возврат значения undefined * / % Умножение, деление, остаток от деления + - + Сложение, вычитание и конкатенация << >> >>> Битовые сдвиги < <= > >= instanceof Логические операции и операция проверки является ли данный объект экземпляром какого- либо объекта == != === !== Логические операция сравнения на равенство и неравенство & Побитовое AND ^ Побитовое XOR | Побитовое OR && Логическое AND || Логическое OR ?: Условная операция = OP= Присваивание и комбинированное присваивание , Операция последовательного выполнения Упражнения 0. Как определить целый тип числа. 1. Объявить в сценарии переменную var1 оператором var, не присваивая ей никакого значения, а переменную var2 не объявлять. Отобразить их содержимое функцией alert() и объяснить результаты. 2. Предложить способ сложения двух чисел, хранящихся в виде строковых литералов. Например, в выражении "2.1"+"3.0" будет выполнена операция конкатенации строк с результатом "2.13.0", а не сложение чисел, хранящихся в указанных строках. Задача состоит в том, чтобы получить число 5.1. 3. Можно ли в JavaScript определить, содержит ли переменная число или строку с литералом числа. Приведите, если это возможно, максимальное число способов проверки. 4. Чему будет равно значение переменной a после выполнения операторов: 29 а) var a=""; a && (a=true); б) var a="javascript"; a && (a="vbscript"); a || (a="javascript"); в) var b="1.1"; a = typeof b*0.1; б) var b="1.1"; a = typeof(b*0.1); Урок 5. Операторы Весь набор операторов языка можно разбить на три группы: операторы выбора, или условные; операторы цикла; операторы манипулирования с объектами. Операторы выбора Предназначены для организации ветвления в сценарии. Общий синтаксис следующий: if(условие) { операторы1 } [else { операторы2 } ] Обратите внимание, что группы операторов блоков if и else заключены в фигурные скобки, которые можно опускать, если группа представлена одним оператором: if(a == b) с = d else { с = e alert(c) } Семантика этого оператора такова: если проверяемое условие истинно, то выполняются операторы блока if, иначе блока else. Операторы выбора могут быть вложенными друг в друга. В этом случае рекомендуется использовать фигурные скобки всегда во избежание ошибок при интерпретации подобных сложных операторов. 30 Если необходимо проверять одно и то же выражение на равенство разным значениям, то эффективнее использовать не группу вложенных операторов ветвления, а оператор switch со следующим синтаксисом: switch (выражение){ case значение1 : [операторы1] [break;] case значение2 : [операторы2] [break;] [default :] [операторы] } Семантика его не отличается от подобных операторов в других языках программирования: выражение вычисляется и последовательно проверяется на равенство значениям, указанным в блоках case. Если равенство найдено, то выполняются операторы соответствующего блока case, если нет, то операторы блока default в случае его наличия. Необязательный оператор break, задаваемый в каждом из блоков case выполняет безусловный выход из оператора switch. Если он не задан, то продолжается выполнение операторов и в следующих блоках case до первого оператора break или до конца тела оператора switch. Операторы цикла Основное предназначение оператора for организовать циклическое выполнение группы операторов, если заранее известно количество итераций: for([инициал_выражение];[условие];[изменяющее_выражение]) { [операторы] } Инициализирующее выражение вычисляется один раз при входе в цикл. Изменяющее выражение предназначено для изменения значения переменной цикла, определяемой в инициализирующем выражении, и вычисляется каждый раз при переходе на очередную итерацию вместе с проверкой условия окончания выполнения цикла. Переменная цикла не может быть создана локальной (даже если использовать в инициализирующем выражении оператор var) — она будет доступна и после завершения работы цикла: for(var i=0; i < 10; i++){. . .}; a[i] = value; // переменная i равна 10 Если тело цикла состоит из одного оператора, то фигурные скобки, ограничивающее тело цикла, можно опустить. 31 Пример 4. Цикл for в сценарии JavaScript Создадим сценарий, который при загрузке документа вычисляет степени числа 2 и выводит в документ таблицу степеней двойки. 1   2   3   4   5   6   7   8   9   10   11

<b>Свойства объекта Math <br><b>Свойство Описание <br>E <br>Возвращает постоянную Эйлера <i>e — основание натурального логарифма. <br>LN2 <br>Возвращает натуральный логарифм числа 2. <br>LN10 <br>Возвращает натуральный логарифм числа 10. <br>LOG2E <br>Возвращает логарифм по основанию 2 постоянной Эйлера <i>e. <br> <div> <br>52 <br>LOG10E <br>Возвращает логарифм по основанию 10 постоянной Эйлера <i>e. <br>PI <br>Число π. <br>SQRT1_2 <br>Возвращает квадратный корень из 0.5. <br>SQRT2 <br>Возвращает квадратный корень из 2. <br><b>Объект String <br>Когда <a href="/zavisimoj-peremennoj-peremennoj-otklika-i-nezavisimoj-peremenn/index.html" title="Зависимой переменной (переменной отклика) и независимой переменной">переменной присваивается строковый литерал, она становится строковой переменной. На самом деле JavaScript создает встроенный объект String. Таким образом, любая строковая переменная или строковый литерал является объектом <br>String, к которому могут быть применены все методы этого объекта. <br>Хотя обычно в сценарии строка создается присваиванием переменной строкового литерала (а в этом случае создается и объект String), в JavaScript предусмотрен конструктор для этого типа объекта: имя_объекта = new String(строка); <br>Параметром конструктора является строковый литерал или переменная: myString = new String("Строка"); a = 2.67; myNumber = new String(a); // myNumber = "2.67" <br>Объект String имеет единственное свойство length, хранящее длину строки, содержащейся в строковом объекте, т. е. количество символов в строке. <br>И "Строка".length, и myString.length возвращают одинаковые значения <br>6, равные в первом случае длине строкового литерала, а во втором случае длине строки, содержащейся в строковом объекте. <br>Объект String имеет два типа методов: первые возвращают отформатированный <br>HTML-вариант строки, а вторые выполняют некоторые действия над содержимым строки. <br>Методы, возвращающие HTML-отформатированные варианты строк, возвращают строки, заключенные в открывающий и закрывающий теги определяемого методом элемента HTML. Например, следующий оператор вставляет в страницу <br>HTML гиперсвязь с ресурсом, расположенным по адресу, задаваемому параметром метода link строки: document.write(s.link("http://www.altavista.com")); <br>В документе отобразится содержимое строкового объекта s, представленное как гиперссылка на ресурс, заданный параметром метода. <br><b>Методы объекта String <br>anchor(name) <br>Возвращает строку, заключенную в теги HTML <br><a> и , и устанавливает атрибут name элемента A равным значению параметра name. big() <br>Возвращает строку, заключенную в теги HTML <br> <div> <br>53 <br><BIG> и . blink() <br>Возвращает строку, заключенную в теги HTML <br><BLINK> и . bold() <br>Возвращает строку, заключенную в теги HTML <br><b> и . fixed() <br>Возвращает строку, заключенную в теги HTML <br><TT> и . fontcolor(colorValue) <br>Возвращает строку, заключенную в теги HTML и , и устанавливает атрибут <br>COLOR этого тега равным значению параметра colorValue. fontSize(sizeValue) <br>Возвращает строку, заключенную в теги HTML и , и устанавливает атрибут <br>SIZE равным значению параметра sizeValue. italics() <br>Возвращает строку, заключенную в теги HTML <br><i> и . link(href) <br>Возвращает строку, заключенную в теги HTML <br><a> и , и устанавливает атрибут HREF элемента A равным значению параметра href. small() <br>Возвращает строку, заключенную в теги HTML <br><SMALL> и . strike() <br>Возвращает строку, заключенную в теги HTML <br><STRIKE> и . sub() <br>Возвращает строку, заключенную в теги HTML <br><sub> и . sup() <br>Возвращает строку, заключенную в теги HTML <br><sup> и . charAt(index) <br>Возвращает символ, находящийся на указанном месте (с индексом равным index) в строке. Индексы начинаются с 0. charCodeAt(index) <br>Возвращает код символа <br>(Unicode), расположенного на указанном месте (с индексом равным index) в строке. Если в строке нет символа с указанным индексом, возвращается значение NaN. Индексы в строке начинаются с 0. concat(string2) <br>Возвращает строку, представляющую собой <br> <div> <br>54 результат объединения двух строк. <br>String.fromCharCode( char1,char2,...) <br>Возвращает строку, составленную из указанных символов, заданных кодом Unicode. <br>Количество параметров не ограничено. indexOf(substring, startindex) <br>Возвращает целое число – позицию первого вхождения подстроки substring в строку, начиная с позиции startindex. Если такой подстроки не найдено, возвращает –1. lastIndexOf(substring, startindex) <br>Возвращает целое число – позицию последнего вхождения подстроки substring в строку, начиная с позиции startindex. Если такой подстроки не найдено, возвращает –1. localCompare(string) <br>Сравнение строк в соответствии с локальными языковыми установками: -1 строка раньше параметра, 1 наоборот и 0 строки равны. match(regExpression) <br>Возвращает массив, состоящий из символов, соответствующих регулярному выражению regExpression. replace(regExpr, replaceString) <br>Возвращает строку, в которой фрагменты исходной строки, соответствующие образцу регулярного выражения regExpression, заменены на строку replaceString. search(regExpression) <br>Возвращает позицию первой подстроки, соответствующей регулярному выражению. <br>Если такая строка не найдена, то возвращает <br>-1. slice(start[, end]) <br>Возвращает часть строки, начиная с позиции start и заканчивая позицией end. Если аргумент end отсутствует, то возвращается строка от start до самого конца. split(separator) <br>Возвращает массив строк, созданный из подстрок, разделенных разделителем separator<br>Разделитель также может являться регулярным выражением. substr(start <br> [,length]) <br>Возвращает <a href="/reshenie-1-v10/index.html" title="Решение. 1">подстроку данной строки, которая начинается с символа в позиции start и имеет указанную длину length. Если длина не указана, то возвращается вся строка, начиная с позиции start. Если позиция символа превосходит число символов в строке, <br> <div> <br>55 то возвращается пустая строка. substring(start, end) <br>Возвращает подстроку данной строки, заданной начальной и конечной позициями. <br>Наименьшее из двух заданных значений используется в качестве начальной позиции выделяемой подстроки. <br>Если начальная позиция превосходит число символов в строке, то возвращается пустая строка. toLowerCase() <br>Возвращает строку, в которой все буквенные символы преобразованы в строчные. toUpperCase() <br>Возвращает строку, в которой все буквенные символы преобразованы в прописные. toString() <br>Преобразует объект в строку. <br><b>Объект Function <br>Любая функция в JavaScript является объектом типа Function. Создать функцию можно не только конструкцией function, но и с помощью конструктора Function: var имя_функции = new Function([argname1, [... argnameN,]] тело_функции) <br>Все параметры являются строками. Сначала определяется список формальных параметров, а потом строка, содержащая операторы тела функции. <br>Пример задания функции с одним числовым параметром, возвращающей произведение этого числа на число π: var nPI = new Function("n", <br>"if(typeof n != 'number'){l=null}else{l= n*Math.PI};return l;"); <br>// вызов объявленной функции nPI nPI(56); <br>В JavaScript часто используется тот факт, что функция является объектом. Если вспомнить вызов метода сортировки массива, то, по-существу, параметром в нем является ссылка на функцию. Так что избегайте записывать вызов функции (или метода объекта) без круглых скобок. В JavaScript запись "вызова" функции без круглых скобок не является синтаксической ошибкой, но всего лишь ссылка на объект Function, которая часто используется для задания функции обработки событий объектов, соответствующих элементам HTML отображаемого в браузере документа. <br><b><span id='Свойства_объекта_Function'>Свойства объекта Function аrguments <br>Объект, хранящий переданные в функцию фактические параметры. Он не является массивом, но доступ к хранящимся в нем фактическим параметрам осуществляется как к элементу <br> <div> <br>56 массива с использованием целочисленного индекса, который изменяется от нуля и далее. caller <br>Возвращает ссылку на объект Function, представляющий функцию, вызвавшую исходную. Если свойство имеет значение null<br>, то функция вызвана из верхнего уровня сценария, а не из другой функции. callee <br>Возвращает ссылку на саму себя. Является свойством объекта arguments функции, а не самой функции. length <br>Возвращает количество обязательных параметров, которые следует передавать в функцию при ее вызове, т. е. тех параметров, которые определены в объявлении функции. <br>Все свойства объекта Function становятся доступными только тогда, когда функция, определяемая этим объектом, выполняется. Поэтому доступ к ним возможен только из тела функции. <br>Следующая функция проверяет количество переданных в нее при вызове фактических параметров и возвращает строку, содержащую требуемое количество обязательных параметров и количество фактически параметров было в нее передано. function ArgTest(a, b){ var i, s = "Обязательных параметров "; var numargs = ArgTest.arguments.length; var expargs = ArgTest.length; s += expargs + ". Передано " + numargs + "."; return(s); <br>} <br><b>Объект Boolean <br>Является объектным интерфейсом для типа данных Boolean. Создается неявным образом, когда булевый тип преобразуется к объекту, но может быть создан явно с помощью конструктора Boolean(): var b = new Boolean([параметр]); <br>В <a href="/zanyatie-po-teme-podbor-parametra-i-optimizaciya-poisk-resheni/index.html" title="Занятие по теме: «Подбор параметра и оптимизация (поиск решений) в Excel»">случае отсутствия параметра, или если он равен 0, NaN, false, null или пустой строке "", значение объекта есть ложь, иначе истина. <br>Объект Boolean используется достаточно редко. <br><b>Объект Number <br>Является объектным интерфейсом для числового типа данных. Создается неявным образом, когда числовой тип преобразуется к объекту, но может быть создан явно с помощью конструктора Number(): var b = new Number(числовое_значение); <br><b>Свойства объекта Number <br> <div> <br>57 <br>NaN <br>Специальное числовое значение, указывающее на то, что вычисление арифметического выражения не привело к числовому результату. <br>MAX_VALUE, <br>MIN_VALUE <br>Максимальное число и минимальное число, представимые в JavaScript. <br>POSITIVE_INFINITY, <br>NEGATIVE_INFINITY <br>Положительная и отрицательная бесконечность <br>(бесконечно большие числа). <br>Для получения значения указанных свойств не надо создавать объекта Number, а непосредственно обращаться к имени конструктора объекта (аналоги свойств класса в языках С++ и Java): <br>Number.NaN <br>Number.MAX_VALUE <br><b>Методы объекта Number toExponential(точность) <br>Возвращает строку, представляющую экспоненциальную форму числа с заданным количеством цифр в дробной части. toFixed(точность) <br>Возвращает строку, представляющую число в форме с фиксированной точкой с заданным количеством цифр в дробной части. toPrecision(точность) <br>Возвращает строку, представляющую число в форме с фиксированной точкой с заданным количеством цифр мантиссе. <br>Число 1760/7, хранящееся в переменной a, методом a.toExponential(10) преобразуется в строку 2.5142857143e+2 a.toFixed(10) преобразуется в строку 251.4285714286 a.toPrecision(10) преобразуется в строку 251.4285714 <br>Объект Number используется достаточно редко. <br><b>Упражнения <br>1. Стек — динамическая структура, строящаяся по принципу "последним пришел первым ушел". Ее можно сравнить со стопкой тарелок — чтобы взять нижнюю тарелку (она была самой первой тарелкой в растущей стопке), следует поочередно снять все позже поставленные тарелки. Самая последняя добавленная в стопку тарелку в то же время является и самой первой, до которой возможен доступ. <br>Реализуйте стек с помощью массива JavaScript, написав четыре функции — создание стека, помещение в него элемента, извлечение последнего добавленного элемента и извлечение <i>к-ого элемента стека. Реализовать два варианта — стек "растет" от конца массива (первый элемент стека хранится в первом элементе массива) и стек "растет" от начала массива (первый элемент стека хранится в последнем элементе массива). <br> <div> <br>58 2. Отсортировать массив, хранящий строковые значения, по возрастанию количества символов в элементах. Элементы, содержащие строки с одинаковым числом символов сортировать в лексикографическом (алфавитном) порядке. <br>Сделать то же самое, но по убыванию, причем элементы со строками одинаковой длины сортировать в обратном лексикографическом порядке. <br>3.Для трехмерного массива разработать функцию получения его произвольных сечений (двумерных и одномерных). Под сечением многомерного массива понимается массив меньшей размерности, являющейся подструктурой исходного. <br>Например, в двумерном массиве можно выделить одномерные подструктуры строк и столбцов, в трехмерном двумерные плоскости и одномерные строки. <br>4. Отобразить на странице HTML календарь на текущий месяц в виде следующей таблицы: ноябрь <br>Пн <br>3 10 17 24 <br>Вт <br>4 11 18 25 <br>Ср <br>5 12 19 26 <br>Чт <br>6 13 20 27 <br>Пт <br>7 14 21 28 <br>Сб 1 8 15 22 29 <br>Вс 2 9 16 23 30 5. Разработать функцию, подсчитывающую количество вхождений подстроки в заданную строку. Например, подстрока "qr" входит два раза в строку "qrqqr", а подстрока "q" три раза. Для ввода строки и подстроки использовать однострочное текстовое поле формы; для вывода количество вхождений также однострочное текстовое поле. Вызов функции подсчета осуществляется нажатием кнопки формы. <br>6. Отобразить таблицу значений функции exp(x) на интервале [0,5] с шагом 0,5. <br>Значения функции должны отображаться с пятью знаками после запятой. <br><b><span id='Урок_8_Встроенные_объекты_(2)_Объект_Object'>Урок 8 Встроенные объекты (2) <br><b>Объект Object <br>Расположен во главе всей иерархии объектов JavaScript. Любой объект JavaScript является наследует все его свойства и методы. Для создания объекта Object используется конструктор Object() с единственным необязательным параметром: var obj = new Object([значение]) <br>Если параметр конструктора не задан, то создается объект без значения. Если же он задан, то может быть любым из поддерживаемых JavaScript типов данных — <br> <div> <br>59 числовым, булевым или строковым. Если этот параметр является объектом, то возвращается неизмененным этот же объект (свойство constructor возвращает ссылку на конструктор объекта, а вот операция typeof будет возвращать строку "object"<br>, а не строку с типом объекта-параметра). Значения null и undefined этого параметра приводят к созданию объекта без содержимого. <br><b><span id='Свойства_объекта_Object'>Свойства объекта Object <br>constructor <br>Хранит ссылку на функцию-конструктор, с помощью которой создан экземпляр объекта. prototype <br>Возвращает ссылку на прототип класса объектов. Изменять прототип встроенных объектов нельзя, тогда как пользовательских можно. Это свойство "класса", а не экземпляра, поэтому оно применяется не к экземпляру объекта, а к его конструктору Object. propertyIsEnumerable(имя) <br>Логическое свойство, возвращающее true<br>, если указанное в качестве параметра свойство объекта существует и доступно при переборе свойств в цикле for...in. <br>Используя свойство constructor, которое наследуется также и всеми объектами JavaScript, можно проверить его принадлежность классу объектов. <br>Сравнивать значение этого свойства надо с конструктором соответствующего объекта (просто имя конструктора). Для пользовательского объекта этим именем является имя соответствующей функции-конструктора (см. урок 9), а для встроенных объектов следующие ключевые слова — String, Date, Function, <br>Array, Boolean, Number, Object: var str = "xxxxxx"; var obj = new Object(); <br>(str.constructor == String) ? true : false; // true <br>(obj.constructor == String) ? true : false; // false <br>(obj.constructor == Object) ? true : false; // true <br>Свойство prototype позволяет добавлять свойства и методы к "классу" объектов. Оно наследуется также каждым объектом JavaScript (пользовательским или встроенным кроме объектов Global и Math). После добавления свойств и методов к прототипу создание объектов этого класса приводит к тому, что у всех объектов будут существовать добавленные свойства и методы. Так как все объекты "происходят" от объекта Object, то добавление свойств и методов к его прототипу приводит к созданию соответствующих свойств и методов у всех объектов JavaScript. <br><br><b><span id='Пример_10._Добавление_свойств_и_методов_ко_всем_объектам'>Пример 10. Добавление свойств и методов ко всем объектам <br> <div> <br>60 <br>Добавим к прототипу объекта Object метод, возвращающий строку с названиями и значениями всех свойств объекта. <br>Для этого прежде всего создадим функцию props(), выполняющую указанное действие. В JavaScript есть специальный цикл for...in, который предназначен для просмотра всех свойств объекта (встроенного или пользовательского). На каждом шаге цикла его переменная хранит имя свойства, а доступ к значению этого свойства можно получить, выполнив для объекта операцию индексации со строковым индексом, равным имени свойства. Например, к свойству constructor объекта obj класса Object можно обратиться не только с использованием точечной нотации obj.constructor, но и с помощью индекса "constructor" следующим образом obj["constructor"]. <br>(Это справедливо для любого объекта JavaScript.) function props() { var s = "" for(var i in this){ s += i + ': ' + this[i] + '<br>'; <br> } return s; <br>} <br>Здесь следует, забегая вперед, пояснить использование ключевого слова this в функциях JavaScript. Оно используется исключительно в функциях, реализующих методы объектов, и имеет смысл "этот объект". Когда добавляется новый метод к прототипу встроенного объекта, то в реализующей его функции следует каким-то образом ссылаться на экземпляр объекта, который впоследствии будет создан. <br>Именно ключевое слово this и реализует эту функциональность. Поэтому в нашей функции props() цикл будет осуществляться по всем свойствам экземпляра объекта, ассоциированный с этой функцией метод которого будет вызываться. А конструкция this[i] будет возвращать значение очередного свойства этого объекта. <br>Теперь остается добавить новое свойство к прототипу объектов класса Object. <br>Назовем его propList и присвоим ему ссылку на функцию props(): <br>Object.prototype.propList = props; <br>Обращаем внимание, что присваивается ссылка props на объект Function, а не вызов функции props()! <br>Создадим объект String: var s = "*********"; <br>Теперь он имеет метод propList(), и следующий оператор распечатает все свойства объекта s с их значениями в окне браузера: document.write(s.propList()) <br> <div> <br>61 <br>Внимание! Метод propList() вызывается как обычная функция. Если бы для выполнения реализующей его функции props() требовались параметры, то их следовало бы передать при вызове метода propList() объекта s. <br><br>Не все свойства объектов могут быть перечислены в цикле for...in. Для проверки доступности свойства в указанном цикле у объекта Object (и, естественно, у всех объектов JavaScript) есть логическое свойство propertyIsEnumerable(имя)<br>, определяющее доступность свойства в цикле for...in. Имя свойства передается как строка. Исключение — свойства массива, представляющие собой индексы эго элементов. В этом случае имя может быть передано в свойство propertyIsEnumerable как число, и как строка, содержащая число. Заметим, что все добавляемые пользователем к встроенным объектам свойства являются перечисляемые, тогда как их собственные встроенные свойства не все могут быть перечисляемыми. <br><b>Методы объекта Object <br>toString <br>Возвращает строку, представляющую заданный объект. valueOf <br>Возвращает примитивное значение заданного объекта. <br><b><span id='Стандартные_функции_верхнего_уровня_(объект_Global)'>Стандартные функции верхнего уровня (объект Global) <br>Объект Global создается автоматически и все его свойства и методы доступны как свойств и методы класса с одним исключением — не надо указывать имя класса, более того в JavaScript классическая конструкция вызова или обращения к свойству класса, например Global.Infinity, приведет к ошибке во время выполнения. <br><b>Свойства объекта Global <br>Infinity <br>Специальное числовое значение, эквивалентное бесконечности. <br>NaN <br>Специальное числовое значение, соответствующее "не числу". undefined <br>Неопределенное значение, которое имеет любая объявленная оператором var переменная пока ей не было присвоено никакого значения. <br><b>Методы объекта Global parseFloat(строка) <br>Анализирует значение переданного ей строкового параметра на соответствие представлению вещественного числа в JavaScript. Если в строке при последовательном просмотре обнаруживается символ, отличный от символов, применяемых для формирования вещественных литералов (знаки + и -, десятичные цифры, точка и символы (е) или <br>(Е)), то она игнорирует оставшуюся часть строки и возвращает то числовое значение, которое ею <br> <div> <br>62 обнаружено до неправильного символа. Если первый символ в строке не является цифрой, она возвращает значение NaN. parseInt(строка, <br>[основание]) <br>Пытается выделить из строки, начиная с первого символа, целое число по заданному вторым параметром основанию. Если первый символ в строке не является цифрой, соответствующей системе с основанием, указанным вторым параметром, она также возвращает значение NaN. isNaN(параметр) <br>Тестирует значение своего параметра на соответствие нечисловому значению. Если ее <a href="/rasskaz-m-samarskogo-sirota/index.html" title="Рассказ М. Самарского «Сирота»">параметр действительно оказывается не числом, она возвращает true, в противном случае false. isFinite(значение) <br>Определяет, является ли указанное значение конечным числом. Если значение не равно положительной или отрицательной бесконечности и не является NaN, то этот метод возвращает true. eval(строка) <br>Анализирует содержание строки и выполняет содержащийся в ней код JavaScript. Обеспечивает возможность динамического выполнения кода. escape(строка) <br>Кодирует строку в формат Unicode, преобразуя все пробелы, знаки препинания, символы с надстрочными знаками и некоторые другие символы в %xx (хх является шестнадцатеричным номер символа в таблице кодов ASCII), символы с номером больше 255 преобразуются в %uxxxx, где xxxx является кодом символа в формате <br>Unicode. unescape(строка) <br>Декодирует строку, закодированную функцией escape. encodeURI(URIстрока) <br>Кодирует текстовую строку таким образом, чтобы она представляла собой адрес URI, который можно передавать по сети в запросе к серверу <br>(выполняет так называемое URL-кодирование). <br>Символы :, ;, / и ? не кодируются. decodeURI(URIстрока) <br>Декодирует строку, закодированную функцией encodeURI. encodeURIComponent <br>(URIстрока) <br>В отличие от encodeURI кодирует и символы, используемые в адресе URI, т. е. выполняет полное <br>URL-кодирование адреса, включая <br> <div> <br>63 символы :, ;, / и ?. decodeURIComponent <br>(URIстрока) <br>Декодирует строку, закодированную функцией encodeURIComponent. <br>Функции parseFloat() и parseInt() полезны для преобразования в числовые значения данных, вводимых пользователем в текстовых полях формы, а также для преобразования значений свойств каскадных таблиц стилей элементов, если они используются в вычислениях, так как эти большинство числовых значений этих свойств хранятся в виде строки, содержащей число с размерностью, например, "100px". <br>Функция eval() полезна, когда, например, пользователь вводит в сценарий строку, представляющую код JavaScript, и ее следует интерпретировать в сценарии (см. упражнение 6). <br>Функции escape() и unescape() нельзя использовать для URL-кодирования и декодирования строки запроса клиента. Для этих целей следует использовать функции encodeURI() и decodeURI(), а также encodeURIComponent() и decodeURIComponent() (см. упражнение 7). <br><b><span id='Манипулирование_объектами'>Манипулирование объектами <br>Для работы с объектами в JavaScript предназначены два оператора. С одним из них мы познакомились в примере 10 — цикл по свойствам объекта: for( переменная_цикла in объект) { <br>[операторы] <br>} <br>Этот цикл осуществляет перебор всех свойств объекта. В переменной цикла на каждой итерации сохраняется название свойства объекта. Значение свойства объекта можно получить с помощью конструкции объект[имя_свойства] <br>Количество итераций равно количеству перечисляемых свойств, существующих у заданного в заголовке цикла объекта. <br><br><b><span id='Пример_11._Перечисление_свойства_объекта_HTML'>Пример 11. Перечисление свойства объекта HTML <br>Для обеспечения возможности доступа в сценарии к элементу HTML отображаемого в браузере документа с помощью объекта в язык HTML была добавлена возможность идентификации любого элемента страницы с помощью атрибута id. Его значением является алфавитно-цифровой идентификатор, начинающийся с буквы. По этому имени в сценарии JavaScript можно получить ссылку на объект, соответствующий указанному элементу HTML. В Internet <br>Explorer для этого достаточно указать это имя и автоматически ссылка будет получена. После чего можно получать или изменять значения свойств этого объекта, обычно соответствующих атрибутам элемента HTML, соответствующего этому объекту. Однако у всех объектов есть свойства, которые не соответствуют <br> <div> <br>64 никаким атрибутам. Эти свойства реализованы в соответствии с используемой в браузере объектной моделью документа. <br>В представленном ниже сценарии при щелчке на кнопке Свойства абзаца вызывается функция properties(), в которую передается ссылка на объект par1, соответствующий абзацу страницы HTML. Эта функция возвращает строку с названиями и значениями всех свойств объекта, соответствующего абзацу с атрибутом id=par1, которая отображается на странице HTML. <br><body> <br>Получить в сценарии доступ к объекту, соответствующему какому-нибудь элементу HTML страницы, можно с помощью значений его атрибутов <b>id или <b>name. <br><input type=button value="Свойства абзаца" onclick="document.write(properties(par1))"> <br><div> <br>65 result += id + "." + i + " = " + [i] + "<br>" <br>} <br>Полезно использовать этот оператор для объекта Math. Тогда обращение к его свойствам и методам осуществляется без явного указания префикса Math. <br>Например: with(Math) { r = sin(2.0) // Вычисление синуса l = 2*PI*r // Вычисление длины окружности <br>} <br><b>Обработка ошибок <br>При выполнении сценария могут возникать ошибки. Браузер Internet Explorer отображает их либо в диалоговом окне: <br>Это окно появляется тогда, когда в браузере установлен режим уведомления об ошибках сценария и запрещена их отладка на вкладке <b>Дополнительно окна его свойств: <br>Если в этом окне сброшен флажок Запретить отладку сценариев, то появляется диалоговое окно следующего вида, предлагающее выполнить отладку сценария с помощью какой-либо специальной программы: <br> <div> <br>66 <br>Если ответить <b>Да, то браузер предложит в диалоговом окне <b>Just-In-Time <br><b>Debugging выбрать программу отладки: <br>Возможна ситуация, когда в сценарии потребуется перехватить непредвиденные ошибки, возникающие во время выполнения, дабы предотвратить появление диалогового окна об ошибке. Для этого в JavaScript имеется достаточно простой механизм, реализуемый оператором try...catch...finally: try{ <br>// Код, в котором могут содержаться ошибки <br>} catch(e){ <br>// Обработчик ошибки <br>} finally{ <br>// всегда выполняемый код <br>} <br>Код сценария с потенциальными ошибками заключается в блок try. Если при выполнении кода возникают ошибки, то диалоговое окно браузера не появляется, а управление передается блоку catch, в котором и обрабатываются все ошибки. <br>Переменная е (произвольный идентификатор) в блоке catch будет содержать ссылку на объект Error, хранящий информацию об ошибке. Код блока finally выполняется всегда — возникла или не возникла ошибка. <br>У объекта Error имеется четыре свойства: <br> <div> <br>67 <br><b><span id='Свойство_Описание'>Свойство <br><b>Описание <br>name <br>Название ошибки (только чтение). message <br>Сообщение ошибки (только чтение). description <br>Описание ошибки. number <br>Содержит 32-битный код ошибки. Старшие два байта (для их выделения воспользуйтесь операцией e.number>>16 & 0x1FFF<br>) содержат вспомогательный код, младшие (для их выделения воспользуйтесь операцией e.number & 0xFFFF<br>) код ошибки. <br><br><b><span id='Пример_12._Обработка_ошибок_При_загрузке_следующей_страницы_сценарий_отображает_диалоговое_окно_с_подтверждением_распечатать_свойства_объекта-абзаца_par1._Если_пользователь_отвечает_Да'>Пример 12. Обработка ошибок <br>При загрузке следующей страницы сценарий отображает диалоговое окно с подтверждением распечатать свойства объекта-абзаца par1. Если пользователь отвечает <b>Да, то возникает ошибка, так как к тому времени, когда в сценарии будет выполняться обращение к объекту par1, он еще не будет создан — тело документа к этому моменту еще не обработано. <br>Оператор if сценария заключен в блок try. Поэтому управление будет передано в блок catch, в котором будут распечатаны свойства сгенерированного объекта <br>Error — переменная e. При этом обязательно выполнится оператор блока finally. <br>Если пользователь отвечает <b>Нет, то ошибки не возникает, так как не будет обращения к объекту par1, операторы блока catch выполняться не будут, но блока finally выполнится обязательно. <br><script> reply = confirm("Распечатать содержимое абзаца par1?") try{ if(reply){ alert(par1.innerText); <br> } <br> }catch(e){ alert("Название ошибки: "+e.name + "\n"+ <br> "Сообщение ошибки: "+e.message + "\n"+ <br> "32-битный код ошибки: "+e.number+"\n"+ <br> "Вспомогательный код ошибки: "+ <br> (e.number>>16 & 0x1FFF) +"\n" + <br> "Истинный код ошибки: "+ <br> (e.number & 0xFFFF) +"\n" + <br> "Описание ошибки: "+e.description) <br> }finally{ <br> <div> <br>68 alert("Код блока finally выполняется всегда!") <br> } <br> Абзац с атрибутом id='par1'. 69 err.number = 801 err.description = "Не задан второй параметр."; // Генерирование ошибки throw err break; } // Возвращаемое значение функции return x+y; } // Обращение к функции add() с обработкой возможной ошибки try{ // функция add() сгенерирует ошибку с номером 801 alert(add(5)) } catch(e){ alert(e.description+"\n"+e.number) } Упражнения 1. Добавить метод propList() (пример 10) к прототипу объекта Object, а также добавить к прототипу этого же объекта свойство list со значением "Добавленное к прототипу Object". Проверить на объектах String, Date, Number, Function, Array, Boolean, действительно ли будут добавляться к экземплярам указанных объектов добавленные к прототипу объекта Object метод и свойство. 2. Добавить к прототипу объекта Array метод вычисления максимального элемента массива и посмотреть его работу на экземплярах объектов этого типа, содержащими только числовые элементы, только строковые и смешанные (числа и строки). 3. Создать массив, элементы которого хранят ссылки на все 6 типов встроенных объектов JavaScript. Случайным образом "перемешать" его элементы. После этого распечатать отчет о том, какие объекты хранятся в его элементах, начиная с первого. 70 4. Реализовать нижеприведенный сценарий. Проверить доступность свойств 0, 1, 2, 3 массива. Объяснить результаты. Поэкспериментировать с другими типами встроенных объектов. var a = new Array("apple", "banana", "cactus"); a["q"] = 9 document.write(a.propertyIsEnumerable("q")) 5. Отобразить на странице HTML таблицу, показывающую результаты выполнения методов toString и valueOf всех встроенных объектов JavaScript. 6. Разработать страницу HTML со встроенным сценарием, который получает введенный пользователем код JavaScript в текстовом поле страницы и выполняет его. Получить строку из текстового поля страницы HTML можно, используя свойство value объекта с идентификатором, равным значению атрибута name текстового поля fromText = txt1.value Интерпретацию строки можно организовать, используя кнопку 7. Написать сценарий, который кодирует строку, содержащую все небуквенные символы клавиатуры тремя возможными способами и отобразить результаты в виде таблицы: Символ escape encodeURI encodeURIComponent %20 %20 %20 ` %60 %60 %60 %7E ! %21 ! ! @ @ @ %40 # %23 # %23 Урок 9. Создание собственных объектов Объектная модель JavaScript отличается от объектных моделей других объектно- ориентированных языков тем, что в ней объекты создаются на основе прототипов. Для создания объектов в JavaScript можно использовать объектный литерал или специальным образом написанную функцию — конструктор объекта. 71 Объектный литерал представляет собой заданную в фигурных скобках последовательность свойств объекта и их значений. Свойства и значения задаются парами, разделенными символом :. Таким образом, объектный литерал имеет следующий синтаксис: {prop1:value1, ..., propN:valueN} Значением свойства может быть любой поддерживаемый JavaScript тип данных, включая объект: var Basil = {name:"Basil",surname: "Ivanoff", university:{name:"PGU",faculty:"AM",cours:5}} В качестве значения может снова выступать объектный литерал. В этом случае "точечная" нотация может быть продолжена для получения соответствующего свойства объекта, являющегося свойством созданного объекта. alert(Basil.university.name) Если в качестве значения свойства указывается ссылка на объект-функцию, то такое свойство на самом деле является методом создаваемого объекта: var Cat = {name:"Mourik", color:"red", voice:mew}; function mew(){ alert("mew... mew...") } Вызов метода осуществляется по всем правилам вызова функций JavaScript — указывается имя метода и при необходимости передаются ему фактические параметры: Cat.voice(); Но реально будет вызвана и выполнена функция, реализующая указанный метод (в нашем примере mew()). Второй способ позволяет быстро создавать экземпляры объекта определенного типа через специальную функцию-конструктор. Если с помощью объектного литерала мы непосредственно создаем экземпляр объекта и сохраняем в некоторой переменной ссылку на него, то здесь мы сначала "описываем" в конструкторе его свойства и методы, а потом операцией new создаем экземпляры этого типа объекта: // Объявление конструктора function CatWithoutOwner(sName, sColor) { this.name = sName this.color = sColor } // Создание экземпляра myCat = new CatWithoutOwner("Mourik", "red") Ключевое слово this в конструкторе предназначено для ссылки на конкретный экземпляр объекта, создаваемый операцией new. (Если в функции используется ключевое слово this, то это обязательно конструктор объекта.) Как и в случае с объектными литералами, свойства объекта, определяемые в его конструкторе, сами могут быть объектами: 72 // Конструктор объекта person function person(name, age) { this.name = name this.age = age } // создаем экземпляр объекта person alex = new person("Alex", 50) // Конструктор объекта CatWithOwner function CatWithOwner(sName, sColor, sOwner) { this.name = sName this.color = sColor this.owner = sOwner } // Создает экземпляр объекта CatWithOwner cat = new CatWithOwner("Mourik", "red", alex) // Отображаем имя владельца alert(cat.owner.name) Отличительной особенностью объектной модели JavaScript является то, что после создания экземпляра объекта к нему можно добавлять новые свойства и методы, которые будут присущи только этому конкретному экземпляру. Для этого достаточно в точечной нотации указать имя нового свойства и присвоить ему значение: cat.age = 6; cat.voice = mew Теперь у объекта cat появилось свойство age и метод voice, но только у этого объекта. Создаваемые конструктором CatWithOwner() объекты не будут иметь указанных свойства и метода. Но в JavaScript можно (после написания конструктора) в любой момент (чтобы не менять конструктор) добавить свойства и метолы непосредственно к объектному типу. Это приведет к тому, что создаваемые после этого экземпляры объектов с помощью того же конструктора будут обладать добавленными свойствами и методами. Для этих целей используется свойство prototype "объектного типа", совпадающего с именем конструктора: CatWithOwner.prototype.age = null CatWithOwner.prototype.voice = mew // теперь создаем экземпляр var cat1 = new CatWithOwner("Mourik", "red", alex) // у него есть свойство age (значение null) // и метод voice() alert(cat1.age); cat1.voice(); 73 // можем изменить значение свойства age cat1.age = "red" В конструкторе объекта вместо имен свойств (да и методов) можно использовать индексы: function CatWithOwner(sName, sColor, sOwner) { this[1] = sName this[2] = sColor this.owner = sOwner } cat1 = new CatWithOwner("Mourik", "black", alex) Теперь к свойствам, соответствующим имени и цвету, можно обращаться по индексу: alert(cat1[1]) Индексацию можно использовать и при доступе к свойствам, определенным с помощью имени, но в этом случае в качестве индекса берется строка с именем свойства: alert(cat1["owner"]) Для определения методов объекта в конструкторе следуем по схеме, аналогичной определению методов объекта в его конструкторе — определяем свойство, имеющее значением ссылку на функцию, реализующую создаваемый метод: function who() { var result = "Кот " + this.name + ",\nвладелец которого" + this.owner.name return result } // Новый конструктор объекта CatWithOwner function CatWithOwner(sName, sColor, sOwner) { this.name = sName this.color = sColor this.owner = sOwner this.whose = who } // Новый кот var cat2 = new CatWithOwner(); // Чей это кот alert(cat2.who()) В JavaScript не предусмотрено операции удаления объектов из памяти — они все удаляются либо по завершению работы сценария (закрытие страницы HTML в браузере), либо по завершению работы функции, в которой были созданы локальные объекты. 74 Существует операция delete, позволяющая удалить свойство объекта или элемента массива. Удалять можно только свойства созданных пользователем собственных объектов или свойства встроенных объектов, которые пользователь к ним добавил: myobj = new Number(); myoj["prop"] = "*********" delete myobj.prop В завершение рассказа о пользовательских объекта, в конструкторах которых применялось ключевое слово this для создания ссылки на текущий экземпляр объекта, напомним еще об одном случае использования этого ключевого слова. Его можно использовать в коде обработчика события элемента HTML для ссылки на объект, соответствующий этому элементу HTML: Здесь ключевое слово this ссылается на поле ввода и ссылка на него передается в функцию validate(), вызываемую при возникновении события изменения содержимого этого поля. Упражнения 1. Создать массив на основе объекта Object. Посмотреть, если у него свойство length, присущее массивам, созданным с помощью объекта Array. 2. Распечатать свойство constructor для всех известных объектов JavaScript. С помощью свойства prototype объекта Object для всех создаваемых в сценарии объектов добавить метод propertiesList(), возвращающий массив, содержащий названия всех свойств объекта и их значения. 3. Разработать объект Collection, позволяющий хранить и выбирать любые объекты JavaScript с использованием строкового ключа. Реализовать методы этого объекта: add(ключ, объект) — добавление объекта в семейство Collection, remove(ключ) — удаление объекта, count() — возвращает количество объектов в семействе, item(ключ) — возвращает объект по значению его ключа.

Привет!

Привет!

Пример 2.4: Раскрывающийся список


51
Объект Math
В отличие от других объектов этот объект создавать не надо — он создается интерпретатором автоматически при загрузке документа со сценарием в браузер.
Поэтому обращение к его методам и свойства выполняются с использованием его имени Math:
Math.PI
// число
π
Math.abs(x) // вычисление абсолютного значение
Методы объекта Math
Метод
Описание
abs(x)
Абсолютное значение sin(x), cos(x), tan(x)
Стандартные тригонометрические функции; аргумент задается в радианах acos(x), asin(x), atan(x)
Обратные тригонометрические функции exp(x), log(x)
Экспоненциальная функция и функция натурального логарифма ceil(x)
Наименьшее целое, большее или равное значению аргумента floor(x)
Наибольшее целое, меньшее или равное значению аргумента min(x,y), max(x,y)
Наибольшее или наименьшее значение двух аргументов pow(x,y)
Показательная функция: pow(x,y)=x y
round(x)
Округление аргумента до ближайшего целого sqrt(x)
Квадратный корень atan2(y,x)
Возвращает угол в радианах между осью Х и направлением на точку (х,у). random()
Возвращает случайное число между 0 и 1.
Генератор случайных чисел запускается автоматически при загрузке ядра JavaScript.
1   2   3   4   5   6   7   8   9   10   11



Абзац с атрибутом id='par1'.

69 err.number = 801 err.description = "Не задан второй параметр.";
// Генерирование ошибки throw err break;
}
// Возвращаемое значение функции return x+y;
}
// Обращение к функции add() с обработкой возможной ошибки try{
// функция add() сгенерирует ошибку с номером 801 alert(add(5))
} catch(e){ alert(e.description+"\n"+e.number)
}


Упражнения
1. Добавить метод propList() (пример 10) к прототипу объекта Object, а также добавить к прототипу этого же объекта свойство list со значением "Добавленное к прототипу Object". Проверить на объектах String, Date, Number, Function, Array,
Boolean, действительно ли будут добавляться к экземплярам указанных объектов добавленные к прототипу объекта Object метод и свойство.
2. Добавить к прототипу объекта Array метод вычисления максимального элемента массива и посмотреть его работу на экземплярах объектов этого типа, содержащими только числовые элементы, только строковые и смешанные (числа и строки).
3. Создать массив, элементы которого хранят ссылки на все 6 типов встроенных объектов JavaScript. Случайным образом "перемешать" его элементы. После этого распечатать отчет о том, какие объекты хранятся в его элементах, начиная с первого.

70 4. Реализовать нижеприведенный сценарий. Проверить доступность свойств 0, 1,
2, 3 массива. Объяснить результаты. Поэкспериментировать с другими типами встроенных объектов. var a = new Array("apple", "banana", "cactus"); a["q"] = 9 document.write(a.propertyIsEnumerable("q"))
5. Отобразить на странице HTML таблицу, показывающую результаты выполнения методов toString и valueOf всех встроенных объектов JavaScript.
6. Разработать страницу HTML со встроенным сценарием, который получает введенный пользователем код JavaScript в текстовом поле страницы и выполняет его.
Получить строку из текстового поля страницы HTML
можно, используя свойство value объекта с идентификатором, равным значению атрибута name текстового поля fromText = txt1.value
Интерпретацию строки можно организовать, используя кнопку

7. Написать сценарий, который кодирует строку, содержащую все небуквенные символы клавиатуры тремя возможными способами и отобразить результаты в виде таблицы:
Символ escape encodeURI
encodeURIComponent
%20
%20
%20
`
%60
%60
%60

%7E


!
%21
!
!
@
@
@
%40
#
%23
#
%23
Урок 9. Создание собственных объектов
Объектная модель JavaScript отличается от объектных моделей других объектно- ориентированных языков тем, что в ней объекты создаются на основе прототипов.
Для создания объектов в JavaScript можно использовать объектный литерал или специальным образом написанную функцию — конструктор объекта.

71
Объектный литерал представляет собой заданную в фигурных скобках последовательность свойств объекта и их значений. Свойства и значения задаются парами, разделенными символом :. Таким образом, объектный литерал имеет следующий синтаксис:
{prop1:value1, ..., propN:valueN}
Значением свойства может быть любой поддерживаемый JavaScript тип данных, включая объект: var Basil = {name:"Basil",surname: "Ivanoff", university:{name:"PGU",faculty:"AM",cours:5}}
В качестве значения может снова выступать объектный литерал. В этом случае "точечная" нотация может быть продолжена для получения соответствующего свойства объекта, являющегося свойством созданного объекта. alert(Basil.university.name)
Если в качестве значения свойства указывается ссылка на объект-функцию, то такое свойство на самом деле является методом создаваемого объекта: var Cat = {name:"Mourik", color:"red", voice:mew}; function mew(){ alert("mew... mew...")
}
Вызов метода осуществляется по всем правилам вызова функций JavaScript — указывается имя метода и при необходимости передаются ему фактические параметры:
Cat.voice();
Но реально будет вызвана и выполнена функция, реализующая указанный метод
(в нашем примере mew()).
Второй способ позволяет быстро создавать экземпляры объекта определенного типа через специальную функцию-конструктор. Если с помощью объектного литерала мы непосредственно создаем экземпляр объекта и сохраняем в некоторой переменной ссылку на него, то здесь мы сначала "описываем" в конструкторе его свойства и методы, а потом операцией new создаем экземпляры этого типа объекта:
// Объявление конструктора function CatWithoutOwner(sName, sColor) { this.name = sName this.color = sColor
}
// Создание экземпляра myCat = new CatWithoutOwner("Mourik", "red")
Ключевое слово this в конструкторе предназначено для ссылки на конкретный экземпляр объекта, создаваемый операцией new. (Если в функции используется ключевое слово this, то это обязательно конструктор объекта.)
Как и в случае с объектными литералами, свойства объекта, определяемые в его конструкторе, сами могут быть объектами:

72
// Конструктор объекта person function person(name, age) { this.name = name this.age = age
}
// создаем экземпляр объекта person alex = new person("Alex", 50)
// Конструктор объекта CatWithOwner function CatWithOwner(sName, sColor, sOwner) { this.name = sName this.color = sColor this.owner = sOwner
}
// Создает экземпляр объекта CatWithOwner cat = new CatWithOwner("Mourik", "red", alex)
// Отображаем имя владельца alert(cat.owner.name)
Отличительной особенностью объектной модели JavaScript является то, что после создания экземпляра объекта к нему можно добавлять новые свойства и методы, которые будут присущи только этому конкретному экземпляру. Для этого достаточно в точечной нотации указать имя нового свойства и присвоить ему значение: cat.age = 6; cat.voice = mew
Теперь у объекта cat появилось свойство age и метод voice, но только у этого объекта. Создаваемые конструктором CatWithOwner() объекты не будут иметь указанных свойства и метода.
Но в JavaScript можно (после написания конструктора) в любой момент (чтобы не менять конструктор) добавить свойства и метолы непосредственно к объектному типу. Это приведет к тому, что создаваемые после этого экземпляры объектов с помощью того же конструктора будут обладать добавленными свойствами и методами. Для этих целей используется свойство prototype "объектного типа", совпадающего с именем конструктора:
CatWithOwner.prototype.age = null
CatWithOwner.prototype.voice = mew
// теперь создаем экземпляр var cat1 = new CatWithOwner("Mourik", "red", alex)
// у него есть свойство age (значение null)
// и метод voice() alert(cat1.age); cat1.voice();

73
// можем изменить значение свойства age cat1.age = "red"
В конструкторе объекта вместо имен свойств (да и методов) можно использовать индексы: function CatWithOwner(sName, sColor, sOwner) { this[1] = sName this[2] = sColor this.owner = sOwner
} cat1 = new CatWithOwner("Mourik", "black", alex)
Теперь к свойствам, соответствующим имени и цвету, можно обращаться по индексу: alert(cat1[1])
Индексацию можно использовать и при доступе к свойствам, определенным с помощью имени, но в этом случае в качестве индекса берется строка с именем свойства: alert(cat1["owner"])
Для определения методов объекта в конструкторе следуем по схеме, аналогичной определению методов объекта в его конструкторе — определяем свойство, имеющее значением ссылку на функцию, реализующую создаваемый метод: function who() { var result = "Кот " + this.name + ",\nвладелец которого" + this.owner.name return result
}
// Новый конструктор объекта CatWithOwner function CatWithOwner(sName, sColor, sOwner) { this.name = sName this.color = sColor this.owner = sOwner this.whose = who
}
// Новый кот var cat2 = new CatWithOwner();
// Чей это кот alert(cat2.who())
В JavaScript не предусмотрено операции удаления объектов из памяти — они все удаляются либо по завершению работы сценария (закрытие страницы HTML в браузере), либо по завершению работы функции, в которой были созданы локальные объекты.

74
Существует операция delete, позволяющая удалить свойство объекта или элемента массива. Удалять можно только свойства созданных пользователем собственных объектов или свойства встроенных объектов, которые пользователь к ним добавил: myobj = new Number(); myoj["prop"] = "*********" delete myobj.prop
В завершение рассказа о пользовательских объекта, в конструкторах которых применялось ключевое слово this для создания ссылки на текущий экземпляр объекта, напомним еще об одном случае использования этого ключевого слова.
Его можно использовать в коде обработчика события элемента HTML для ссылки на объект, соответствующий этому элементу HTML:

Здесь ключевое слово this ссылается на поле ввода и ссылка на него передается в функцию validate(), вызываемую при возникновении события изменения содержимого этого поля.
Упражнения
1. Создать массив на основе объекта Object. Посмотреть, если у него свойство length
, присущее массивам, созданным с помощью объекта Array.
2. Распечатать свойство constructor для всех известных объектов JavaScript. С помощью свойства prototype объекта Object для всех создаваемых в сценарии объектов добавить метод propertiesList(), возвращающий массив, содержащий названия всех свойств объекта и их значения.
3. Разработать объект Collection, позволяющий хранить и выбирать любые объекты JavaScript с использованием строкового ключа. Реализовать методы этого объекта: add(ключ, объект) — добавление объекта в семейство
Collection, remove(ключ) — удаление объекта, count() — возвращает количество объектов в семействе, item(ключ) — возвращает объект по значению его ключа.


Часть II. Среда клиента
Урок 10. Объектная модель MS Internet Explorer
Как отмечалось в уроке 2 при обсуждении языков сценариев, последние используются для расширения возможностей некоторой среды, которая для этих целей "поставляет" ряд объектов, доступных из сценариев. В рамках клиентского
Web-программирования такой средой является программа просмотра Интернета.

75
Если она поддерживает программирование на каком-либо языке сценариев, то она предоставляет ряд объектов для взаимодействия с ней из сценариев.
Раскрываемые браузером MS Internet Explorer объекты представляют собой иерархию, во главе которой расположен объект window, соответствующий окну браузера. Ряд объектов (navigator, history, location) непосредственно связан с функциональностью самого браузера, тогда как другие объекты
(семейство frames и объект document) позволяют получить доступ к отображаемому в данный момент в окне браузера документу HTML.
window
document
history
location
frames
plugins
applets
anchors
scripts
images
embeds
forms
selection
all
navigator
plugin
mimetype
links
document
screen
styleSheets
body
text
button
radio
checkbox
password
hidden
reset
submit
file
textarea
select
option
Объект window
Объект window создается автоматически при запуске браузера. Для выполнения его методов или установки и получения значений свойств указывать его не обязательно, хотя и рекомендуется для лучшей читаемости кода сценария.
Заметим, что любое окно браузера или отображаемый в нем фрейм представлен объектом этого типа.
Свойства объекта window
Свойство
Описание
opener
Ссылка на окно, открывшее данное. parent
Ссылка на родительское окно в иерархии объектов. top
Ссылка на верхний родительский объект. name
Имя окна.

76 screenLeft, screenTop Координаты левого верхнего угла окна отображения браузера относительно левого верхнего угла экрана. status
Текст в строке состояния.
Из всех перечисленных свойств объекта window сейчас мы остановимся на трех последних.
Изменяя значения свойств screenLeft и screenTop объекта window
(задаются в пикселях) можно изменить положение окна браузера относительно верхнего левого угла экрана монитора компьютера клиента.
Свойство status полезно для получения в сценарии строки, отображающейся в строке состояния окна браузера, а также для отображения информации для пользователя, например, что документ HTML обработан и загружен: window.status = "Документ загружен."
Методы объекта window
У этого объекта есть много полезных методов, но основным можно считать метод open()
, с помощью которого создается новое окно браузера (загружается еще одна его копия). Синтаксис этого метода представлен ниже: переменная = window.open([имя_файла],[имя_ссылки_окна],
[строка_параметров])
В переменной хранится возвращаемая методом ссылка на новое окно, которую можно использовать для доступа к нему из сценария JavaScript.
Первым параметром имя_файла определяется полный или относительный URL- адрес открываемого в окне документа (если задана пустая строка, то открывается пустая станица).
Второй параметр имя_ссылки_окна позволяет задать имя вновь открытого окна, которое можно использовать в документе HTML в атрибуте target гипертекстовой ссылки для указания загрузки в него документа.
Параметр строка_параметров — строка, представляющая список параметров вновь создаваемого окна со значениями. Каждый параметр задается в виде параметр=значение. Все параметры вместе со своими значениями в строке отделены друг от друга запятыми. Допустимые параметры: height=высота — определяет высоту окна в пикселях; width=ширина — определяет ширину окна в пикселях; left=значение — определяет горизонтальную координату верхнего левого окна в пикселях; top=значение — определяет вертикальную координату верхнего левого окна в пикселях; resizable={yes|no|1|0} — может ли пользователь изменять размеры окна; location={yes|no|1|0} — отображается ли адресная строка; menubar={yes|no|1|0} — отображается ли строка меню;


77 scrollbars={yes|no|1|0} — отображаются ли полосы прокрутки; titlebar={yes|no|1|0} — отображается ли строка заголовка окна (только для HTML-приложений); toolbar={yes|no|1|0} — отображается ли панель инструментов; status={yes|no|1|0} — отображается ли строка состояния.
Например, следующий вызов, создаст новое окно браузера без панели инструментов и полос прокрутки, загрузив в него документ с указанным первым параметром абсолютным адресом. В любом документе HTML, для ссылки на это окно можно использовать имя linkWin. В сценарии ссылаться на это окно можно с помощью переменной winExample. winExample = window.open(
"http://www.bhv.ru/library/index.html",
"linkWin", "toolbar=no,scrollbars=yes")
Вывод во вновь открытое окно осуществляется методом write() объекта document этого окна.
Закрывается окно методом close() без параметров: window.close()
В сценарии можно использовать специальное имя self для ссылки на текущее окно или использовать переменную, хранящую ссылку на требуемое окно: self.close() newWindow.close()

Пример 14. Открытие нового окна и запись в него
Создадим страницу HTML, открывающую новое окно браузера при щелчке в любом месте документа. Для этого обработчику onclick объекта document присвоим ссылку на функцию openNewWindow(), в которой открывается новое окно newWind и в него записывается абзац:



78
Щелчок в области документа откроет новое окно.

79 confirm(сообщение) окно с сообщением и двумя кнопками
(возвращает true, если нажата кнопка
Yes, и false, если нажата кнопка No);
Метод setTimeout() запускает выполнение кода JavaScript, задаваемого первым строковым параметром, через определенный промежуток времени после выполнения метода.
Метод setInterval() запускает периодический "процесс" выполнения кода
JavaScript, задаваемого первым строковым параметром, с интервалом, указанным вторым параметром. переменная = window.setTimeout(строка_кода, интервал,
[язык]) переменная = window.setInterval(строка_кода, интервал,
[язык])
Интервал задается в миллисекундах (1000 соответствует 1 секунде).
Необязательный параметр язык определяет язык сценария для выполняемого кода
(JavaScript, VBScript). По умолчанию предполагается язык JavaScript.
Для остановки запущенных процессов используются соответственно методы и , параметрами которых является переменная, в которой сохранен результат запуска "процесса": window.clearTimeout(переменная) window.clearInterval(переменная)
Одновременно можно запустить много "процессов". Обычно метод setInterval() используется для создания страницы HTML с движущимися элементами.

Пример 15. Периодический "процесс"
Ниже приведен код страницы HTML, после загрузки которой каждые три секунды будет появляться сообщение, генерируемое вызовом функции myMessage():


Каждые три секунды будет появляться сообщение

80
Область отображения браузера разбивается на несколько частей (фреймов) с помощью вложенных в элемент FRAMESET элементов FRAME, в которых и отображаются соответствующие документы HTML.
Контейнер может содержать кроме элементов и другие теги , образуя, таким образом, вложенные наборы фреймов. Пример страницы HTML, задающей вложенные наборы фреймов, представлен ниже:







Для доступа к фреймам из сценария JavaScript предусмотрен объект top, являющийся родителем всех фреймов (в нашем примере clock, menu и content
). Для ссылки на фреймы страницы можно использовать либо символические имена, либо свойство-массив frames объекта top, в котором содержатся ссылки на все фреймы страницы. Так, на первый фрейм можно сослаться двумя способами: top.clock top.frames[0]
Каждый фрейм в сценарии представляется как объект window, обладающий всеми рассмотренными выше свойствами и методами этого объекта.
Свойство location фрейма содержит адрес загруженного в него документа.
Изменение значения этого свойства приведет к загрузке нового документа в соответствующий фрейм. Следующий фрагмент кода HTML задает на странице menu.html кнопку с именем Во фрейм clock, при щелчке на которую во фрейм clock загружается страница HTML:



Для доступа из сценария к странице, загруженной во фрейм, следует использовать его свойство-объект document.

Пример 16. Взаимодействие с фреймом из сценария
Создадим страницу с двумя фреймами:





81
Во фрейм Frame1 загрузим файл frame1.html.:



При щелчке на кнопке Запись во фрейм Frame2 второй фрейм будет заполняться содержимым, определенным в качестве параметра метода write объекта document этого фрейма.

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

Пример 17. Взаимодействие вложенных фреймов
Загружаемая страница с фреймами frame.html:




Файл frame2.html (названия фреймов могут быть такими же, как и в главной странице!):




Файл frame1-1.html, предоставляющий запись во фрейм Frame1 страницы frame2.html:

Можно на фрейм Frame1 файла frame2.html сослаться и так: top.frames[1].frames[0]


82
Объект navigator
Является свойством объекта window и предоставляет информацию об используемом клиентом браузере.
Свойства appCodeName
Название кода браузера. appName
Название браузера. appVersion
Версия браузера. browserLanguage
Текущий используемый язык браузера. cookieEnabled
Поддерживает ли браузер сохранение cookies. userAgent
Заголовок, посылаемый клиентом серверу при обмене данными по протоколу HTTP. cpuClass
Строка, характеризующая используемый процессор компьютера. onLine
Браузер в режиме работы с сетью или в автономном. platform
Строка, характеризующая операционную систему компьютера. systemLanguage
Используемый по умолчанию язык операционной системы компьютера.
Методы
javaEnabled()
Возвращает true, если возможен в браузере запуск
Java-апплета. В противном случае false.
Объект location
Объект location также является свойство объекта window и связан с URL- адресом отображаемого в браузере документа. Синтаксис URL-адреса имеет следующий вид: protocol//host:port/pathname#hash?search
Примеры URL-адресов http://localhost:8080/doc/url.html#path http://www.net.org/tutorial/cgi/url.pl?name=search и соответствие их частей указанным в синтаксисе обозначениям:
Синтаксис URL
Адрес 1
Адрес 2
protocol http: http: host localhost www.net.org port
8080 pathname doc/url.html tutorial/cgi/url.pl hash path search name=search

83
Свойства
href возвращает полный адрес загруженного документа. Если его изменить, то будет загружен новый документ. Является свойством по умолчанию, поэтому для загрузки нового документа из сценария можно использовать следующую конструкцию: window.location = "http://microsoft.com/index.asp";
Остальные свойства hash, host, hostname, pathname, port , protocol, search соответствуют частям адреса загруженного документа, используемые как для получения, так и для изменения соответствующих частей адреса.
Методы
reload()
Перезагружает в браузер текущую страницу. replace(URL)
Загружает в окно браузера страницу, адрес которой задан в качестве его параметра.
Объект history
Объект history (свойство объекта window) содержит список адресов документов HTML, ранее загружавшихся в браузер.
Его свойство length хранит общее количество адресов в этом объекте.
Метод go() этого объекта загружает страницу из списка посещенных. Текущая страница имеет индекс 0, предыдущие по отношению к текущей страницы индексируются отрицательными целыми числами, а последующие положительными целыми числами: history.go(-3)
Для перемещения на одну страницу назад и на одну страницу вперед относительно текущей в списке посещенных можно использовать соответственно методы back() и forward() этого объекта.
Упражнения
1. Видоизменить программу примера 14, добавив на страницу две кнопки — одну для открытия окна, другую для закрытия.
2. Создать страницу с кнопкой, при щелчке на которой окно будет смещаться на
20 пикселей по горизонтали и по вертикали.
3. При загрузке страницы запустить два процесса, отображающие каждый свое сообщение. На странице предусмотреть кнопку, при нажатии на которую отображается диалоговое окно с просьбой ввести идентификатор процесса. После его ввода процесс останавливается.
4. В цикле определить все свойства объектов navigator и location и отобразить их в браузере в виде таблиц:

84 название свойства значение
5. Создать три страницы HTML. На первой странице расположена гиперссылка на страницу с именем history.html. На этой странице три кнопки: первая реализует метод back(), вторая метод forward() и третья метод go(). Также на этой странице должна быть гиперссылка на третью страницу HTML со ссылкой на history.html.
Загружаем первую страницу и переходим по ссылке на страницу history.html. С нее переходим по ссылке на третью страницу HTML и возвращаемся на страницу history.html нажатием кнопки Назад панели инструментов браузера.
Теперь при нажатии кнопок, реализующих методы back() и forward() мы должны попасть соответственно на первую и третью страницы, а при нажатии на кнопку, реализующую метод go(), в диалоговом окне следует указать на какую страницу мы хотим перейти (ее номер относительно текущей).
Урок 11. Объекты доступа к странице и ее элементам
Объект document
Этот объект содержит информацию о текущей загруженной странице. Для каждой страницы создается один объект document.
Свойства
Часть свойств соответствуют атрибутам тега-контейнера : background, bgColor, fgColor (атрибут text), linkColor (атрибут link), alinkColor
(атрибут alink) и vlinkColor (атрибут vlink). Другие свойства не соответствуют атрибутам указанного тега. Например, URL хранит адрес загруженного документа, parentWindow предоставляет ссылку на окно- родитель.
Семейства
all
Содержит ссылки на все объекты, представляющие элементы
HTML anchors
Содержит объекты, соответствующие тегам в порядке их появления в документе applets
Содержит объекты, соответствующие тегам в порядке их появления в документе embeds
Содержат объекты, соответствующие тегам в порядке их появления в документе forms
Содержит объекты, соответствующие тегам
в порядке их появления в документе

85 images
Содержит объекты, соответствующие тегам в порядке их появления в документе links
Содержит объекты, соответствующие тегам
HREF="..."> и , а также объекты link, созданные методом link() в порядке их появления в документе scripts
Содержит объекты, соответствующие тегам

86 scrollWidth scrollTop scrollLeft между верхним и левым краями области отображения и соответствующими краями содержимого, отображаемого в окне. scroll
Возвращает Yes, если полосы прокрутки отображены, No если нет и auto если они появляются, когда размеры содержимого области отображения превосходят ее размеры
Объект form
Каждая форма в документе, определенная тегом
, создает объект form, порождаемый объектом document. Ссылка на этот объект осуществляется с помощью переменной, определенной в атрибуте NAME тега
. В документе может быть несколько форм, поэтому для удобства ссылок и обработки в объект document введено свойство-массив forms, в котором содержатся ссылки на все формы документа. Ссылка на первую форму задается как document.forms[0], на вторую — document.forms[1] и т.д. Вместо индекса в массиве forms можно указывать строку, значение которой равно имени переменной для формы.
Например, если в документе присутствует единственная форма со значением атрибута name=form1, то любой из следующих операторов JavaScript содержит ссылку на эту форму: document.forms[0] document.forms["form1"] document.form1
Последний оператор возможен в силу того, что объект document порождает объект form (как и все остальные объекты, соответствующие элементам HTML страницы) и ссылку на него можно осуществлять по обычным правилам наследования языка JavaScript.
Все элементы формы порождают соответствующие объекты, подчиненные объекту родительской формы. Таким образом, для ссылки на объект text формы form1 можно пользоваться любым из нижеприведенных операторов: document.forms[0].text1 document.forms["form1"].text1 document.form1.text1
Каждый объект form имеет также семейство elements, содержащее ссылки на все подчиненные форме элементы в том порядке, как они определены в документе
HTML.
Элементы формы, точнее, их объекты, имеют свойство name, значение которого равно значению атрибута NAME тега , а также свойство value, значение которого определяется смыслом атрибута VALUE элемента формы. Например, для элементов text и textarea значением этого свойства будет строка содержимого полей ввода этих элементов; для кнопки подтверждения – надпись на кнопке и т.д.

87
У объекта, соответствующего элементу управления SELECT, имеется семейство options
, в котором хранятся ссылки на объекты, соответствующие элементам
OPTION этого элемента управления.
Для формы одним из важных действий на странице является проверка правильности заполнения полей пользователем на машине клиента до пересылки их на сервер. В следующем примере разъясняется, как выполнять эту процедуру.

Пример 18. Проверка данных формы
Страница HTML с формой form1, содержащей текстовые однострочные поля name для ввода имени и age для ввода года рождения, и функцией validate()
, вызываемой до отправки данных формы на сервер, представлена следующим кодом:


Ваше имя:
Ваш год рождения:





88
После загрузки страницы в браузер курсор устанавливается в поле ввода имени.
Нажатие на кнопку Подтвердить до отсылки данных формы генерирует событие submit для формы, которое и перехватывается в ее обработчике события onsubmit
. Функция проверки должна вернуть true, если все введенные данные правильны (а мы проверяем одно поле age), или false, если какие-то проверяемые данные не правильны. Но этого еще недостаточно, чтобы в случае неправильности данных браузером не инициировалась процедура их пересылки. В обработчике события onsubmit обязательно должна присутствовать операция return. Если ее операнд true, то данные пересылаются, если false, то нет.

Упражнения
1. Написать сценарий, отображающий в отдельном окне браузера сразу же после загрузки в него страницы все формы (свойство name) и все элементы управления в каждой из них с их названием и значением (свойства name и value), а для элемента SELECT отобразить его свойство name и все элементы списка со значением их свойств value, например: form1 1. txt1:
*****
2. chk1: yes
3. radio1: yes
4. radio1: no form2 1. txt1: xxxxxx
2. select1: val1 val2 3. txt2: yyyyyy
2. Реализовать эмуляцию взаимодействия страницы HTML с серверной программой, регистрирующей пользователя. На странице HTML пользователь вводит имя, фамилию, пароль и адрес электронной почты. Заполнение всех полей обязательно. Перед отсылкой данных на "сервер" следует проверить правильность ввода адреса электронной почты (наличие двух частей, разделенных символом @).
Эмуляцию серверной программы осуществить сценарием JavaScript, встроенном в другую страницу HTML, адрес которой указывается в атрибуте ACTION открывающего тега элемента FORM. Сценарий должен сформировать страницу, приветствующую пользователя по имени и фамилии и сообщающем ему в табличной форме с каким браузером он работает, его версию, а также наименование операционной системы (используйте объекты location и navigator).

89 3. Написать функцию, отображающую с помощью метода alert() объекта window значения свойств объекта body с префиксами client, offset и scroll
. Вызвать ее из начала, середины и конца большого документа, отображаемого как минимум на трех экранах. Проанализировать полученные результаты.
4. Напишите универсальную функцию проверки значений, вводимых пользователем в текстовых полях формы на соответствие вещественному числу.
Под универсальностью функции понимается тот факт, что ее можно использовать для любого однострочного текстового поля любой формы. Если пользователь ввел не вещественное число, то следует поле следует очистить и установить в него указатель мыши, сообщив о неправильном вводе пользователя.
Урок 12. Обработка событий в MS Internet Explorer
Обработчики событий
Интерактивные страницы HTML реагируют на действия пользователя. Например, при нажатии на кнопку появляется диалоговое окно с сообщением, или выполняется проверка правильности введенных пользователем данных в полях формы.
В JavaScript подобная интерактивность реализована, как и в других системах программирования, возможностью перехвата и обработки событий, возникающих в результате действий пользователя или системы. Для этого в теги практически всех элементов HTML (объектов с точки зрения JavaScript) были введены
атрибуты обработки событий, задающие действия, выполняемые при возникновении события, связанного с этим элементом HTML. Имя атрибута обработки события начинается с приставки on, за которым следует название события. Если событием является, например, щелчок кнопкой мыши click, то соответствующий атрибут обработки этого события называется onclick; если обрабатываемым событием является нажатие кнопки мыши mousedown, то атрибут называется onmousedown.
Информация о некоторых событиях некоторых элементов HTML приведена в следующей таблице.
Событие
Применяется к
объектам
Когда происходит событие
abort image
Пользователь отказывается от загрузки изображения blur window, body и все объекты формы
Потеря объектом фокуса change text, textarea, select
Пользователь изменяет значение элемента

90 click
Все элементы HTML Щелчок на элементе HTML error image, window
Загрузка документа или изображения вызывает ошибку focus window , body и все объекты формы
Окно или элемент формы получает фокус keydown
Все элементы HTML
Пользователь нажимает клавишу клавиатуры keypress
Все элементы HTML
Пользователь удерживает нажатой клавишу клавиатуры keyup
Все элементы HTML
Пользователь отпускает клавишу клавиатуры load
Тело документа
Загружается документ в браузер mousedown
Все элементы HTML Пользователь нажимает кнопку мыши mousemove
Все элементы HTML
Пользователь перемещает указатель мыши в области элемента mouseout
Все элементы HTML
Пользователь перемещает указатель мыши из области элемента mouseover
Все элементы HTML
Пользователь перемещает указатель в область элемента mouseup
Все элементы HTML Пользователь отпускает кнопку мыши mousewheel
Все элементы HTML Пользователь крутит колесико мыши move
Относительно или абсолютно позиционированный элемент
Пользователь или сценарий перемещает элемент reset form
Пользователь нажимает кнопку Reset формы select body, text, textarea
Пользователь выбирает поле ввода элемента формы или выделяет часть документа submit form
Пользователь нажимает кнопку Submit формы unload body, frameset, window
Пользователь закрывает документ
Хорошим стилем программирования является оформление действий, выполняемых при обработке событий, в виде процедур.

91
Вызов процедуры обработки события
В JavaScript каждое событие порождает ассоциированный с ним объект event.
Этот объект содержит всю информацию о событии и его можно передать процедуре обработки события.
Вызов процедуры обработки события можно осуществить двумя способами:

явно – назначив ссылку на процедуру обработки события в соответствующем свойстве объекта

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




Сама процедура задается следующим кодом (объект event в IE доступен просто по своему имени):
// В IE function showEventType() { alert("Произошло событие: " + event.type)
}
Второй, неявный вызов процедуры обработки события требует задания обращения к ней в атрибуте onmousedown в открывающем теге элемента
INPUT:



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

92 браузера. Цикл жизни любого типичного события JavaScript включает следующие этапы:
1. Происходит действие пользователя или возникает условие, которое возбуждает событие
2. Тотчас же корректируется объект event, чтобы отразить параметры возникшего события
3. Событие генерируется – это и есть истинное сообщение о возникшем событии
4. Вызывается обработчик событий элемента-источника события, который выполняет определенные программистом действия и завершает свою работу
5. Событие передается вверх по иерархии объектов (bubble up) и вызывается обработчик события объекта, являющегося родителем объекта-источника события. Это "всплытие" вверх по иерархии объектов продолжается, пока не будет достигнут самый верхний объект иерархии – объект window, или обработчик события какого-либо объекта не аннулирует событие
6. Выполняются заключительные действия по умолчанию, если таковые определены, но при условии, что событие не было аннулировано.

Пример 19. "Всплытие" события
В этом примере щелчок на любом элементе HTML страницы приводит к отображению диалогового окна с надписью "Не надо щелкать".


1   2   3   4   5   6   7   8   9   10   11

Привет!


Это простой пример, ну очень простой пример.

93 обработчик событий, то событие будет обрабатываться всеми обработчиками, если только в каком-то обработчике не будет аннулировано его "всплытие" вверх по иерархии объектов.
Объект event имеет свойство cancelBubble, которое позволяет аннулировать событие, если установить его значение равным true. После этого соответствующее событие не существует, и обработчики этого события всех, расположенных выше элементов, не вызываются.

Пример 20. Аннулирование "всплытия" события
Аннулирование "всплытия" события в элементе bold1 приводит к тому, что щелчок на нем не отображает диалогового окна из обработчика этого события в элементе body. Для всех остальных элементов это действие продолжает выполняться.


Привет!


Это простой пример,
ну очень простой пример.

94
Свойство srcElement определяет элемент документа, явившийся источником события. Оно может быть полезным при централизованной обработке событий элементом, расположенным выше в иерархии объектов документа истинного "виновника" события, и, в зависимости от типа элемента, программа-обработчик может предпринять соответствующие действия.
Важное свойство cancelBubble, аннулирующее событие и прекращающее передачу его на обработку вверх по иерархии объектов, рассмотрено ранее.
Свойство returnValue является булевым и возвращает значение true или false после завершения выполнения процедуры обработки события. При передаче события вверх по иерархии значение этого свойства можно использовать для альтернативной обработки события. Кроме того, если в обработчике события элемента, для которого определены действия по умолчанию, это свойство устанавливается равным false, то это отменяет выполнение действий по умолчанию. Так, для элемента A действием по умолчанию является переход по ссылке, задаваемой атрибутом HREF.
По значениям свойств altKey, ctrlKey и shiftKey элемента-источника события определяется, была ли нажата, соответственно, клавиша , или в момент возникновения события (правая или левая неважно).
Значение свойства равно true, если клавиша была нажата, и false в противном случае. Свойства ctrlLeft, altLeft и shiftLeft позволяют определить, была ли нажата в момент возникновения события левая из указанных в названии свойств клавиша.
Следующий фрагмент сценария отменяет переход по любой связи в документе, если при щелчке на ней была нажата клавиша :

Пример 21. Отмена перехода по гиперсвязи
document.onclick=click; function click() { if((window.event.srcElement.tagName=='A') && window.event.shiftKey) { window.event.returnValue=false;
}
}

Установка значения свойства returnValue равным false не аннулирует событие. Оно продолжает "всплывать" по иерархии объектов. Отменяется только действия по умолчанию элемента, являющегося источником события.
Для событий мыши определены свойства, значениями которых являются координаты положения курсора в момент возникновения события.
Свойства clientX и clientY представляют координаты относительно области отображения браузера, offsetX и offsetY являются координатами

95 относительно элемента-контейнера, в котором расположен элемент-источник события, screenX и screenY – абсолютные координаты курсора мыши, т.е. координаты экрана монитора. Все значения этих свойств определены в пикселях.
Свойства x и y определяют положение курсора мыши по горизонтали и вертикали относительно позиционированного контейнера, содержащего элемент-источник события. Если ни один контейнер не позиционирован, то положение определяется относительно тела документа .
Полезное свойство событий мыши button определяет нажатую кнопку мыши
(только для событий onmousedown, onmouseup и onmousemove):
Значение Нажаты кнопки мыши
0 ни одна
1
Левая
2
Правая
3
Одновременно левая и правая
4
Средняя
5
Одновременно левая и средняя
6
Одновременно правая и средняя
7
Все три одновременно
Свойства toElement и fromElement применимы только к событиям onmouseover и onmouseout. Они определяют, от какого элемента и к какому перемещался курсор мыши, и полезны при анализе этих действий для вложенных элементов.
Свойство keyCode хранит ASCII-код нажатой клавиши клавиатуры при событиях onkeydown, onkeyup и onkeypress. Для события onkeydown свойство repeat равно true, если оно происходило непрерывно два и более раз
(нажата и удерживается клавиша) и false в противном случае.
Для события onmousewheel, если свойство wheelDelta имеет значение -120, то колесо вращалось на себя, если 120, то от себя.

Пример 22. Изменение размеров картинки
Свойство каскадных таблиц стилей zoom (расширение компании Microsoft к свойствам каскадных таблиц стилей, вошедших в рекомендации консорциума
WWW) позволяет изменять масштаб отображения элемента HTML на странице, отображаемой в окне браузера. Его значением является коэффициент изменения размера элемента HTML по сравнению с его нормальным размером. Он задается в виде вещественного числа или в виде процента. Значения от нуля до единицы или от 0% до 100% приводят к уменьшению изображения элемента, а значения большие единицы или 100% к увеличению. В примере отслеживается поворот колесика мыши, когда указатель расположен над рисунком (элемент IMG), и

96 увеличение (поворот колесика "на себя") или уменьшение (поворот колесика "от себя") значения свойства zoom элемента IMG на 5%, что приводит к увеличению или уменьшению размеров рисунка.




97
Часть III. Динамический HTML
Урок 13. Объектная модель документа DHTML
Объектная модель документа определяет логическую структуру документа и способ доступа и манипулирования составляющими документ элементами. Все, что определено в документе тегами языка разметки HTML-страниц, становится доступным для изменения, удаления и добавления. Программист может создавать документы, свободно перемещаться по их структуре и добавлять, изменять или удалять элементы и/или их содержимое. Эту технику принято называть динамическим HTML.
Динамический HTML в Internet Explorer 4.0 был реализован на базе объектной модели DHTML, разработанной фирмой Microsoft и послужившей основой для объектной модели DOM консорциума WWW. Начиная с версии 5.0 в браузере
Internet Explorer полностью реализована эта объектная модель документа, но объектная модель документа DHTML продолжает существовать.
Структура документа
В объектной модели DHTML любой документ представляется в виде логической древовидной структуры. Следующий фрагмент документа HTML:

В блоковый элемент, каким является абзац, можно добавлять встраиваемые элементы, каковым является элемент IMG:


98
Каждый элемент документа HTML является в этой модели программируемым объектом. Это означает, что существует возможность динамически изменять содержимое элементов страницы, перемещать их по иерархии, добавлять новые элементы или удалять существующие, изменять форматирование (внешний вид) элементов страницы. Подобные действия реализуются через сценарии, выполняемые как реакция на определенные действия пользователя или системы.
Иерархия объектов
Каждый объект в иерархии, предоставляемой объектной моделью документа
HTML, можно использовать в сценарии JavaScript, но для этого необходимо получить доступ к соответствующему объекту.
В иерархической объектной модели одну из важных ролей при доступе к объектам играют два семейства, являющиеся свойствами любого объекта HTML,
— all и children. В первом содержатся ссылки на все объекты,
расположенные ниже объекта в иерархии, тогда как второй содержит ссылки на
все объекты, непосредственно порождаемые данным. Например, семейство all объекта body приведенного выше документа HTML содержит ссылки на все объекты документа, в том числе и на p1, img1, b1 и img2. Семейство children будет ссылаться только на два объекта, непосредственно порождаемых элементом body — p1, img2.
На вершине всей иерархии объектов расположен объект document, который "порождает" все объекты, представляющие элементы HTML. Этот объект также имеет свойство-семейство all (семейства children у него нет), содержащий ссылки на все объекты документа.
Отметим одну особенность семейства all объекта document — оно всегда содержит ссылки на объекты HTML, HEAD, TITLE и BODY, даже если соответствующие теги отсутствуют в документе (браузеры обычно позволяют их пропускать и сразу же задавать тело документа).
В семейство all объекта document не включается задаваемый без тегов разметки, хотя и отображаемый на странице, текст (браузер IE позволяет это делать). Таким образом, в объектной модели DHTML он будет просто потерян — к нему будет невозможен доступ.
Кроме объектов, представляющих распознаваемые и отображаемые браузером элементы HTML, в семейства all и children попадают также комментарии
HTML и неизвестные или ошибочные теги (без своего содержимого, которое отображается как неразмеченный текст).
Для получения ссылки на интересующий объект, "хранящийся" в любом семействе, следует использовать целочисленный индекс (отсчет от нуля) или строковый индекс (имя) соответствующего элемента. Имя элемента HTML — значение его атрибута ID или атрибута NAME. Отметим, что имя элемента в то же время является свойством объекта-семейства, в которое он включен.

99
Например, чтобы обратиться к объекту, представляющему первый абзац приведенного в начале урока примера страницы HTML, можно использовать одну из следующих конструкций: document.all[4] document.all['p1'] document.all.p1
В Internet Explorer можно просто ссылаться на элемент HTML, используя его имя, определяемое значением атрибута ID или NAME, в качестве переменной, хранящей ссылку на объект, соответствующий указанному элементу HTML. Это справедливо для всех элементов страницы за исключением элементов управления формы — к ним доступ осуществляется только через родительский объект form
(хотя с использованием семейства document.all придерживаться такой иерархии совершенно не обязательно). Таким образом, на первый абзац можно сослаться и просто как p1.
При программировании достаточно полезным свойством семейств является свойство length, в котором хранится общее число объектов в наборе. Его обычно используют для организации перебора элементов в семействе с помощью цикла for. Однако в этом случае большую производительность и удобство дает цикл for...in.

Пример 23. Два способа перебора элементов семейства