Содержание
Часть 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 |