Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
А. В. Титков, С. А. Черепанов
СОЗДАНИЕ ВЕБ-ПРИЛОЖЕНИЙ
Учебное пособие
Томск
«Эль Контент»
2014
УДК 004.42:004.738.52(075.8)
ББК 32.973.202я73
Т 452
Рецензенты:
Ефимов А. А., канд. техн. наук, доцент кафедры
автоматизации обработки информации ТУСУРа;
Соловьев Д. А., канд. техн. наук, директор Nikolas group.
Титков А. В.
Т 452 Создание веб-приложений : учебное пособие / А. В. Титков, С. А. Че-
репанов. — Томск : Эль Контент, 2014. — 72 с.
ISBN 978-5-4332-0182-8
Введение 4
3 Шаблоны 26
3.1 Работа с шаблонами в Django . . . . . . . . . . . . . . . . . . . . . . . . 26
Заключение 67
Литература 68
Глоссарий 69
ВВЕДЕНИЕ
КЛИЕНТ-СЕРВЕРНЫЕ ПРИЛОЖЕНИЯ
И ОСНОВЫ ЯЗЫКА PYTHON
числительную сеть.
Поддержка работы данной системы часто требует отдельного специали-
ста — системного администратора.
Высокая стоимость оборудования [1].
Веб-сайты являются частным случаем такой архитектуры, когда общение меж-
ду клиентом и сервером происходит через сеть Интернет по протоколу HTTP. Роль
клиентской части выполняет браузер, который реализует пользовательский интер-
фейс, формирует запросы к серверу и обрабатывает ответы от него.
Серверная часть получает запрос от клиента, выполняет вычисления, после
этого формирует веб-страницу и отправляет её клиенту по сети с использованием
протокола HTTP.
Ярким примером веб-приложения является система управления содержимым
статей Википедии: множество её участников могут принимать участие в создании
сетевой энциклопедии, используя для этого браузеры своих операционных систем
(будь то Microsoft Windows, GNU/Linux или любая другая операционная система)
и не загружая дополнительных исполняемых модулей для работы с базой данных
статей.
В настоящее время набирает популярность новый подход к разработке веб-
приложений, называемый Ajax. При использовании Ajax страницы веб-приложе-
ния не перезагружаются целиком, а лишь догружают необходимые данные с сер-
вера, что делает их более интерактивными и производительными.
Для создания веб-приложений на стороне сервера используются разнообраз-
ные технологии и многие языки программирования, такие, как PHP, C++, ASP.NET,
Perl, Ruby, Python или JavaScript (с помощью платформы NodeJS).
Клиентская часть обычно создается с помощью языка разметки HTML для
определения того, что должно быть на странице, каскадных таблиц стилей для
того, чтобы описать, как контент должен выглядеть, и языка сценариев JavaScript
для того, чтобы создавать динамические изменения контента и стилей.
Как было описано, веб-приложения активно используют протокол HTTP для
передачи данных. Говоря простыми словами, HTTP представляет из себя некий
1.1 Основы работы клиент-серверных приложений 7
b = 2
a,b = b,a
print a,b
# 2 1
x = 12,
x
# (12,)
Как видно из примера, кортеж может быть использован и в левой части опе-
ратора присваивания. Значения из кортежа в левой части оператора присваивания
связываются с аналогичными элементами правой части. Этот факт как раз и да-
ет такие замечательные возможности, как массовая инициализация переменных
и возврат множества значений из функции одновременно. Последний пример де-
монстрирует создание кортежа из одного элемента (его часто называют синглтоном).
Списки. В Python отсутствуют массивы в традиционном понимании этого тер-
мина. Вместо них для хранения однородных (и не только) объектов используются
списки. Они задаются тремя способами.
Простое перечисление.
Примеры работы со списками:
a = [2, 2.25, ''Python'']
print a
# [2, 2.25, 'Python']
# Преобразовать строку в список
list = list(''help'')
print list
# ['h', 'e', 'l', 'p']
Создать список можно с помощью генератора, который позволяет иницииро-
вать значения в одну строку кода. В данном случае создастся список, содержащий
кубы всех нечетных чисел от 0 до 19.
Пример генератора списков:
list = [x ∗∗ 3 for x in range(20) if x%2==1]
print list
# [1, 27, 125, 343, 729, 1331, 2197, 3375, 4913, 6859]
Для работы со списками определен ряд операторов и функций (в каждом при-
мере переменная list является представителем списка):
len(list) — Длина последовательности list.
list[i] — Возвращает i-й элемент list или len(list) + i-й, если i < 0.
list[i:j:d] — Срез из последовательности list от i до j с шагом d будет рас-
сматриваться ниже.
min(list) — Наименьший элемент list.
max(list) — Наибольший элемент list.
list[i] = x — I-й элемент списка list заменяется на x.
list[i:j:d] = t — Срез от i доj (с шагом d) заменяется на (список) t.
del list[i:j:d] — Удаление элементов среза из последовательности.
Кроме того, для списков определен ряд методов:
list.append(x) — Добавляет элемент в конец последовательности.
list.count(x) — Считает количество элементов, равных x.
list.extend(s) — Добавляет к концу последовательности последовательность
list.
list.index(x) — Возвращает наименьшее list, такое, что list[i] == x. Возбуж-
дает исключение ValueError, если x не найден в list.
list.insert(i, x) — Вставляет элемент x в i-й промежуток.
list.pop(i) — Возвращает i-й элемент, удаляя его из последовательности.
list.reverse() — Меняет порядок элементов list на обратный.
list.sort([cmpfunc]) — Сортирует элементы list. Может быть указана своя функ-
ция сравнения cmpfunc.
Для преобразования кортежа в список есть функция list, для обратной опера-
ции — tuple.
Об индексировании списков и выделении подпоследовательностей следует еще
раз упомянуть отдельно (этот механизм работает аналогично и для строк). Для по-
лучения элемента используются квадратные скобки, в которых находится индекс
элемента. Элементы нумеруются с нуля. Отрицательное значение индекса указыва-
ет на элементы с конца. Первый с конца списка (строки) элемент имеет индекс −1.
Примеры индексации списков:
s = [0, 1, 2, 3, 4]
print s[0], s[-1], s[3]
# 0 4 3
s [2] = -2
print s
# [0, 1, -2, 3, 4]
del s [2]
print s
# [0, 1, 3, 4]
Сложнее обстоят дела со срезами. Для получения срезов последовательности
в Python принято указывать не номера элементов, а номера «промежутков» между
ними. Перед первым элементом последовательности промежуток имеет индекс 0,
1.1 Основы работы клиент-серверных приложений 15
#Цикл по значениям
for v in h3.values():
print v
# 2
# 3
# 1
#Добавление элементов из другого словаря
h1.update(h3)
#Количество пар в словаре
print len(h1)
#6 [4].
Функции. Язык Python предоставляет возможность оформления блоков про-
граммного кода в виде функций, параметризуемых аргументами, которые им пере-
даются. Ниже приводится общий синтаксис определения функции.
Пример создания функций:
def functionName(argument1, argument2):
# нельзя забывать добавление двоеточия
# аргументы к функции перечислять через запятую
print argument1, argument2
return True
# с помощью оператора return можно определить то,
# должна возвращать что функция
Часть argument1, argument2 не является обязательной; для передачи несколь-
ких аргументов их необходимо отделить друг от друга запятыми. Любая функ-
ция в языке Python возвращает некоторое значение — по умолчанию это значение
None; если явно не возвращается значение с помощью инструкции return value,
где value — это возвращаемое значение. Возвращаемое значение может быть един-
ственным значением или кортежем возвращаемых значений. Возвращаемое зна-
чение может игнорироваться вызывающей программой, в этом случае оно просто
уничтожается.
Примечательно, что инструкция def действует как оператор присваивания. При
выполнении инструкции def создаются новый объект функция и ссылка на объект
с указанным именем, которая указывает на объект функцию. Поскольку функции —
это объекты, они могут сохраняться в виде элементов коллекций и передаваться
в качестве аргументов другим функциям, в чем вы сможете убедиться в последу-
ющих главах.
Пример функции, которая принимает от пользователя строку и пытается пре-
образовать её в число, если преобразование проходит с ошибкой, то пользователя
вновь просят ввести строку с числом.
Функция, преобразующая полученную от пользователя строку в целое число:
def get int(msg):
while True:
try:
i = int(input(msg))
Контрольные вопросы по главе 1 17
return i
except ValueError as err:
print(err)
Ниже показан пример использования этой функции.
Пример использования функции, которая преобразует введенное пользовате-
лем значение в число:
age = get int(''Введите свой возраст: '') [5].
.................................................................
Контрольные вопросы по главе 1
.................................................................
.................................................................
«Если у вас есть достаточно продолжительный опыт создания
веб-приложений, то вы наверняка знакомы с проблемами, при-
сущими рассмотренному выше примеру CGI-сценария. Классиче-
ский веб-разработчик проходит такой путь:
1. Пишет веб-приложение с нуля.
2. Пишет еще одно веб-приложение с нуля.
3. Осознает, что первое веб-приложение имеет много обще-
го со вторым.
4. Перерабатывает код так, чтобы некоторые вещи из пер-
вого приложения можно было использовать повторно во
втором.
5. Повторяет шаги 2–4 несколько раз.
6. Понимает, что он придумал фреймворк.
Именно так и был создан Django!» [6].
.................................................................
Как уже говорилось выше, каждый проект в Djаngo — это набор нескольких
приложений, каждое из которых выполняет свою узконаправленную задачу. Что-
бы добавить в Django-проект новое приложение, достаточно выполнить команду
добавления нового приложения в проект:
python manage.py startapp app name,
где вместо app name нужно указать имя будущего приложения. Данная команда
создаст внутри папки проекта новую директорию app name и несколько файлов
внутри неё.
Файловая структура нового приложения:
new app/
init .py
models.py
tests.py
views.py
Как вы уже знаете, весь код, который определяет данные и обработку данных,
должен описываться в файле models.py. Например, для приложения авторизаци-
и/регистрации пользователей в файле models.py должна описываться структура баз
данных для пользователей, методы создания нового пользователя, изменения со-
стояния уже зарегистрированных и так далее. Файл view.py служит для того, чтобы
при запросе на определенный адрес вызывать нужные методы models.py и полу-
ченные из моделей данные передавать в шаблоны, чтобы затем вернуть сформи-
рованный из шаблонов HTML-код пользователю.
.................................................................
Контрольные вопросы по главе 2
.................................................................
ШАБЛОНЫ
Также вам обязательно нужно знать, что создавать вручную объекты Template,
затем объекты Context, а потом вызывать метод render первого, передавая туда
контекст, необязательно. Естественно, как и все уважающие себя программисты,
создатели Django создали автоматизированный вариант этого кода, который умеща-
ется всего. . . в одну строку кода, куда уж короче! Для этого была создана функция
render, которая находится в модуле django.shortcuts. Пользоваться этой функцией
очень просто.
Пример использования функции render():
from django.shortcuts import render
def some view(request):
return render(request,
‵some template.html′,
{
‵context key1′:‵context value1′,
‵context key2′:‵context value2′,
}
)
Здесь функции render в качестве первого аргумента передается объект запро-
са, который должен быть в каждом представлении, вторым аргументом идет имя
шаблона, который сохранен в одной из папок templates ваших приложений, а тре-
тий аргумент — не что иное, как словарь, содержащий контекст вашего шаблона.
.................................................................
Контрольные вопросы по главе 3
.................................................................
СТАТИЧНЫЕ ФАЙЛЫ
В DJANGO-ПРОЕКТАХ И РАБОТА С CSS
2) селектор по тегу;
пример селектора по тегу:
p {font-family: Garamond, serif;}
3) селектор классов;
пример селектора классов:
.note {color: red; background: yellow; font-weight: bold;}
4) селектор идентификаторов;
пример селектора идентификатора:
#paragraph1 {margin: 0;}
5) селектор атрибутов;
пример селектора атрибутов:
a[href=''http://www.somesite.com''] {font-weight: bold;}
h1 + p {font-size: 24px;}
/*
в данном случае стиль применится к элементам
тега p, которые находятся непосредственно после
элементов h1
к элементу h1 стиль НЕ применится
*/
9) селектор псевдоклассов;
пример селектора псевдоклассов:
a:hover {color: yellow;}
/*
в данном случае стиль применится к элементам-ссылкам
тега a, которые находятся в наведенном состоянии;
как только пользователь уберет курсор с элемента,
эти стили отменятся
*/ [8].
Чтобы задать класс или идентификатор элементу, достаточно воспользоваться
соответствующими атрибутами тегов.
Пример добавления класса к HTML-тегу:
<a href=′′/′′ class=′′cool-link′′>Я хорошая ссылка,
кликни по мне</a>
таким образом задаются классы.
Пример добавления идентификатора к HTML-тегу:
<a href=′′/′′ id=′′cool-link′′>Я хорошая ссылка,
кликни по мне</a>
а таким образом идентификаторы. Первые от вторых отличаются тем, что иден-
тификатор может быть только у одного элемента, и у каждого элемента не может
быть больше одного идентификатора, а на классы такое ограничение не наложено.
Соответственно, когда вы ищете элемент по идентификатору, можете не беспоко-
иться, что отыщется два или более элементов (если, конечно, верстку грамотный
специалист делал и ошибок не натворил), что особенно часто требуется при мани-
пулировании элементами с помощью JavaScript. Также следует упомянуть важную
особенность: чтобы одному элементу задать несколько классов, нужно перечис-
лить их через пробел.
Пример добавления нескольких классов к HTML-тегу:
<a href=′′/′′ class=′′cool-link click-me one-more-class′′>
У меня целых три класса!</a>
Контрольные вопросы по главе 4 33
.................................................................
Контрольные вопросы по главе 4
.................................................................
МОДЕЛИ, ПРЕДСТАВЛЕНИЯ
И КОНФИГУРАЦИЯ URL В DJANGO
Можно было бы применить другой подход: сделать словарь, где каждый ключ —
опять же название столбца, и по этому ключу хранится ещё один, вложенный,
словарь, в котором каждый ключ — это уже название строки. Однако и такой вари-
ант не очень удобен, ведь пришлось бы для каждого столбца заново прописывать
название строки.
Другой пример словаря с данными:
{
‵‵age′′: {‵‵George′′: 32, ‵‵Mike′′: 25, ‵‵Steve′′:43},
36 Глава 5. Модели, представления и конфигурация URL в Django
urlpatterns = patterns(‵′,
# Пример:
# (r′∧ mysite/′, include(‵mysite.foo.urls′)),
# Раскомментировать строку admin/doc ниже и добавить
# ‵django.contrib.admindocs′ в INSTALLED APPS для активации
# документации по административному интерфейсу:
# (r′∧ admin/doc/′, include(‵django.contrib.admindocs.urls′)),
# Раскомментировать следующую строку для активации
# административного интерфейса:
# (r′∧ admin/′, include(admin.site.urls)),
)
В этой конфигурации URL по умолчанию некоторые часто используемые функ-
ции Django закомментированы, для их активации достаточно раскомментировать
соответствующие строки. Если не обращать внимания на закомментированный
код, то конфигурация URL сведется к следующему коду. Пример файла конфи-
гурации URL без комментариев:
from django.conf.urls.defaults import *
urlpatterns = patterns(‵′,
)
.................................................................
Контрольные вопросы по главе 5
.................................................................
Поэтому на свет появились cookies. Cookie — это небольшой блок информации, ко-
торый отправляется веб-сервером и сохраняется браузером. Запрашивая любую
страницу с некоторого сервера, браузер посылает ему блок информации, который
получил от него ранее.
Посмотрите, как действует этот механизм. Когда вы открываете браузер и вво-
дите в адресной строке google.com, браузер посылает серверу Google HTTP-запрос,
который начинается так (пример запроса на страницу google.com/):
GET / HTTP/1.1
Host: google.com
...
Полученный от Google ответ выглядит приблизительно так (пример ответа на
запрос страницы по адресу google.com/):
HTTP/1.1 200 OK
Content-Type: text/html
Set-Cookie:
PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671;
expires=Sun, 17-Jan-2038 19:14:07 GMT;
path=/; domain=.google.com
Server: GWS/2.1
...
Обратите внимание на заголовок Set-Cookie. Браузер сохранит значение cookie
(PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671) и будет отправлять
его Google при каждом обращении к этому сайту. Поэтому при следующем по-
сещении сайта Google запрос, отправленный браузером, будет иметь такой вид
(пример следующего запроса на страницу google.com/):
GET / HTTP/1.1
Host: google.com
Cookie:
PREF=ID=5b14f22bdaf1e81c:TM=1167000671:LM=1167000671
...
Обнаружив заголовок Cookie, Google понимает, что запрос пришел от челове-
ка, уже посещавшего сайт. Значением cookie может быть, например, ключ в таб-
лице базы данных, где хранятся сведения о пользователе. И Google мог бы (да,
собственно, так и делает) отобразить на странице имя вашей учетной записи [6].
Соответственно, если вы пожелаете создать систему авторизации и регистра-
ции пользователей на своем сайте, вам придется с помощью cookie в браузере
клиента хранить данные о том, что текущий пользователь — это тот человек, кото-
рый регистрировался на сайте полгода назад под ником «Vasya». Так что первое
пришедшее решение «в лоб»: когда юзер входит в аккаунт (введя логин и пароль),
можно просто ему ставить cookie «username=vasya;» и cookie будет прилеплена
ко всем запросом. От вас потребуется лишь каждый раз читать значение cookie
и радоваться, что такая система авторизации работает.
Однако тут есть маленькая проблема безопасности: любой злоумышленник
сможет вручную установить у себя в браузере cookie «username=vasya;» и притво-
Контрольные вопросы по главе 6 49
риться Васей! Он сможет читать его сообщения и рассылать спам от его имени!
Естественно, это довольно легко решается, чуть-чуть усложнив систему на сто-
роне сервера. Надо лишь устанавливать в куках не значение никнейма пользова-
теля, а лишь какой-то бессмысленный для посторонних идентификатор, символов
этак в 20. Тогда вам при каждом запросе достаточно всего лишь на сервере этот
уникальный идентификатор проверять, в базе данных отыскивать, какому пользо-
вателю соответствует переданный id. В случае такой системы авторизации, чтобы
взломать Васю, придется угадать именно тот айди, который сейчас установлен
у аккаунта Васи (к тому же чаще всего id будет меняться время от времени). Та-
кой подход к авторизации называется сессиями, а самому идентификатору внутри
cookies присваивается имя наподобие session id.
В принципе, чтобы это всю подобную систему проверить в действии, доста-
точно сначала зайти в административной панели Django в свой аккаунт, затем
на вкладке Resourses панели разработчиков Chrome найти установленные cookies.
Среди них как раз должна находиться cookies с именем sessionid. Она-то при каж-
дом, даже пустом, запросе передается серверу, считывается и определяет пользо-
вателя, который этому идентификатор соответствует. Ниже на рисунке 6.1 показан
скриншот, который иллюстрирует, как в браузере найти установленные cookies:
.................................................................
Контрольные вопросы по главе 6
.................................................................
– сложение: «+»;
– вычитание: «−»;
7.1 Базовые операторы, типы данных,
функции и глобальные переменные JavaScript 53
– умножение: «∗»;
– деление: «/»;
– вычисление остатка от деления: «%»;
– инкремент (увеличение на единицу): «++»;
– декремент (уменьшение на единицу): «−−»;
присваивания:
– простое присваивание: «=»;
– присвоить переменной результат сложения: «+ =»;
– присвоить переменной результат вычитания: «− =»;
– присвоить переменной результат умножения: «∗ =»;
– присвоить переменной результат деления: «/ =»;
– присвоить переменной результат вычисления остатка от деления: «% =»;
сравнения:
– равенство: «==»;
– равенство по значению и типу объекта: «===»;
– неравенство: «! =»;
– больше чем: «>»;
– меньше чем: «<»;
– больше или равно: «>=»;
– меньше или равно: «<=»;
логические:
– И: «&&»;
– ИЛИ: «∣∣»;
– НЕ: «!».
Массивы. Массивы похожи на переменные, но отличаются от них тем, что
могут хранить несколько значений и выражений под одним именем. Возможность
хранения нескольких значений в одной переменой — это главное преимущество
массива. В JavaScript для массивов не существует ограничений на количество или
тип данных, которые будут в нем храниться, пока эти данные находятся в области
видимости массива. Доступ к значению любого элемента массива можно получить
в любой момент времени после объявления массива в сценарии. Хотя в JS-массиве
можно хранить данные любого типа, включая другие массивы, обычно в масси-
ве хранятся однородные данные и его название также каким-то образом связано
с хранящимися данными. Ниже представлены примеры использования массивов
для хранения однородных данных.
Пример создания массива:
var colors = new Array(''orange'', ''blue'', ''red'', ''brown'');
// можно создавать массивы с помощью функции Array
var shapes = ['' circle'', '' square'', '' triangle'', '' pentagon''];
54 Глава 7. Основы языка сценариев JavaScript
Чтобы прочитать свойство объекта, можно имя свойства указать через точку
либо внутри квадратных скобок. Пример обращения к свойству через точку и через
квадратные скобки:
someMan.name // ‵John′
someMan[‵age′] // 30
Чтобы изменить атрибут объекта, достаточно использовать оператор присваи-
вания для этого атрибута (кстати, если такого атрибута не существует у объекта,
то он будет создан, и это главный способ создания новых ключей и их значений).
Пример изменения и создания атрибутов объекта:
someMan[‵age′] = 31; // теперь Джону стукнул 31
someMan[‵occupation′] = ‵doctor′;
// и у него появилась профессия — он стал доктором
Условия. Во всех языках программирования основой для создания бизнес-
логики являются условные выражения, и JavaScript — не исключение. Условные
выражения определяют, какое действие должно быть выполнено в зависимости от
условий, установленных в сценарии.
Пример оператора условия:
var num = 10;
if(num == 5)
{
console.log(''num равно 5'');
}
else
{
console.log(''num НЕ равно 5, num равно: ''+ num);
}
Функции. Функции обладают целым рядом преимуществ. Во-первых, они слу-
жат контейнерами для сценариев, которые будут выполняться только при наступ-
лении события или вызове функции. Также функции не выполняются при первой
загрузке Web-страницы, когда Web-браузер загружает и выполняет сценарии, на-
ходящиеся на этой странице. Предназначение функции — хранить код для выпол-
нения определенной задачи, чтобы его можно было вызвать в любое время.
Функция оформляется в коде очень просто: она начинается с ключевого сло-
ва function, за которым следует пробел и название функции. Название функции
может быть любым, но желательно, чтобы оно имело отношение к задаче, кото-
рую выполняет функция. Ниже приведен пример функции, изменяющей значение
существующей переменной.
Пример создания функции:
var num = 10;
function changeVariableValue() {
num = 11;
}
changeVariableValue();
console.log(''num равно: ''+ num);
56 Глава 7. Основы языка сценариев JavaScript
i++;
} [9].
Также в JavaScript довольно большую роль играют глобальные объекты window
и document.
Объект window сочетает два в одном: глобальный объект javascript и окно бра-
узера.
Для обращения к функциям и методам window не нужно указывать объект.
Обращение к функции decodeURI через объект window и без него:
window.decodeURI(. . .)
// то же что и
decodeURI(. . .)
Вообще, любая переменная в конечном счете (если не найдена локально) ищет-
ся в глобальном объекте.
Ко всем глобальным объектам можно обращаться как к свойстам window:
// можно указать window явно — будет работать:
str = new window.String(''test'')
a = new window.Array(1,2,3)
58 Глава 7. Основы языка сценариев JavaScript
поддерживает браузер.
winName — имя нового окна.
winParams — необязательный список настроек, с которыми открывать но-
вое окно.
Функция close():
window.close()
закрывает текущее окно. Если закрываемое окно не было открыто при помощи
window.open(), то при его закрытии выводится предупреждение. Посетитель может
отклонить закрытие [10].
В свою очередь объект document представляет собой «окно» для работы с DOM
вашей HTML-разметки. Если вам будет нужно найти какой-либо элемент в DOM-е,
изменить у какого-либо элемента CSS-свойство или удалить целую ветку элемен-
тов, вам придется иметь дело с document, даже когда вы этого явно не делаете (на-
пример, далее будет описываться библиотека jQuery, которая позволяет не писать
много шаблонного кода и сама за программиста работает напрямую с объектом
document).
.................................................................
Контрольные вопросы по главе 7
.................................................................
</li>
</ol>
</body>
</html>
Внутри <html> находятся два узла: <head> и <body> — они становятся дочер-
ними узлами для <html>. Теги образуют узлы-элементы (element node). Текст пред-
ставлен текстовыми узлами (text node). И то, и другое — равноправные узлы дерева
DOM.
На рисунке 8.1 схематически представлена структура созданной разметки, если
внутри квадрата указано название тега, то это элемент-узел, а если просто написан
текст, то, соответственно, это текстовый элемент.
ol.appendChild(firstChild)
// элемент ранее бывший первым теперь стал вторым, потому что
// когда его добавили, в списке уже была занята одна позиция.
У DOM-элементов есть масса свойств. Обычно используется максимум треть
из них. Некоторые из них можно читать и устанавливать, другие — только читать.
tagName — Атрибут есть у элементов-тегов и содержит имя тега в верхнем ре-
гистре, только для чтения.
Использование атрибута tagName:
console.log(document.body.tagName) // => BODY
style — Это свойство управляет стилем. Оно аналогично установке стиля в CSS.
Есть общее правило замены — если CSS-атрибут имеет дефисы, то для установки
style нужно заменить их на верхний регистр букв. Например, для установки свой-
ства z-index в 1000, нужно поставить:
Использование атрибута zIndex:
element.style.zIndex = 1000
innerHTML — оно содержит весь HTML-код внутри узла, и его можно менять.
Свойство innerHTML применяется, в основном, для динамического изменения со-
держания страницы, например (использование атрибута innerHTML):
document.getElementById('footer').innerHTML = '<h1>Bye!</h1>
<p>See you later!</p>'
Пожалуй, innerHTML — одно из наиболее часто используемых свойств DOM-
элемента.
onclick, onkeypress, onfocus. . . — и другие свойства, начинающиеся на «on. . .»,
хранят функции-обработчики соответствующих событий. Например, можно при-
своить обработчик события «click» [11].
Теперь нужно узнать поподробней о том, как работает поиск элементов по
DOM. Вы уже видели минимум две реализации поиска: первый с помощью метода.
Пример метода getElementsByTagName:
document.getElementsByTagName()
этот метод возвращает множество всех элементов, которые имеют заданный в ар-
гументах тег. Например, поиск всех элементов div в DOM:
document.getElementsByTagName(‵div′)
вернет все элементы <div> на странице. Естественно, работать напрямую с каждым
элементом можно, только если обращаться к каждому элементу по индексу.
Добавление всем элементам div в DOM-е текста с номером текущего элемента:
allDivs = document.getElementsByTagName(‵div′)
for (var i=0; i < colors.allDivs; i++){
allDivs[i].innerTHML = ‵‵<p>Это ‵‵ + i + ‵‵-й блок</p>‵‵
}
allDivs[i] — именно с помощью такого обращения можно найти один конкрет-
ный элемент.
8.1 Манипуляции элементами DOM, добавление
обработчиков на пользовательские события 63
.................................................................
Контрольные вопросы по главе 8
.................................................................
.................................................................
Контрольные вопросы по главе 9
.................................................................
[7] Форсье Джефф. Django. Разработка веб приложений на Python : пер. с англ. /
Джефф Форсье, Пол Биссекс, Уэсли Чан. — Спб. : Символ Плюс, 2009. —
456 с.
[11] Кантор Илья. Введение. DOM в примерах [Электронный ресурс] // Илья Кан-
тор. — URL : http://javascript.ru/tutorial/dom/intro (дата обращения: 24.05.2014).
ГЛОССАРИЙ
СОЗДАНИЕ ВЕБ-ПРИЛОЖЕНИЙ
Учебное пособие
Корректор Осипова Е. А.
Компьютерная верстка Насынова Н. Е.