При изучении примера 15.9 вы могли заметить, что для создания содержимого документов приходится вызывать большое число методов: прежде всего, необхо_ димо создать объект Element, затем установить его атрибуты, а потом создать узел Text и добавить его в объект Element. После этого Element добавляется в роди_ тельский объект Element и т. д. Чтобы просто создать элемент <table>, установить один атрибут и добавить строку заголовка, в примере 15.9 потребовалось напи_ сать 13 строк программного кода. В примере 15.10 приводится определение предназначенной для создания объекта Element вспомогательной функции, кото_ рая существенно упрощает выполнение повторяющихся операций при DOM_ программировании.
Пример 15.10 определяет единственную функцию с именем make(). Эта функция создает объект Element с заданным именем тега, устанавливает его атрибуты и до_ бавляет к нему дочерний узел. Атрибуты определяются как свойства объекта, а дочерний узел передается как массив. Элементами массива могут быть строки, которые преобразуются в текстовые узлы, или другие объекты типа Element, обычно создаваемые с помощью вложенных вызовов функции make().
Функция make() обладает очень гибким синтаксисом и допускает два сокращен_ ных варианта вызова. Первый – когда не задается ни одного атрибута; в этом случае аргумент с атрибутами может быть опущен и вместо него передается ар_ гумент с дочерним узлом. Второй – когда существует единственный дочерний узел, который можно передать функции непосредственно, не помещая в массив. Единственное ограничение – эти два способа сокращенной записи вызова не мо_ гут использоваться вместе, если единственный дочерний узел не является тек_ стовым узлом, передаваемым в виде строки.
Благодаря функции make() целых 13 строк программного кода, которые в при_ мере 15.9 создают элемент <table>, могут быть сокращены следующим образом:
Но и этот фрагмент можно записать еще короче. В примере 15.10 вслед за функ_ цией make() определяется еще одна вспомогательная функция с именем maker(). Она принимает имя тега и возвращает вложенную функцию, которая вызывает функцию make() с именем заданного тега. Если потребуется создать большое чис_ ло таблиц, можно будет определить функции для создания таблиц следующим образом:
var table = maker("table"), tr = maker("tr"), th = maker("th");
После этого программный код создания таблицы с заголовком уместится в един_ ственной строке:
var mytable = table({border:1}, tr([th("Имя"), th("Тип"), th("Значение")]));
350 Глава 15. Работа с документами
Пример 15.10. Вспомогательные функции создания элементов
/**
* make(tagname, attributes, children):
* создает HTML_элемент с заданным именем тега tagname, атрибутами
* и дочерними элементами.
*
* Аргумент attributes – это JavaScript_объект: имена и значения его свойств _ это имена
* и значения атрибутов. Если атрибуты отсутствуют, а аргумент children
* представляет собой массив или строку, тогда аргумент attributes
* можно просто опустить, а значение аргумента children передавать во втором аргументе.
*
* Как правило, аргумент children представляет собой массив дочерних
* элементов, добавляемых к создаваемому элементу. Если элемент не имеет
* потомков, аргумент children может быть опущен.
* Если дочерний элемент единственный, его можно передавать непосредственно,
* не заключая его в массив. (Но если дочерний элемент не является строкой
* и атрибуты отсутствуют, тогда массив должен использоваться обязательно.)