В прошлом компьютерные программы часто работали в пакетном режиме – чита_ ли пакет данных, выполняли какие_то вычисления, а затем выводили результат. Позднее вместе с режимом разделения времени и текстовыми терминалами ста_ ли возможны ограниченные виды интерактивности – программа могла запро_ сить от пользователя данные, а тот мог их ввести. Затем компьютер обрабатывал данные и выводил на экран результат.
С появлением графических дисплеев и указывающих устройств, таких как мы_ ши, ситуация изменилась. Программы в основном стали управляться события_ ми, реагируя на асинхронный пользовательский ввод в виде щелчков мыши и на_ жатий клавиш, способ интерпретации которых зависит от положения указателя мыши. Веб_броузер – как раз такая графическая среда. HTML_документ имеет графический пользовательский интерфейс (GUI), и клиентский JavaScript ис_ пользует управляемую событиями модель программирования.
Можно написать статическую JavaScript_программу, не принимающую пользо_ вательских данных и делающую всегда одно и то же. Иногда такие программы полезны. Однако чаще мы пишем динамические программы, взаимодействую_ щие с пользователем. Чтобы это сделать, у нас должна быть возможность реаги_ ровать на его действия.
В клиентском JavaScript веб_броузер уведомляет программы о действиях пользо_ вателя, генерируя события. Имеются различные типы событий, такие как нажа_ тие клавиш, перемещение мыши и т. д. Когда происходит событие, веб_броузер пытается вызвать соответствующую функцию_обработчик события для реакции на него. Поэтому для написания динамических, интерактивных клиентских JavaScript_программ мы должны определить нужные обработчики событий и за_ регистрировать их в системе, чтобы броузер мог вызывать их в нужные моменты.
Тем, кто еще не знаком с управляемой событиями моделью программирования, придется потратить немного времени, чтобы к ней привыкнуть. В старой модели программист писал единый монолитный блок кода, выполнение которого осу_ ществлялось в каком_либо определенном порядке от начала до конца. Управляе_ мое событиями программирование переворачивает эту модель с ног на голову. В управляемом событиями программировании создается несколько независи_ мых (но взаимодействующих между собой) обработчиков событий. Программист
256 Глава 13. JavaScript в веб*броузерах
не вызывает их непосредственно, а позволяет системе вызывать их в нужный мо_ мент. Так как обработчики запускаются от действий пользователя, они могут исполняться в непредсказуемые, или асинхронные, моменты времени. Большую часть времени программа вообще не работает, а просто ожидает, пока система вызовет один из ее обработчиков событий.
В следующем разделе объясняется, как встраивать JavaScript_код в HTML_фай_ лы, как определять и статические блоки кода, работающие синхронно от начала до конца, и обработчики событий, вызываемые системой асинхронно. События и их обработку мы обсудим подробнее в главе 15, а затем более глубокое обсуж_ дение событий продолжим в главе 17.