Содержание
| Часть 1. Prototype | |
| Глава 1. Что следует знать о Prototype, JavaScript, и DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . | 3 |
| JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 3 |
| Всё в JavaScript является объектом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 4 |
| Структура DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
8 |
| Сложность написания межплатформенного кода JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . |
8 |
| Сложность отладки межплатформенного кода JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . |
9 |
| Об этой книге . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
9 |
| Firefox использовался почти во всех примерах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
9 |
| Сначала теория, потом практика . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
10 |
| Библиотека Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
10 |
| Философия Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
10 |
| Цели и возможности Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
11 |
| Веб-сайт Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
11 |
| Содействие развитию Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
11 |
| Начало работы с Prototype. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
12 |
| Создание страницы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 12 |
| Загрузка Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 12 |
| Подключение Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 13 |
| Тестирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 14 |
| Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 16 |
| Глава 2. Основы Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
17 |
| Начало работы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 17 |
| Функция $ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 18 |
| В функцию $ можно передавать и строки и узлы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 19 |
| В функцию $ можно передавать множество параметров. . . . . . . . . . . . . . . . . . . . . . . . . . . . | 19 |
| Функция $ наделяет узлы DOM полезной фунциональностью. . . . . . . . . . . . . . . . . . . . . . . . | 20 |
| Метод Object.extend: безболезненное объединение объектов . . . . . . . . . . . . . . . . . . . . . . . . . | 21 |
| Функция $A: приведение коллекций к массивам . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 24 |
| Переменная arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 25 |
| Коллекция DOM NodeList. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 25 |
| Функция $$: формирование сложных запросов узлов DOM . . . . . . . . . . . . . . . . . . . . . . . . . . | 26 |
| Резюме. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 29 |
| Глава 3. Коллекции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 31 |
| Традиционный цикл for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 31 |
| Функциональное программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 32 |
| Объект Enumerable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 34 |
| Метод Enumerable#each. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 34 |
| Поиск иголок в стогах сена: методы detect, select, reject и partition . . . . . . . . . . . . . . . . . . . . . | 35 |
| Метод Enumerable#detect . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 35 |
| Метод Enumerable#select. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 36 |
| Метод Enumerable#reject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 36 |
| Метод Enumerable#partition. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 36 |
| Сортировка коллекций: методы min, max и sortBy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 36 |
| Методы Enumerable#min и #max . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 37 |
| Методы Enumerable#sortBy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 37 |
| Расширенные методы перечисления: map, inject, invoke и pluck . . . . . . . . . . . . . . . . . . . . . . . | 38 |
| Методы Enumerable#map и Enumerable#inject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 38 |
| Методы Enumerable#pluck и Enumerable#invoke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 40 |
| Другие коллекции, которые используют Enumerablee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 41 |
| Класс Hash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 41 |
| Класс ObjectRange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 45 |
| Преобразование коллекций в массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 46 |
| Использование Enumerable в пользовательских коллекциях . . . . . . . . . . . . . . . . . . . . . . . . | 46 |
| Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 48 |
| Глава 4. Ajax : эффективное клиент-серверное взаимодействие. . . . . . . . . . . . . . . . . . . . . . . |
49 |
| Достоинства Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
49 |
| Недостатки Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 50 |
| Объект Ajax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 50 |
| Класс Ajax.Request. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 52 |
| Класс Ajax.Updater . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
56 |
| Класс Ajax.PeriodicalUpdater . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 60 |
| Управление потоком запросов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
60 |
| Расширенные примеры: работа с динамическим содержимым. . . . . . . . . . . . . . . . . . . . . . . . |
62 |
| Пример 1: Blog (Breakfast Log). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 62 |
| Пример 2: Fantasy Football . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 74 |
| Резюме. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 89 |
| Глава 5. События . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
91 |
| Текущее положение дел в мире броузеров (Или что мы имеем на сегодняшний день) . . . . . . |
91 |
| Что было до DOM, часть 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
91 |
| Что было до DOM, часть 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
92 |
| События: интенсивный курс . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
94 |
| Методы Event#stopPropagation, Event#preventDefault и Event#stop . . . . . . . . . . . . . . . . . . . . |
99 |
| Дополнительный пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
101 |
| События и формы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
102 |
| Проверка данных на стороне клиента . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
102 |
| Очистка кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
107 |
| Пользовательские события . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
108 |
| Первое пользовательское событие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
109 |
| Широковещательная передача информации о счете . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
109 |
| Прослушивание счета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
110 |
| Резюме. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 111 |
| Глава 6. Работа с DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 113 |
| DOM API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
113 |
| Генеалогия узлов DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
113 |
| Расширения DOM в Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
115 |
| Изменение DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
115 |
| Обход и сбор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
128 |
| Создание узлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
132 |
| Собираем все вместе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
135 |
| Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 137 |
| Глава 7. Современный JavaScript: функциональное и объектно-ориентированное программирование |
139 |
| Объектно-ориентированное программирование JavaScript и Prototype . . . . . . . . . . . . . . . . . . . |
139 |
| Почему ООП? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 139 |
| Пространство имен . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 141 |
| Использование классов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 142 |
| Паттерн DOM Behavior . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 148 |
| Функциональное программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 158 |
| У функций могут быть свои собственные методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 159 |
| Метод Function#curry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 159 |
| Методы Function#delay и Function#defer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 161 |
| Метод Function#bind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 164 |
| Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 165 |
| Глава 8. Дополнительный инструментарий: вспомогательные встроенные методы . . . . . . . . . | 167 |
| Строковые методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 167 |
| Вспомогательные строковые методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
167 |
| Класс Template и строковая интерполяция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
176 |
| JSON. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 180 |
| На что похож JSON? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
180 |
| Почему JSON? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
181 |
| Сериализация с помощью метода Object.toJSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
181 |
| Десериализация с помощью метода String#evalJSON. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
182 |
| Переопределение заданной по умолчанию сериализации . . . . . . . . . . . . . . . . . . . . . . . . . . |
183 |
| Методы Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
184 |
| Определение типов с помощью методов Object.isXXX . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
184 |
| Методы объекта Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
188 |
| Методы reverse и clear. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
188 |
| Методы uniq и without . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . |
189 |
| Резюме. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . | 189 |