Объекты JavaScript и объектная модель документа
- В
целом объект –
это составной тип данных, объединяющий множество значений в общий модуль и
позволяющий сохранять и извлекать по запросу значения по их именам.
Ранее мы уже начали знакомство с понятием объекта в javascript.
- В javascript есть такое понятие как DOM — Document Object Model — объектная модель веб-страницы (html-страницы).
- Теги документа или, как еще говорят, узлы документа — это и есть его объекты.
Давайте
рассмотрим на схеме иерархию объектов в JavaScript, и то, на
каком месте иерархии находится рассматриваемый в данной теме
объект document
.
СВОЙСТВА И АТРИБУТЫ ОБЪЕКТА DOCUMENT В JAVASCRIPT
Объект document
представляет
собой веб-страницу.
объект.свойство
объект.атрибут
объект.метод()
Рассмотрим пример:
и определенный для него стиль css (даже два стиля, второй пригодится для задания):
Необходимо:
- задать новое свойство объекта, присвоить ему значение и вывести;
- вывести значение атрибута объекта;
- изменить значение атрибута объекта.
Выполним задание по порядку:
-
Так как это язык javascript, то объекту можно придумать и задать любое свойство с любым значением. Но для начала получим доступ к объекту (о доступе к объекту будет подробно рассказано ниже в данном уроке):
-
Следующее задание связано с атрибутом объекта. Атрибут объекта — это атрибуты тега. Т.е. в нашем случаем их два: атрибут
class
со значениемsmall
и атрибутid
. Будем работать с атрибутомclass
.Теперь добавим javascript-код для вывода значения атрибута нашего объекта. Код должен находиться после основных тегов:
-
И последнее задание: изменяем значение атрибута. Для этого у нас заготовлен стиль «big». Заменим значение атрибута
class
на этот стиль:В результате наш элемент станет большего размера и окрасится в синий цвет (класс
big
).
Теперь подробнее рассмотрим использованные в примере методы для работы с атрибутами.
МЕТОДЫ ДЛЯ РАБОТЫ С АТРИБУТАМИ В JAVASCRIPT
Атрибуты можно добавлять, удалять и изменять. Для этого есть специальные методы:
- Добавление атрибута (установление для него нового значения):
- Получение значения атрибута:
- Проверка наличия данного атрибута:
- Удаление атрибута:
СВОЙСТВА ЭЛЕМЕНТА BODY
Через
объект document
можно
обратиться к телу документа — тегу body
—
с его некоторыми полезными свойствами.
Например,
у тега body
есть
два замечательных свойства: ширина и высота клиентского
окна:
document.body.clientHeight
— высота клиентского окнаdocument.body.clientWidth
— ширина клиентского окна
Но самое главное, как мы уже узнали, это то, что
через объект document
посредством
специальных методов осуществляется доступ ко всем элементам страницы, выраженным
тегами.
body
!
Так как к моменту исполнения скрипта все элементы уже должны быть «нарисованы»
браузером на экранеДоступ к элементам документа в javaScript
Для доступа к объектам или поиска объектов предусмотрено несколько вариантов:
- Поиск по
id (или метод
getElementById
), возвращает конкретный элемент - Поиск по названию
тега (или метод
getElementsByTagName
), возвращает массив элементов - Поиск по атрибуту
name (или метод
getElementsByName
), возвращает массив элементов - Через родительские элементы (получение всех потомков)
Рассмотрим каждый из вариантов подробнее.
- Доступ
к элементу через его атрибут
id
Синтаксис:
document.getElementById(id)
Метод
getElementById()
возвращает сам элемент, который можно затем использовать для доступа к данным
Выполнение:Можно выполнить то же самое, реализовав обращение к объекту через переменную:
- Доступ
к массиву элементов через название тега
name
и посредством индекса массиваСинтаксис:
document.getElementsByTagName(name);
МетодgetElementsByTagName
через переменную организует доступ ко всем элементамinput
(т.е. к массиву элементов input), даже если этот элемент — единственный на странице. Чтобы обратиться к конкретному элементу, например к первому, то указываем его индекс (массив начинается с нулевого индекса):Выполнение:
- Доступ
к массиву элементов по значению атрибута name
Синтаксис:
document.getElementsByName(name);
Метод
getElementsByName("...")
возвращает массив объектов, у которых атрибутname
равен указанному в качестве параметра метода значению. Если такой элемент только один на странице, то метод все равно возвращает массив (только с одним единственным элементом).Пример: допустим в документе есть элемент:Необходимо: вывести значение
value
данного элемента
Выполнение:В данном примере элемент один, но обращение осуществляется к нулевому элементу массива
Важно: Метод работает только с теми элементами, для которых в спецификации явно предусмотрен атрибутname
: это тегиform
,input
,a
,select
,textarea
и ряд других, более редких.Метод
document.getElementsByName
не будет работать с остальными элементами типаdiv
,p
и т.п..
- Доступ
к потомкам родительского элемента
Доступ к потомкам в javascript происходит посредством свойства
childNodes
. Свойство принадлежит объекту-родителю.Рассмотрим пример, в котором теги изображений помещены в контейнер — тег
div
. Таким образом, тегdiv
является родителем данных изображений, а сами тегиimg
, соответственно, являются потомками тегаdiv
:Теперь выведем в модальное окно значения элементов массива с потомками, т.е. тегами
img
:Обратите внимание, что для перебора элементов массива потомков удобно использовать цикл For in. Т.е. в нашем примере получаем цикл:
- Другие
способы обращения к элементам
Другие способы рассмотрим на примере:
Доступ:
Выполнение:
Вариант 1:
Вариант 2:
Проверка правильности внесения данных формы
Не осталось ли поле пустым?
Вводимым пользователями данным доверять нельзя. Предполагать, что пользователи при вводе данных будут их проверять, неразумно. Значит необходимо для этого использовать javascript.
Для
того, чтобы проверить не осталось ли текстовое поле
пустым (например, после заполнения пользователем
данных какой-либо анкеты), следует обратиться к свойству value
.
Если значением свойства является пустая строка (""
),
значит необходимо как-то оповестить об этом пользователя.
Т.е, проверка того, осталось ли поле пустым будет выглядеть так:
Текст вместо числового значения: функция isNaN
Если
поле предполагает введение числового
значения, а вместо этого пользователь вводит текст, то необходимо
использовать функцию isNaN
(с
англ. «является ли не
числом?»), которая проверяет тип вводимых данных и
возвращает true
в
случае введения текстовых данных вместо числовых.
Т.о.
если возвращено true
,
то необходимо оповестить пользователя о том, чтобы он ввел правильный формат,
т.е. число.
Т.е. проверка будет выглядеть следующим образом:
И
последнее, если все таки пользователь ввёл в текстовое поле, предназначенное для
числа, и число и текст, то при помощи ранее изученной
функции javascript parseInt
можно вычленить из текста
число:
В коде используются логические операторы javascript для построения сложных условий, пройденные раннее.
Новым
понятием для вас является вызов функции в качестве обработчика события
кнопки:onclick="placeOrder();"
По щелчку на кнопке будет вызываться
функция placeOrder()
Событие onLoad. Свойства
высоты и ширины объекта в javaScript

Для выполнения следующего примера нам понадобится
новое понятие — событие.
В
нашем случае событие — это реакция
программы на действие пользователя (щелчок мышью по
кнопке, уменьшение мышкой окна браузера, ввод текста с клавиатуры и т.д.). С
помощью программы у нас есть возможность отреагировать на любые действия
пользователя.
Рассмотрим
одно из самых распространенных событий — onload
—
которое происходит при загрузке
документа (когда пользователь своими действиями
вызвал загрузку веб-страницы).
Рассмотрим
пример использования события javascript onload
для
изменения ширины и высоты элемента.
Пример: Добавить
на страницу изображение и при помощи javascript при наступлении события загрузки
страницы сделать ширину изображения соответствующей ширине окна браузера
В
примере основные действия происходят в функции resizeImg()
:
переменная myImg
ассоциирована
с тегом img
—
картинкой, свойство которой width
—
ширина — меняется в самой функции.
Вызов
функции происходит по загрузке страницы в событии onload
тела
документа (тело — body
—
главный элемент, поэтому загрузка страницы — это событие, относящееся к телу).
Событие onclick javaScript
и три способа обработки событий
Событие onClick
происходит
во время одинарного щелчка кнопкой мыши. Обработать событие, т.е.
отреагировать на него посредством скрипта, можно тремя способами. Рассмотрим
их:
Пример: По
щелчку на кнопке вывести диалоговое окно с сообщением «Ура!»
- Через
свойство объекта с использованием пользовательской функции:
Скрипт:
html-код:
В данном примере в
html-коде мы видим кнопку. У кнопки присутствует
атрибут onclick
(«по щелчку»), в значении которого стоит
вызов функции с названием message()
.
Это пользовательская функция, описанная выше в скрипте. В самой функции
выводится диалоговое окно, что и задано согласно заданию.
Скрипт при такой обработке события обычно находится в
области head
документа
- Через
атрибут тега:
Это упрощенный вариант
обработки события, он подходит только для небольшого кода, когда необходимо
выполнить один-два оператора. Иначе код будет плохочитаемым.
В качестве атрибута кнопки
указывается onclick
(«по щелчку»), а в качестве значения
пишется скрипт из операторов с указанием на каком языке он написан (javascript:
).
В нашем случае оператор для вывода модального окна со
словом «Ура!»
- Через
регистрацию функции-обработчика в качестве свойства элемента:
html-код:
Скрипт:
В html-коде здесь
присутствует кнопка с атрибутом id
,
который необходим для обращения к кнопке через скрипт.
В
скрипте, который обязательно
находится ниже дерева элементов (можно перед
закрытием тега body
),
находится обращение к кнопке (document.myForm.myButton
),
для которой назначается обработчик события onclick
со
значением ссылки на функцию.
Обращение к кнопке может быть организовано через
атрибут id
(document.getElementById('myButton').onclick
= message;
)
Скобки после названия
функции message
не
ставятся. В данном случае это именно ссылка на
функцию, иначе, при использовании скобок, функция была бы вызвана, а не
назначена в качестве обработчика событий.
Именно такой способ
обработки событий максимально приближен к тому, который происходит, например,
в ОС windows.
События onMouseOver и
onMouseOut
Событие
наступает при наведении (onMouseOver
)
на объект и при выведении (onMouseOut
)
за пределы объекта курсора мыши.
Назначение
обработчика событий осуществляется точно таким же образом, как и в
случае с событием
onclick.
Форма: идентификация формы,
события
Для
идентификации формы и ее элементов через javaScript можно воспользоваться двумя
атрибутами: name
и id
.
- В
случае, когда мы используем javaScript для динамичности и интерактивности
веб-страниц, но, при этом отправлять данные с формы на сервер не требуется, то
для идентификации используется атрибут
id
.
- Атрибут
name
необходим
для того, чтобы отправить форму на сервер.
Атрибуты формы:
action
(англ.
«действие»)
Файл на сервере с кодом для
отработки отосланных данных
http://labs.org.ru/javascript-1/
enctype
(англ.
«тип кодировки»)
text/plain (обычный
текст)
application/x-www-dorm-urlencoded (для
метода Post отправки формы)
multipart/form-data (для
метода Post, если прикрепляются файлы)
method
(метод
отправки данных)
post
get
Пример:
- В
атрибуте
action
указывается
серверный файл со скриптом, ответственным за основную обработку данных,
пересылаемых из формы. Обычно код этого файла пишется на серверном языке
программирования, например, на языке php или perl.
- Атрибут
enctype
указывает
на тип передаваемой на сервер информации, если это просто текстовые данные
— text/plain
,
если с формой отсылаются файлы, то следует указать multipart/form-data
.
- Атрибут
method
указывает
и определяет форму передачи данных. Подробно мы на этом останавливаться не
будем, однако следует сказать, что для более надежной передачи следует указать
метод post
Пример: Создать
несколько различных элементов управления формы, данные из формы предполагается
отсылать на сервер
При
щелчке на кнопке submit
данные
на сервер будут пересылаться в форме переменная=значения в
следующем формате:
i_name
= текст
mess
= ""
chName=
yes
rName
= yes
fName
= путь файла
pName
= ""
hName=
hid
sName=1
или 2
О том, как правильно располагать
элементы управления на форме с точки зрения юзэбилити, можно прочитать статью на
сайте tproger по сслыке1 и ссылке2.
ИДЕНТИФИКАЦИЯ ФОРМЫ В
JAVASCRIPT
Пример обращения в javaScript
к форме:
Пример: Создать
форму с двумя элементами типа radio
(переключатели)
и кнопкой отправки формы на сервер (submit
).
Получить доступ в скрипте к форме
скрипт:
МЕТОДЫ ФОРМЫ
Submit()
~
использование кнопки submit
Reset()
~
использование кнопки reset
Метод submit()
формы
применяется для отправки формы из JavaScript-программы
Пример того как можно в
javascript отправить форму по щелчку на гиперссылке:
Пример: Создать
форму с текстовым полем. После формы расположить гиперссылку, по щелчку на
которой отсылать данные формы на сервер
— void(0)
—
отмена пересылки данных на сервер
— при
нажатии на ссылку происходит переход к выполнению action
СОБЫТИЕ
JAVASCRIPT ONSUBMIT И ONRESET
Рассмотрим
использование событий на примерах:
Пример: Перед
отправкой формы на сервер необходимо отобразить простое сообщение для
пользователя с просьбой подтвердить заполнение формы заказа
Скрипт:
В
следующем примере происходит регистрация
функции-обработчика в качестве свойства элемента:
Пример: При
очистке формы (элемент reset
)
выдавать диалоговое окно для подтверждения очистки. Выполнить в виде скрипта с
ссылкой на функцию
Скрипт:
В
скрипте происходит обращение к форме (f1
)
и в качестве ее свойства указывается функция-обработчик
Объект text: свойства и
события
Текстовое
поле идентифицируется тремя способами:
Первый
способ является предпочтительным.
Свойства:
name
—
соответствует атрибуту name
id
—
соответствует атрибуту id
value
—
соответствует текущему значению объекта input
т.е.
текущему содержимому области текста;
type
—
для данного объекта всегда содержит значение «text»
Событие onсhange
генерируется
когда текст изменен и фокус переходит на другой объект
Пример: Имеется
html-страница с двумя текстовыми полями. Необходимо в обработку
события onсhange
первого
поля добавить вызов функции, которая во второе текстовое поле помещает текст из
первого текстового поля
Выполнение:
- Первый
способ: Назначение функций — обработчиков событий
Скрипт:
- Второй
способ: скрипт в значении атрибута
Скрипт:
html-код:
СОБЫТИЕ
JAVASCRIPT НАЖАТИЕ КЛАВИШИ — ONKEYPRESS
Нажатие
клавиши на клавиатуре можно зафиксировать с помощью
события onkeypress
.
Код конкретной нажатой клавиши может быть идентифицирован с помощью
объекта window.event.keyCode
Пример: При
вводе текста в текстовое поле проверять, нажата ли клавиша «d». Если нажата, заменять текст в текстовом
поле на «нажата d».
Использовать событие javaScript onkeypress
Замечание: буква d имеет
код 100
Служебное слово в javaScript this
this в
javascript заменяет обращение к текущему объекту. Текущим объектом в данном
случае является объект, в котором описан код.
Рассмотрим пример использования в
javascript this
:
Выполнение:
В
примере по щелчку на текстовое поле вызывается функция sayHello()
,
параметром которой является слово this
,
т.е. в качестве параметра передается сам объект — текстовое поле. В функции же
задается значение свойства value
для
переданного параметра.
События объекта (тега) body onLoad и onUnload
- Обработчик
события
onload
прекрасно подходит для инициализации всех остальных событий. - Данное событие добавляется в тег body:
- Аналогичное
событие есть для инициализации функций при закрытии документа —
событие
onUnload
. Событие вызывается тогда, когда пользователь закрывает окно браузера или окно конкретной веб-страницы. - Вместо
onUnload
сегодня можно использоватьonBeforeUnload
- Вывод
сообщений при использовании
onUnload
сегодня работает только в браузере IE
Рассмотрим
пример двух вариантов использования события onload
в
javascript:
Выполнение:
-
Скрипт:
HTML-код:
Таким образом, при загрузке веб-страницы браузером произойдет вызов функции
printText()
, которая выведет в текстовое окно текст «Добрый день!» -
Скрипт:
В данном случае код полностью реализован в скрипте. Результат будет аналогичен.
Событие onfocus в javascript: получение фокуса
- Событие
onfocus
происходит, когда элемент управления получает фокус, т.е. курсор устанавливается в объект.
Выделение происходит при
помощи метода select()
самих
объектов:объект.select()
Выполнение:
Будем использовать служебное слово this:
В
примере оба объекта (textarea
и input
)
имеют событие onfocus
,
которое вызывает функцию selectContents()
.
В качестве параметра функции передается сам объект (на это указывает служебное
слово this). В функции вызывается метод select
для
выделения объекта.
Событие onblur в javascript: потеря фокуса
- Событие
onblur
происходит при потере объектом фокуса. Т.е. когда курсор только что размещался на/в объекте, а теперь помещается на/в другой объект.
onblur
(вызывается
функция с параметром)
Выполнение:
Скрипт:
HTML-код:
Объект canvas
- Для рисования в javascript прежде всего необходимо добавить объект canvas, который имитирует «холст» художника. Данный объект поддерживается всеми браузерами современных версий, но некоторые устаревшие версии не поддерживают его. Значением атрибута id также уместно назначить «canvas»:
- Размеры канваса по умолчанию: 300 px × 150 px (width × height), но можно устанавливать произвольные размеры.
- Для canvas желательно установить какой-либо стиль (css), добавив, например, рамку, или задав задний фон.
- Кроме того, объект может служить контейнером других объектов (например, изображений) и текста:
- Главным методом объекта canvas является метод getContext(), который используется для получения основных функций рисования. У метода один параметр, указывающий на поддержку типа графики (2d или 3d).
- Добавим javascript-код с обращением к объекту canvas и установкой поддержки 2d-графики:
ПРОВЕРКА ПОДДЕРЖКИ CANVAS
- Далее добавим javascript-код с обращением к объекту canvas и проверкой поддержки его браузером:
- Рассмотрим
код полностью:
РИСОВАНИЕ ФИГУР (ПРИМИТИВОВ)
- Отсчет координатной плоскости находится в левом верхнем углу объекта canvas:
- Canvas поддерживает рисование только одной фигуры — прямоугольника. Остальные фигуры могут получиться из прямых и точек.
- Рисование прямоугольника:
- Залитый
цветом прямоугольник:
fillRect(x, y, width, height)
- Прямоугольный
контур:
strokeRect(x, y, width, height)
- Очистка
прямоугольной области (прозрачный прямоугольник):
clearRect(x, y, width, height)
-
ВЫБОР ЦВЕТА В CANVAS
Для выбора цвета заливки используется метод:
- В
системе RGB без указания уровня прозрачности:
fillStyle = ‘rgb(0-255, 0-255, 0-255)’;
- В
системе RGB с указанием уровня прозрачности:
fillStyle = ‘rgba(0-255, 0-255, 0-255, 0.1-0.9)’;
- В качестве заливки по умолчанию стоит черный цвет.
Рисование путей в canvas
- Путь представляет собой набор точек, соединенных прямыми линиями или кривыми. Линии могут быть разной ширины, кривизны и цвета
- Рассмотрим этапы построения путей и функции рисования путей в javascript canvas:
- 1.
Создание пути. Когда путь создан остальные команды уже работают над созданным
путем:
beginPath()
- 2. Выбор метода построения пути (кривая, прямая, кривая безье) или переход в новую точку:
- переход
в новую точку с указанными координатами:
CanvasRenderingContext2D.moveTo()
- соединение
прямой линией последней использованной координатой с точкой x, y:
CanvasRenderingContext2D.lineTo()
- добавление
кубической кривой безье (требуется три точки: первые две (cp1x, cp1y, cp2x,
cp2y) — контрольные, последняя — конец линии; начальной точкой является
последняя указанная точка, или точка, к которой перешли командой moveTo())
CanvasRenderingContext2D.bezierCurveTo()
- добавление
квадратичной кривой безье (cpx — координата х контрольной точки, cpy —
координата y контрольной точки):
CanvasRenderingContext2D.quadraticCurveTo()
- добавление
дуги с центром в точке x и y и
радиусом r с
позиции startAngle до endAngle(по умолчанию движение дуги по
часовой стрелке)
CanvasRenderingContext2D.arc()
- добавление
дуги, соединенной с предыдущей точкой прямой линией:
CanvasRenderingContext2D.arcTo()
- добавление
эллипса к пути с центром в точке x и y и радиусом radiusX и radiusY с началом
в startAngle и окончанием
в endAngle:
CanvasRenderingContext2D.ellipse()
- создание
прямоугольного пути:
CanvasRenderingContext2D.rect()
- 3.
Конец пути — соединением прямой линией предпоследней точки с начальной точкой
пути
closePath()
- 4.
Рисование пути:
stroke()
- 5.
Закраска внутренней области пути:
fill()
Событие javascript onresize объекта window
Событие onresize
объекта
window ответственно за изменение размеров окна браузера. Поэтому событие и
принадлежит объекту окно — window
.
Поскольку
среди элементов html нету тега, отождествленного с окном браузера, то обработать
в javascript событие onresize
можно
при помощи присваивания функции свойству объекта window.
Рассмотрим на примере:
Скрипт:
либо так:
HTML-код:
Объект javascript выпадающий список — select
Объект
select — выпадающий список — предоставляет список значений для выбора. Выбор
может быть как одного пункта, так и нескольких пунктов сразу. Это сложный
объект, обращение к которому в скрипте происходит и как к
объекту select
,
и как к его пункту option
.
Свойства объекта select:
- length — количество пунктов списка
- name — атрибут name
- options[] — массив пунктов
- selectedIndex — индекс выбранного пункта option
- defaultSelected — выбранный пункт option по умолчанию
- selected — выбранный пункт
Получить
значение выпадающего списка (select) в javascript можно через
свойство value
.
Но есть и другие способы.
Рассмотрим пример:
value
выбранного
option (пункта) списка и вывести его на экранHTML-код:
Идентификация значения списка:
Скрипт:
HTML-код:
Рассмотрим
пример использования свойства объекта select — selectedIndex
—
выбранный пункт option:
В
данном примере при изменении пункта меню генерируется
событие onChange
.
В качестве значения атрибута onChange
выполняется
скрипт: происходит обращение к текстовому полю через массив элементов формы
(текстовое поле — это первый элемент массива, т.к. 0-й элемент — это выпадающий
список select). В качестве значения текстового поля указывается номер выбранного
пункта списка (selectedIndex
).
ОБЪЕКТ JAVASCRIPT OPTION — ПУНКТ МЕНЮ
Пункт
меню select в javascript — option
—
рассматривается как отдельный объект со своими свойствами:
text
— строка текста, которая размещается в контейнере LIvalue
— значение, которое передается серверу при выборе альтернативы, связанной с объектом OPTIONselected
— альтернатива выбрана(true/false)
Доступ к конкретному пункту меню происходит через коллекцию (массив) options:
Скрипт
доступа к первому пункту выпадающего меню (нулевой элемент
массива options
):
text
объекта
option:Рассмотрим еще одно решение с использованием списка множественного выбора:
(установить для списка атрибут
multiple
)
Свойства outerHTML и innerHTML в javaScript
innerHTML
в javaScript — это директива для формирования или замены содержимого какого-либо
элемента.
Рассмотрим выполненный пример:
outerHTML
в javaScript — это директива для формирования или замены содержимого какого-либо
элемента вместе с самим элементом.
Пример: