Глава 15. Связывание данных с помощью HTML



До появления связывания данных доступ к данным на Web-страницах производился на низкой скорости. (Скорость доступа в Internet уменьшалась по мере роста графика - особенно, если при использовании модема со скоростью передачи данных 28,8 Кбит/с.) Скорость отображения страниц, которые обращались к данным, была низкой. Это было обусловлено большей частью тем, что серверы не только содержали Web-страницы, но также обслуживали доступ к базам данных и объединение данных со страницами для создания законченной HTML-страницы для клиента. Более того, поскольку страница передавалась клиенту, то отсутствовал способ разделения между данными и кодом HTML, в котором они содержались. В результате, когда пользователю требовалось выполнить манипуляции с данными (например, чтобы выполнить сортировку в другом порядке), то ему приходилось обращаться на сервер для повторного доступа к тем же данным, их форматирования и передачи новой страницы клиенту. Серверу приходилось снова передавать клиенту те же данные, внедренные в HTML-страницу. Некоторым серверам также требовалось поддерживать состояние клиента, чтобы гарантировать согласованное отображение данных на экране пользователя. Все это приводило к тому, что работа пользователя напоминала работу терминала мэйнфрейма. К счастью, все это в прошлом.

Рассмотрим связывание данных (data binding). Связывание данных является элементом динамического HTML, позволяющим решать перечисленные проблемы. Связывание данных поддерживает различие между данными и кодом HTML, который отображает их. Данные передаются клиенту асинхронно и воспроизводятся асинхронно по мере поступления, подобно постепенно выводимому на экран изображению в формате GIF. Клиент может разделять данные и выполнять манипуляции, такие как сортировка, на локальном клиентском компьютере. При этом не требуется обмен данными с сервером. Такая автономия уменьшает число обращений на сервер и объем передаваемых данных. Web-страницы, построенные с использованием связывания данных, отображают данные быстрее, снимают нагрузку форматирования с сервера и обеспечивают более интерактивный и оперативный режим работы, исключая длительные паузы ожидания при загрузке страниц.

Цель данной главы заключается в предоставлении необходимой информации для построения HTML-страницы с использованием связывания данных, а также для установки ссылок при построении страниц со связыванием данных. В главе рассмотрены следующие темы:



Что такое связывание данных?

Прежде чем рассматривать три компонента архитектуры связывания данных, определим термин связь (binding). В упрощенной форме связывание представляет собой отношения между данными, поставляемыми объектом источника данных, и HTML-потребителем данных. Данное отношение называется связью, потому что значение элемента данных (который называется datem, что является сокращением от data item - элемента данных) синхронизировано между клиентом и сервером. Когда HTML-потребитель данных (например, текстовое окно HTML) модифицирует элемент данных, то модифицированный элемент данных сохраняется в объекте источника данных. Напротив, если объект источника данных изменяет значение данных, то модифицированный элемент данных отправляется потребителю данных. Путем дальнейшего обобщения многочисленные потребители могут быть связаны с одним элементом данных, и все значения всех потребителей будут синхронизированы со значением, указанным объектом источника данных. Значения в объекте источника данных связаны со значениями в одном или большем количестве потребителей данных.

Доступны два различных стиля связывания: связывание текущей записи (current record binding) и связывание таблицы с повторением (repeated table binding). Связывание текущей записи использует HTML-элементы для отображения данных из текущей записи в наборе записей. В качестве текущей могут быть установлены различные записи. В таком случае элементы обновляются динамически для отображения данных в записи. Связывание таблицы с повторением позволяет определить набор связанных элементов, называемых шаблоном, который повторяется один раз для каждой записи в наборе записей. Разработчики Web-страниц также имеют возможность ограничения числа записей, повторяющихся в таблице. Этот элемент называется разбиением таблицы.

Разбиение таблицы и два стиля связывания будут подробно рассмотрены ниже в разделе данной главы "Построение базовых страниц с использованием, связывания данных".



Архитектура связывания данных

Архитектура связывания данных состоит из трех основных компонентов:

Объекты источников данных поставляют данные на страницу, а HTML-потребители данных отображают данные и обеспечивают взаимодействие пользователя с данными. Агент связывания и повторения обеспечивает поддержку стилей связывания. Дополнительно, агент связывания и повторения отвечает за синхронизацию всех связей с одиночным элементом данных, когда пользователи модифицируют данные на странице.



Объекты источников данных

Объекты источников данных обеспечивают открытую архитектуру для поставки данных на Web-страницу. Объекты источников данных внедряются в Web-страницу при помощи тегов <APPLET> или <OBJECT>, как показано ниже:

<OBJECT ID="stocklist" WIDTH="0" HEIGHT="0"
CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83">
<PARAM NAME="DataURL" VALUE="stockdata.txt">
<PARAM NAME="FieldDelim" VALUE="|">
<PARAM NAME="TextQualifier" VALUE="">
<PARAM NAME="UseHeader" VALUE="true">
</OBJECT>

После вставки объекта источника данных на страницу могут быть определены потребители данных для отображения данных и взаимодействия с пользователем.

Объекты источника данных могут быть реализованы во множестве языков программирования, включая Java, Microsoft Visual Basic и Microsoft Visual C++. Объекты источников данных отвечают за четыре главные функции доступа к данным:



HTML-расширения связывания данных

Данные из источника данных отображаются на экране пользователя с помощью стандартных HTML-элементов. Ключом к данным элементам, отображающим данные, является добавление одного или более HTML-расширений связывания данных.

Примечание: Расширения связывания данных были предложены консорциуму W3C (Woid Wide Web Consortium) для включения в стандарт HTML.

Расширения связывания данных представляют собой четыре атрибута, которые могут быть добавлены к множеству элементов HTML. Атрибуты определяют объект источника данных, который поставляет данные в элемент, определяет связывание с определенным столбцом или полем объекта источника данных, определяет представление данных в виде обычного текста или в виде HTML, а также определяет, будет ли таблица с повторением отображать только подмножество данных, поставляемых объектом источник данных.

В следующих разделах данные атрибуты обсуждаются подробно. Полный список элементов, которые поддерживают атрибуты связывания данных, можно найти ниже в разделе данной главы "Потребители данных: элементы HTML".


Простой провайдер OLE-DB

В общем случае, объект источника данных считывает данные в кэш в памяти клиентского компьютера. Объект источника данных должен затем иметь возможность представить эти данные браузеру. Объекты источника данных осуществляют эту задачу путем реализации интерфейса OSP (OLE-DB Sin-pie Provider - простой провайдер OLE-DB) или прямо через OLE-DB, который является набором интерфейсов OLE для доступа к данным.

Браузер Internet Explorer 4.0 поддерживает все объекты источников данные, реализующих OSP. RDS, включенный в состав Internet Explorer 4.0, является единственным поддерживаемым провайдером OLE-DB для Internet Explorer 4.0. Поддержка произвольных провайдеров OLE-DB будет добавлена в будущих версиях, но в данном разделе рассматривается только OSP.

OSP является открытой спецификацией и совместим с JavaBeans (моделью компонентов для Java) и OLE. OSP предоставляет простой интерфейс для вывода данных из клиентского кэша. В большинстве случаев кэш клиентской стороны можно просматривать как массив или набор табличных данных, то есть набор данных, состоящий из строк, в котором каждая строка имеет одинаковое число столбцов. OSP предоставляет доступ по очереди к каждой ячейке этого массива данных. OSP поддерживает способность добавления и удаления строк. OSP также требует, чтобы объект источника данных генерировал уведомления при изменении ячеек или при добавлении или удалении строк. Данные уведомления используются агентом связывания и повторения браузера Internet Explorer 4.0 для поддержания в синхронизированном состоянии каждого связанного элемента со значениями данных текущей записи. Объекты источника данных, которые представляют OSP, могут быть реализованы на языках программирования Java, Microsoft Visual Basic 5.0 и Microsoft Visual C++, при помощи MFC (Microsoft Foundation Classes) или, что более предпочтительно, ATL (Application Transaction Language) 2.0.


Атрибут DATASRC

Атрибут DATASRC указывает объект источника данных, который поставляет данные. DATASRC установлен равным #<IDref>, где <IDref> является идентификатором объекта источника данных. Используя пример, приведенный в разделе "Объекты источников данных", атрибут DATASRC, указывающий на объект stocklist, можно представить следующим образом:


DATASRC=#stocklist

В общем, атрибут DATASRC не используется самостоятельно, а только в сочетании с атрибутом DATAFLD. Однако имеется одно исключение из этого правила: таблицы с повторением. Таблицы с повторением используют только атрибут DATASRC, поскольку связывание таблицы с повторением указывает только источник повторения. Связанные HTML-элементы внутри таблицы отображают и взаимодействуют с реальными данными.


Атрибут DATAFLD

Объекты источников данных представляют свои данные в табличной форме в виде множества строк с фиксированным количеством столбцов. Объект источника данных устанавливает имена столбцов, на которые можно ссылаться посредством интерфейса OSР. Определение имени столбца является обязанностью объекта источника данных. Атрибут DATAFLD указывает именованный столбец или поле, которое должно быть связано с объектом источника данных.

В общем случае вместе с атрибутом DATAFLD должен быть указан атрибут DATASRC. Однако для элемента внутри таблицы с повторением атрибут DATASRC опускается, поскольку он наследован из атрибута DATASRC элемента Table. Ниже в разделе данной главы "Связывание таблицы с повторением" приведена более подробная информация по этому вопросу.


Атрибут DATAFORMATAS

Атрибут DATAFORMATAS определяет формат данных, поставляемых объектом источника данных. DATAFORMATAS может принимать одно из трех значений: NONE, TEXT или HTML. По умолчанию устанавливается значение NONE. Если установлено значение NONE (или когда данный атрибут отсутствует), то в объекте источника данных запрашивается исходный тип, необходимый для потребителя данных, который почти всегда является текстом для элементов HTML. Если установлено значение TEXT, то у объекта источника данных запрашивается текстовое значение, независимо от основного типа данных столбца. Например, если объект источника типа данных поставляет столбец с целочисленными значениями, то потребуется преобразовать эти значения в строки, если значение атрибута DATAFORMATAS было равно TEXT.

Наиболее важно, что когда атрибут DATAFORMATAS имеет значение HTML, то данные, поставляемые объектом источника данных, интерпретируются как код HTML, а не как простой текст. Данные анализируются и все элементы HTML в них интерпретируются так, как будто они были представлены непосредственно на Web-странице. Путем установки значения атрибута DATAFORMATAS равным HTML можно сохранить код HTML вместе с данными, а не хранить код статически на странице.


Атрибут DATAPAGESIZE

Атрибут DATAPAGESIZE используется для таблицы с повторением и дает Web-мастеру возможность ограничить длину таблицы с повторением и, таким образом, общую длину страницы со связанными данными. Атрибут может быть положительным целым числом и используется в сочетании с атрибутом DATASRC.

Если атрибут DATAPAGESIZE не указан, то шаблон таблицы повторяется объектом источника записей для каждой записи. Добавление атрибута DATAFORMATAS в таблицу позволяет установить число повторений шаблона равным определенной величине. Строки, отображаемые в таблице, могут быть затем прокручены с помощью методов объектной модели динамического HTML-элемента Table.



Агент связывания и повторения

Третьим компонентом архитектуры связывания данных является агент связывания и повторения (binding and repetition agent), который для краткости называется агентом связывания. Агент связывания является внутренним компонентом браузера Internet Explorer 4.0 и отвечает за интерпретацию атрибутов связывания данных и последующую передачу данных из объекта источника данных потребителям данных. Для реализации этой функции агент связывания выполняет ряд задач. Сначала агент связывания распознает объекты источников данных и потребителей данных, находящихся на странице или добавляемых динамически на страницу с помощью объектной модели динамического HTML. Агент связывания отслеживает, какие объекты источников данных доступны и с какими столбцами объекта источника данных связаны потребители данных.

Агент связывания также выполняет обработку в соответствии с установленным типом связывания. Для связывания текущей записи агент связывания поставляет данные из текущей записи потребителям данных. Когда новая запись становится текущей, то агент связывания поставляет потребителям данных информацию из новой текущей записи. При связывании таблицы с повторением агент связывания повторяет шаблон таблицы для каждой записи, поставляемой объектом источника данных. Индивидуальные связанные элементы внутри таблицы являются значениями, поставляемыми из соответствующего столбца для каждой записи в объекте источника записей.

Второй функцией агента связывания является поддержание данных потребителей данных и объектов источников данных в синхронизированном состоянии. В действительности при этом выполняются две задачи. Агент связывания отслеживает объекты источников данных и обнаруживает изменения данных путем обработки уведомлений. Когда данные, с которыми связан HTML-элемент, изменяются, то агент связывания распространяет изменения на связанный элемент. Аналогичным образом, когда пользователь изменяет значение связанного элемента при взаимодействии с таблицей, то агент связывания передает изменение обратно объекту источника данных. Наконец, агент связывания отвечает за запуск событий сценариев для объектов источников данных и потребителей данных. События предоставляются потребителями данных, что позволяет Web-мастерам писать сценарии, которые проверяют вводимые пользователем данные или отвечают на предпринимаемые пользователем действия, такие как установка новой текущей записи. Более подробную информацию о доступных событиях сценариев можно найти ниже в разделе данной главы "Написание сценариев с использованием связывания данных".



Потребители данных: HTML-элементы

При связывании данных используются стандартные HTML-элементы, включающие HTML-элементы Form, базовые HTML-конструкции, такие как Anchor и Image, более эзотерические конструкции типа Object и Applet, простые контейнеры для других HTML-элементов, таких как DIV и Span, и элементы Table для повторения элементов из набора данных. В данном разделе представлено подробное объяснение каждого потребителя данных, начиная с базовых потребителей и заканчивая более сложными элементами.



Элементы DIV и Span

Элементы DIV и Span представляют собой простые контейнеры для текстовых элементов и других HTML-элементов. Поскольку DIV и Span являются блочными элементами (они имеют открывающий и закрывающий теги), то связывание этих элементов состоит в связывании содержания. Оба элемента поддерживают атрибут DATAFORMATAS и могут быть связаны с данными HTML в столбце объекта источника данных. Содержание элементов не может быть изменено в средстве просмотра страницы. Поэтому связывания с элементами DIV и Span доступны только для чтения.

Примечание: Данные могут быть, тем не менее, изменены посредством объектной модели данных. В этом случае изменения данных из сценария будут отражены в связанных элементах DIV и Span.

<DIV DATASRC=#stocklist DATAFLD="Symbol" DATAFORMATAS=TEXT></DIV>
<SPAN DATASRC=#stocklist DATAFLD="ChangeF" DATAFORMATAS=HTML></SPAN>



Элемент Input

Ниже перечислены типы элемента Input, которые поддерживают связывание данных:

Примечание: Элементы Input не требуют включения элемента Form, когда используется связывание данных. Также не требуется кнопка Submit (Отправить).



Элемент TextArea

Связывание данных элемента TextArea связывает весь текст, находящийся в текстовом окне со множеством строк, с одним столбцом.

Пример элемента TextArea со связыванием данных показан ниже:

<TEXTAREA DATASRC=#stocklist DATAFLD="News">



Элемент Marquee

Как и для элементов DIV и Span, связывание с элементом Marquee обеспечивает связывание с содержанием элемента. Вы можете при желании добавить атрибут DATAFORMATAS=HTML для указания, что связанными данными является код HTML. После этого данные будут проанализированы и воспроизведены браузером.

Пример элемента Marquee со связыванием данных показан ниже:

<MARQUEE DATASRC=#stocklist DATAFLD="Last" DATAFORMATAS=HTML>
</MARQUEE>



Элемент Select

Элемент Select со связыванием данных позволяет связывать одиночный выбранный элемент из списка. Атрибут VALUE выбранного элемента Option представляет собой значение, сохраняемое в связанном столбце объекта источника данных. Когда значение в объекте источника данных не соответствует значениям, определенным элементом Option в элементе Select, то значения не выделяются. Элементы Select со связыванием данных могут использовать/раскрывающийся список или раскрывающееся поле со списком для взаимодействия с пользователем в зависимости от установки атрибута SIZE. Атрибут MULTIPLE игнорируется в элементах Select со связыванием данных, поскольку невозможно связать элемент более чем с одним значением из одного столбца.

Пример раскрывающегося поля со списком со связыванием данных приведен ниже:

<SELECT DATASRC=#stocklist DATAFLD="Type">
<OPTION VALUE=L>Long
<OPTION VALUE=S>Short
</SELECT>

Раскрывающийся список со связыванием данных использует приведенный ниже элемент Select:

<SELECT SIZE=2 DATASRC=#stocklist DATAFLD="Type">
<OPTION VALUE=L>Long
<OPTION VALUE=S>Short
</SELECT>

Хотя список вариантов для элемента Select не может быть связан непосредственно с объектом источника данных, но это возможно с помощью сценария, для заполнения вариантов элемента Select из объекта источника данных. Приведенный ниже код иллюстрирует данный метод:

<!-- Объект источника данных поставляет варианты для элемента Select -->
<OBJECT ID="selectlist" WIDTH="0" HEIGHT="0"
CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83">
<PARAM NAME="DataURL" VALUE="selectdata.txt">
<PARAM NAME="UseHeader" VALUE="True">
</OBJECT>
<!-- Заполняемый список -->
<SELECT ID=typeselect>
</SELECT>
<SCRIPT FOR=window EVENT=onload() LANGUAGE="JavaScript">
var i, newop;
selectlist.recordset.MoveFirst();
for (i = 1; i <= selectlist.recordset.AbsolutePosition; i++) {
newop = document.createElement("option");
newop.value = selectlist.recordset("value");
newop.text = selectlist.recordset("display");
typeselect.add(newop);
selectlist.recordset.MoveNext(); }
</SCRIPT>

Обработчик события onload окна читает данные из объекта источника данных и добавляет вариант для каждой записи в данных в элемент select. Метод MoveFirst и свойство AbsolutePosition обсуждаются ниже в разделах данной главы "Методы Move" и "Свойство recordNumber".



Элемент IMG

Связывание данных поддерживает связывание атрибута SRC элемента IMG. Значение, поставляемое связыванием, должно быть адресом URL файла отображаемого изображения. Адрес URL может быть абсолютным или относительным. Когда используется относительный URL, то для создания полного URL с целью извлечения файла изображения используется базовый URL документа или URL, указанный в теге <BASE>. Загрузка файла изображения выполняется так, как будто элемент IMG был статически определен внутри документа, то есть данные изображения загружаются в нитях, доступных для браузера.

Пример элемента IMG со связыванием данных:

<IMG DATASRC=#stocklist DATAFLD="Chart">



Элемент Anchor

В динамическом HTML поддерживается связывание с атрибутом HREF элемента Anchor по аналогии с элементом IMG. Подразумевается, что связанное значение является относительным или абсолютным URL. К элементу Anchor применимы те же правила, которые применяются к элементу IMG. Пример элемента Anchor со связыванием данных:

<A DATASRC=#stocklist DATAFLD="Website">...</A>

Вы можете включить связанный текст в элемент Anchor, используя якорь в комбинации с другими элементами, такими как элемент Span. В приведенном ниже примере в качестве гиперссылки на Web-узел компании используется сокращенное название акции (symbol):

<A DATASRC=#stocklist DATAFLD="Website">
<SPAN DATASRC=#stocklist DATAFLD="Symbol"></SPAN>
</A>



Элемент Button

Можно связать содержание элемента Button путем включения атрибутов DATASRC и DATAFLD элемента. На поверхности кнопки будет отображен связанный с ней текст. Атрибут DATAFORMATAS может быть также использован при связывании для отображения HTML на поверхности кнопки.

Пример элемента Button со связыванием данных:

<BUTTON DATASRC=#stocklist DATAFLD="Chart" DATAFORMATAS=HTML></BUTTON>



Элемент Label

Связывание элемента Label аналогично связыванию элемента Button. Содержание элемента Label является связанным, и связывание может содержать код HTML. Но следует иметь в виду, что элементы Label не могут быть использованы внутри таблицы с повторением. Поскольку элемент Label связан с элементом управления путем установки значения его атрибута FOR равным идентификатору связанного элемента управления, то невозможно уникальным образом назначить элемент Label одиночному элементу управления в таблице с повторением.



Элементы Object и Applet

Вы можете также связать произвольное число свойств элементов управления ActiveX и апплетов Java. Для связывания свойства элемента Object или Applet необходимо включить атрибуты DATASRC и DATAFLD в тег , который определяет имя связываемого свойства. Следующий пример показывает связи с цветом текста и фона для элемента управления или апплета:

<APPLET CODE=myapplet.class>
<PARAM NAME="backcolor" VALUE="green"
DATASRC="#dsc1" DATAFLD="color">
<PARAM NAME="forecolor" VALUE="yellow"
DATASRC="#dsc1" DATAFLD="textcolor">
.
.
.
</APPLET>

Для связывания апплетов Java элемент Applet должен быть реализован в соответствии со спецификациями JavaBeans для свойств, то есть должны быть соответствующие общие методы get и set для свойства, определенного атрибугом NAME тега <PARAM>. Как и для элементов ActiveX, не требуется, чтобы элемент Applet генерировал уведомления изменения свойств.

Элементы объекта (элементы управления ActiveX) работают точно так же, как и элементы Applet. Пример элемента Object со связыванием данных показан ниже:

<OBJECT CLSID="...">
<PARAM NAME="backcolor" VALUE="blue"
DATASRC="#dsc1" DATAFLD="color">
<PARAM NAME="forecolor" VALUE="white"
DATASRC="#dsc1" DATAFLD="textcolor">
.
.
.
</OBJECT>

Элемент управления ActiveX должен поддерживать свойство, имя которого определено атрибутом NAME тега <PARAM>. Большинство элементов управления ActiveX генерируют уведомления, когда значение свойства изменяется. Однако связывание данных этого не требует.

Элементы управления ActiveX могут определять свойство по умолчанию для связывания путем установки флага DefaultBind во вводимой информации для свойства. Связывание данных поддерживает связывание с данным свойством по умолчанию путем установки атрибутов DATASRC и DATAFLD непосредственно для элемента Object:

<OBJECT CLSID="..." DATASRC="#dsc1" DATAFLD="text">
<PARAM NAME="backcolor" VALUE="blue"
DATASRC="#dsc1" DATAFLD="color">
<PARAM NAME="forecolor" VALUE="white"
DATASRC="#dsc1" DATAFLD="textcolor">
.
.
.
</OBJECT>

Обратите внимание, что вы можете совместить связывание по умолчанию с любым числом связей с элементом Param.



Элементы Frame и IFrame

Вы можете связать атрибуты HREF элементов Frame и IFrame. В обоих случаях связанные данные должны содержать URL. Различия обусловлены тем, что элементы IFrame могут существовать на любой странице. Элемент IFrame может быть использован подобно другим элементам, которые поддерживают связывание данных, путем добавления атрибутов DATASRC и DATAFLD:

<IFRAME DATASRC=#stocklist DATAFLD="Website">

С другой стороны, элемент IFrame должен существовать внутри элемента Frameset, а не внутри тела HTML-документа. Для использования преимуществ связывания Frame объект источника данных должен быть размещен внутри элемента Head HTML-документа, который содержит элемент Frameset:

<HTML>
<HEAD>
<OBJECT ID="stocklist" WIDTH="0" HEIGHT="0"
CLASSID="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83">
<PARAM NAME="DataURL" VALUE="stockdata.txt">
<PARAM NAME="FieldDelim" VALUE="|">
<PARAM NAME="TextQualifier" VALUE="">
<PARAM NAME="UseHeader" VALUE="true">
</OBJECT>
</HEAD>
<FRAMESET>
<FRAME DATASRC=#stocklist DATAFLD="Website">
</FRAMESET>
</HTML>

Связывание с элементом Frame полезно, когда требуется предоставить пользователю возможность просмотра последовательности списка URL. Связывание текущей записи используется с элементом Frame, и при удалении текущей записи элемент Frame отображает данные из нового URL, поставляемого объектом источника данных. Элементы Frame не могут быть использованы внутри таблицы с повторением.



Элемент Table

Последним поддерживаемым потребителем данных является элемент Table. Элемент Table является специальным потребителем данных - он является контейнером для остальных связей, не устанавливая связывание непосредственно с данным элементом. Связывание элемента Table определяет, что содержание таблицы, исключая элементы THead и TFoot, повторяется в наборе данных, определяемых атрибутом DATASRC:

<TABLE DATASRC=#stocklist>
.
.
.
</TABLE>

Когда содержание таблицы повторяется, то связанный элемент внутри элемента Table принимает его данные из текущей записи и из последующих записей в источнике записей. В приведенном ниже примере таблица отображает список всех условных обозначений акций с указанием последней котировки, изменения и объема продаж из источника данных с именем stocklist:

<TABLE ID="stocktbl" DATASRC="#stocklist" BORDER=1>
<THEAD>
<TR ONCLICK="sort();">
<TD CLASS=thd><DIV ID=Symbol>Symbol</DIV></TD>
<TD CLASS=thd><DIV ID=Last>Last</DIV></TD>
<TD CLASS=thd><DIV ID=Change>Change</DIV></TD>
<TD CLASS=thd><DIV ID=Volume>Volume</DIV></TD>
</TR>
</THEAD>
<TBODY>
<TR>
<TD><A DATAFLD="Website">
<SPAN DATAFLD="Symbol"></SPAN></A>
</TD>
<TD ALIGN=right>
<DIV DATAFLD="Last"></DIV>
</TD>
<TD ALIGN=right>
<SPAN DATAFLD="ChangeF" DATAFORMATAS=HTML></SPAN>
</TD>
<TD ALIGN=right><DIV DATAFLD="Volume"></DIV></TD>
</TR>
</TBODY>
</TABLE>

На рис. 15.1 показана полученная в результате таблица.

Рис. 15.1. Пример таблицы с повторением

В табл 15.1 перечислены потребители данных, атрибуты связывания данных, которые они поддерживают, и указана возможность поддержки обновления данных.

Таблица 15.1. Список потребителей данных


Тег Связанный атрибут D
A
T
A
S
R
C
D
A
T
A
F
L
D
D
A
T
A
F
O
R
M
A
T
A
S
D
A
T
A
P
A
G
E
S
I
Z
E
Обновление
данных

<DIV> Содержание X X X
<SPAN> Содержание X X X
<INPUT TYPE=TEXT> VALUE X X X
<INPUT TYPE=RADIO> VALUE X X X
<INPUT TYPE=CHECKBOX> Логический, соответствующий проверяемому состоянию X X X
<INPUT TYPE=HIDDEN> VALUE X X
<INPUT TYPE=PASSWORD> VALUE X X X
<TEXTAREA> Содержание X X X
<MARQUEE> Содержание X X X
<SELECT> Выбранный элемент X X X
<IMG> SRC X X
<A> HREF X X
<BUTTON> Содержание X X X
<LABEL> Содержание X X X
<OBJECT> or <APPLET> Свойство по умолчанию X X X
<PARAM> Свойство объекта или апплета X X X
<FRAME> HREF X X
<IFRAME> HREF X X
<TABLE> Повторение X X

Обратите внимание, что в примере для элемента Table элементы со связыванием данных внутри элемента Table не определяют атрибут DATASRC. Поскольку элемент Table повторяется, то элементы в таблице наследуют значение атрибута DATASRC (а именно, #stocklist) из таблицы с повторением.

Вы можете включить несколько элементов TBody и строк с любым количеством атрибутов ROWSPAN и COLSPAN. При создании таблицы с повторением следует создать таблицу для отображения и форматирования данных одиночной записи из объекта источника записей. Все содержание таблицы будет затем повторяться для каждой записи в наборе данных. Можно ограничить число записей, повторяемых в элементе Table.

Ниже в разделе данной главы "Таблицы с разбиением" приведена более подробная информация по этому вопросу.



Построение базовых страниц с помощью связывания данных

Теперь, когда вы понимаете роль объектов источников данных, атрибутов, используемых для определения связывания и HTML-элементов, которые могут быть связаны, используем полученные знания для построения трех базовых страниц.



Связывание текущей записи

Вы можете представить текущую запись, как индекс или указатель на некоторую запись в источнике данных. Значения из столбцов в данной записи отображаются в связанных элементах. В качестве текущей можно установить любую запись путем увеличения или уменьшения индекса или указателя. Когда новая запись становится текущей, связанные элементы динамически изменяются для отражения данных из новой записи.

Приведенный ниже код демонстрирует определение связывания текущей записи:


<BODY TOPMARGIN=0 LEFTMARGIN=40 BGCOLOR="#FFFFFF">
<FONT FACE="verdana,arial,helvetica" SIZE=2>
<H2>Current Record Binding</H2>
§
<P>Stock:
<A DATASRC=#stocklist DATAFLD="Website">
<SPAN DATASRC=#stocklist DATAFLD="CompanyName"></SPAN>
 (<SPAN DATASRC=#stocklist DATAFLD="Symbol"></SPAN>)
</A>
<P>Last: <SPAN DATASRC=#stocklist DATAFLD="Last"></SPAN>
<P>Change:
<SPAN DATASRC=#stocklist DATAFLD="ChangeF" DATAFORMATAS=HTML>
</SPAN>
<P>Chart: <IMG ALIGN=top DATASRC=#stocklist DATAFLD="Chart">
<HR>
<INPUT TYPE=BUTTON VALUE=" |< "
ONCLICK="stocklist.recordset.MoveFirst();">
 
<INPUT TYPE=BUTTON VALUE=" < " ONCLICK="stocklist.recordset.MovePrevious();">
 
<INPUT TYPE=BUTTON VALUE=" > " ONCLICK="stocklist.recordset.MoveNext();">
 
<INPUT TYPE=BUTTON VALUE=" >| "
ONCLICK="stocklist.recordset.MoveLast();">
</BODY>

Для связывания текущей записи каждый связанный элемент содержит атрибуты DATASRC и DATAFLD.

На рис. 15.2 показан пример связывания текущей записи.

Рис. 15.2. Страница, использующая связывание текущей записи

Обратите внимание, что в данном примере добавлены четыре кнопки HTML. Эти элементы управления дают возможность пользователю устанавливать текущую запись в источнике данных. Нажатие кнопок выводит на экран первую, предыдущую, следующую или последнюю запись в качестве текущей записи.

Данный метод подробно обсуждается ниже в разделе данной главы "Методы перемещения".



Связывание таблицы с повторением

Приведенный ниже код демонстрирует создание простой таблицы с повторением. Пример построен на основе рассмотренной ранее таблицы акций с некоторыми изменениями. Здесь столбец Symbol содержит условное обозначение акции и связанный элемент Anchor, который указывает на Web-узел соответствующей компании. Данные были помещены в две строки таблицы и добавлен небольшой график для каждого элемента таблицы с целью демонстрации динамики изменения стоимости акций за последние шесть месяцев. Ячейка, содержащая диаграмму, охватывает две строки каждого элемента.


<TABLE ID="stocktbl" DATASRC="#stocklist" BORDER=1>
<THEAD>
<TR ONCLICK="sort();">
<TD CLASS=thd ROWSPAN=2><DIV ID=Symbol>Symbol</DIV></TD>
<TD CLASS=thd><DIV ID=Last>Last</DIV></TD>
<TD CLASS=thd><DIV ID=Change>Change</DIV></TD>
<TD ROWSPAN=2>Chart</TD>
</TR>
<TR ONCLICK="sort();">
<TD CLASS=thd><DIV ID=Volume>Volume</DIV></TD>
<TD CLASS=thd><DIV ID=Type>Type</DIV></TD>
</TR>
</THEAD>
<TBODY>
<TR>
<TD ALIGN=left ROWSPAN=2>
<A DATAFLD="Website"><SPAN DATAFLD="Symbol"></SPAN></A>
</TD> <TD ALIGN=right>
<DIV DATAFLD="Last"></DIV>
</TD>
<TD ALIGN=right>
<SPAN DATAFLD="ChangeF" DATAFORMATAS=HTML></SPAN>
</TD>
<TD ALIGN=left ROWSPAN=2>
<IMG DATAFLD="Chart">
</TD>
</TR>
<TR>
<TD ALIGN=right>
<DIV DATAFLD="Volume"></DIV>
</TD>
<TD ALIGN=center>
<SELECT DATAFLD="Type">
<OPTION VALUE=L>Long
<OPTION VALUE=S>Short
</SELECT>
</TD>
</TR>
</TBODY>
</TABLE>

Некоторые рассмотренные здесь концепции могут быть не совсем очевидны. Во-первых, вы можете использовать многочисленные связывания в одной ячейке таблицы. Первая ячейка содержит элементы Anchor и Span, каждый из которых связан с различными полями. Помните, что элемент Table является просто контейнером для повторения. Спецификация шаблона может включать в себя любой элемент или элемент управления, содержащий или не содержащий связывание данных, а также шаблон в соответствии с правилами HTML. На рис. 15.3 показана измененная таблица с параметрами акций.

Рис. 15.3. Базовое связывание таблицы с повторением

Обратите внимание, что в данном примере используется TDC (Tabular Data Control - элемент управления табличными данными) в качестве источника данных. TDC является объектом источника данных, включенным в минимальной конфигурации в браузер Internet Explorer 4.0. Данный элемент используется для извлечения данных в разделенном текстовом формате. Набор данных, использованный в примерах этого раздела, имеет поля, перечисленные в табл. 15.2.

Таблица 15.2. Типы полей набора данных


Поле Тип данных

Symbol text
Last float
Change float
ChangeF text
Volume int
%Change float
DateUpdated text
High float
Low float
Open float
Close float
52WeekHigh float
52WeekLow float
PERatio float
CompanyName text
Shares int
Website text
Chart text
Type text
ExDiv text



Связывание таблицы с разбиением

В приведенном выше примере таблица повторялась для каждой записи в наборе данных. Это может привести к образованию больших таблиц, которые будет трудно просматривать и выводить на экран. Для решения этой проблемы была предложена концепция разбиения таблицы (table paging). Разбиение таблицы позволяет Web-мастеру определять точное число записей, которые будут отображены в таблице с повторением в определенное время. Данный метод позволяет Web-мастеру ограничивать размер страницы, полученной в результате повторения шаблона таблицы. Метод также позволяет Web-мастеру ограничивать таблицу определенной областью на странице и помещать другие элементы на странице вокруг таблицы, не заботясь о том, что элементы, расположенные ниже таблицы, не будут отображаться на экране.

Для запуска разбиения таблицы атрибут DATAPAGESIZE определен в таблице с повторением. Атрибут DATAPAGESIZE принимает целочисленный аргумент, который определяет число записей из набора записей и число экземпляров шаблона таблицы, которые должны быть повторены в таблице единовременно. (Отображение частичных шаблонов не поддерживается).

Для активизации разбиения таблицы можно использовать код предыдущего примера, в котором требуется произвести только одно изменение в атрибуте DATAPAGESIZE элемента Table, которое показано ниже:


<TABLE ID="stocktbl" DATASRC="#stocklist" DATAPAGESIZE=4 BORDER=1>
.
.
.
</TABLE>

Данный код одновременно отображает в таблице данные из четырех записей. На рис. 15.4 показан пример таблицы с данными акций с активизированным разбиением таблицы.

Рис. 15.4. Базовое связывание разделенной таблицы

Но как пользователю теперь просмотреть остальные табличные данные? В таблицах с повторением и разбиением представлены два метода для просмотра дополнительных данных из набора данных: nextPage, который отображает следующую страницу данных в таблице, и previousPage, который отображает предыдущую страницу данных. Используя данные методы, Web-мастер может добавить HTML-элементы, которые вызывают сценарии для отображения дополнительных страниц данных. Кнопки Next (Следующая) и Previous (Предыдущая), показанные на рис. 15.4, вызывают методы nextPage и previousPage в таблице с повторением. Данные кнопки определены следующим образом:


<INPUT TYPE=BUTTON VALUE=" Previous "
ONCLICK="stocktbl.previousPage();">
<INPUT TYPE=BUTTON VALUE=" Next " ONCLICK="stocktbl.nextPage();">

Стоит также рассмотреть граничные условия. Если вызывается метод nextPage, когда в наборе осталось меньше страницы данных, то таблица отображает только оставшиеся записи. После чего метод nextPage отключается. Если метод previousPage вызывается, когда текущую запись от первой страницы отделяет менее одной страницы, то отображается вся страница записей, начиная с первой записи. Затем метод previousPage отключается. Наконец, когда записи динамически добавляются и удаляются, то отображаемые данные будут настраиваться соответствующим образом. В этом случае запись, отображаемая в верхней части таблицы, остается вверху до тех пор, пока не будет удалена.



Написание сценариев с использованием связывания данных

В предыдущем разделе было рассмотрено использование HTML для связывания. В данном разделе вы научитесь объединять код сценариев со связыванием данных для создания действительных приложений доступа к данным, которые могут выполняться в Internet Explorer 4.0. Обсуждение начинается с рассмотрения ADO (ActiveX Data Objects), а затем рассматриваются события, предоставляемые Internet Explorer 4.0 для элементов связывания данных и объектов источников данных.



Версия набора записей ADO

В примере связывания текущей записи, который был представлен ранее в данной главе, использовались кнопки HTML для перемещения указателя текущей записи вперед и назад. Для события onclick использовался сценарий stocklist.recordset.MoveNext(). Данный код ссылается на объект recordset из объекта источника данных stocklist, а затем вызывается метод MoveNext в объекте recordset.

Объект recordset в данном случае является версией ADO-Recordset, которая называется здесь ADOR и содержит только объекты recordset и field из полной версии ADO, поставляемой с различными продуктами Microsoft, такими как Active Server Pages. Браузер Internet Explorer 4.0 поставляет ADOR для всех объектов источников данных на Web-странице. Как показано в приведенном выше примере, объект recordset доступен из свойства recordset объекта источника данных.

Вы можете обратиться к данным в наборе данных ADOR с помощью сценариев. Посредством сценариев вы можете изменить установку текущей записи и выполнить расчеты, проверку и все функции, которые требуют доступа к данным. Данные, использованные в наборе данных ADOR, не требуется связывать с HTML-элементами на странице. Вы можете использовать набор данных ADOR исключительно для доступа программ к данным из объекта источника данных.

Обсуждение особенностей использования ADOR выходит за рамки данной главы. Однако в следующих разделах будут затронуты две ключевые области функциональных возможностей, обычно используемые на Web-страницах: методы перемещения и объекты field.


Методы перемещения

Методы перемещения позволяют изменять установку текущей записи, таким образом, изменяя значения, отображаемые в связанных элементах. Методы, используемые для перемещения указателя текущей записи, перечислены ниже: Move (Переместить), MoveNext (ПереместитьКСледующей), MovePrevious (ПереместитьКПредыдущей), MoveFirst (ПереместитъКПервой) и MoveLast (ПереместитьКПоследней). Метод Move принимает аргумент для перемещения указателя текущей записи в выбранное положение в наборе записей. Функции других методов очевидны из их названия.

ADOR позволяет устанавливать указатель текущей записи перед первой записью в наборе данных (BOF (beginning of file) - начало файла) или после последней записи в наборе данных (EOF (end of file) - конец файла). Поскольку данные положения не имеют связанных с ними данных, то перемещение в данные позиции приведет к тому, что все связи на странице будут иметь нулевые значения, что обычно означает отсутствие вывода на экран. Возникновения этой ситуации можно избежать путем проверки текущего положения в наборе записей до перемещения указателя. Приведенный ниже код проверяет, является ли текущая запись последней в наборе записей, перед переходом к указателю текущей записи:


<SCRIPT LANGUAGE="JavaScript" FOR=NextButton EVENT=onclick>
if (stocklist.recordset.AbsolutePosition <
stocklist.recordset.RecordCount)
stocklist.recordset.MoveNext();
else
alert("Already at last record.");
</SCRIPT>

Примечание: Положение текущей записи может быть также изменено путем изменения значения свойства AbsolutePosition набора записей.


Семейство fields и объект field

Семейство fields содержит набор объектов field для набора записей. Объект field прямо соответствует одиночному столбцу данных. Объект field используется для чтения значений данных из столбца для текущей записи набора записей. Например, данные для текущей записи в столбце Last могут быть получены с помощью приведенного ниже кода. Все строки кода возвращают одинаковые значения.


stocklist.recordset.Fields("Last").value
stocklist.recordset.Fields("Last")
stocklist.recordset("Last")

Присвоение значения свойству Value объекта field модифицирует значение. Приведенный ниже код устанавливает последнюю цену акции в текущей записи, равной 103.0:


stocklist.recordset("Last") = 103.0;

В данном случае также может быть использована любая из трех эквивалентных форм записи данной инструкции.

Более подробную информацию об ADOR можно найти в Internet Client SDK (Software Development Kit), который доступен на Web-узле компании Microsoft no адресу www.microsoft.com/msdn/sdk/inetsdk.



События сценариев

Браузер Internet Explorer 4.0 предоставляет расширенный набор событий для помощи Web-мастерам при написании сценариев для обработки действий пользователя на страницах со связыванием данных. События набора могут быть разделены на две категории. События первой категории запускаются на элементах потребления данных. Данные события (onbeforeupdate, onafterupdate и onerrorupdate) представлены для проверки вводимой пользователем информации. События второй категории (onrowexit, onrowenter, ondatasetchanged, ondataavailable и ondatasetcomplete) генерируются на объектах источника данных для активизации проверки и обработки, когда текущей становится новая запись или в ответ на синхронную передачу данных клиенту. Дополнительное событие onbeforeunload не является характерным для связывания данных, но полезно в приложениях связывания данных. В следующих разделах данные события описаны более подробно.

Как и все события в объектной модели динамического HTML события, описанные в данном разделе, всплывают вверх по иерархии контейнеров. Обработчики для них могут быть написаны на любом уровне иерархии. Если многочисленные объекты источников данных представлены на странице, то Web-мастер может добавить одиночный контейнер для любого события в общем контейнере с целью обработки события.


Событие onbeforeupdate

Событие onbeforeupdate генерируется для HTML-элементов, которые поддерживают обновление данных. (В табл. 15.1 в данной главе приведен список потребителей данных, которые поддерживают обновление.) Событие onbeforeupdate генерируется, когда пользователь перемещает фокус с элемента, значение которого было обновлено и перед передачей обновленных данных в объект источника данных с помощью агента связывания. Предыдущее значение данных может быть получено из объекта источника данных при помощи набора данных ADOR. Событие onbeforeupdate может быть использовано Web-мастером для выполнения проверки. Если Web-мастер отменяет событие, то фокус остается на элементе и данные не передаются в объект источника события.

ных при помощи набора данных ADOR. Событие onbeforeupdate может быть использовано Web-мастером для выполнения проверки. Если Web-мастер отменяет событие, то фокус остается на элементе и данные не передаются в объект источника события.


<SCRIPT LANGUAGE="JavaScript" FOR=textbox1 EVENT=onbeforeupdate>
if (textbox1.value < 5 || textbox1.value > 15)
{
alert("Number must be in the range 5 through 15.");
returnValue = false;
}
</SCRIPT>


Событие onafterupdate

Событие onafterupdate также генерируется на HTML-элементах, которые поддерживают обновление. Однако данное событие запускается сразу же после передачи данных из элемента в объект источника данных. Событие onafterupdate не запускается, если отменено событие onbeforeupdate, а событие onafterupdate само по себе не отменяется.

Одним из применений события onafterupdate является обновление вычисленного значения. Например, пользователь заполнил форму заказа, выбрал элемент и количество. После ввода количества вы можете вычислить общую сумму на основе цены одного элемента и количества заказанных единиц товара. Вы можете выполнить эту задачу в обработчике события onafterupdate текстового окна, в котором введено количество единиц товара:


<SCRIPT LANGUAGE="JavaScript" FOR=quant_tbox EVENT=onafterupdate>
line_total.value = quant_tbox.value * item_price.value;
</SCRIPT>


Событие onerrorupdate

События onbeforeupdate и onafterupdate охватывают передачу данных из HTML-элемента в объект источника данных, но не учитывают редкий случай, в котором передача данных является неудачной. В этом случае возникает событие onerrorupdate.

События onerrorupdate и onafterupdate являются взаимоисключающими, то есть событие onafterupdate генерируется только в случае успешной передачи данных, а событие onerrorupdate возникает только при срыве передачи данных. Событие onerrorupdate предоставляет Web-мастеру возможность вывести на экран соответствующее сообщение об ошибке при неудачной передаче данных.

Примечание: События onerrorupdate и onafterupdate являются взаимоисключающими, то есть событие onafterupdate генерируется только в случае успешной передачи данных, а событие onerrorupdate возникает только при срыве передачи данных. Событие onerrorupdate предоставляет Web-мастеру возможность вывести на экран соответствующее сообщение об ошибке при неудачной передаче данных.
Кроме того, поскольку объект или апплет не требуются для генерации уведомлений, когда значение одного из связанных свойств изменяется, то агент связывания и повторения автоматически передает данные из объекта или апплета, когда указатель текущей записи перемещается или страница выгружается, даже если значение не было изменено.


Событие onrowexit

Событие onrowexit является первым событием в наборе событий, которое генерируется в объекте источника данных. Напомним, что объект источника данных имеет одну текущую запись. В качестве текущей при помощи метода перемещения в ADOR может быть установлена другая запись. Событие onrowexit генерируется в объекте источника событий для извещения о том, что будет перемещен указатель текущей записи.

Перед возникновением события onrowexit должны быть выполнены некоторые действия. Сначала требуется запросить перемещение указателя текущей записи, в общем случае посредством выполнения метода перемещения в наборе записей ADOR. После получения запроса агент связывания проверяет каждый связанный HTML-элемент для выявления измененных данных в текущей записи. Это выполняется путем сравнения значения в элементе со значением в столбце объекта источника данных. Если столбцы различаются, то агент связывания генерирует событие onbeforeupdate на данном элементе. Если событие отменяется, то действия прекращаются и указатель текущей записи остается на прежнем месте. Если событие onbeforeupdate не отменяется, то событие onafterupdate генерируется в элементе. Данный процесс повторяется для каждого связанного HTML-элемента. После синхронизации всех элементов событие onrowexit генерируется на объекте источника данных.

Событие onrowexit можно отменить. При этом указатель текущей записи остается на прежнем месте. Событие onrowexit полезно для выполнения проверки на высоком уровне или для пересчета столбцов объекта источника данных, которые не связаны, но являются базовыми для значений в других столбцах.

Приведенный ниже пример содержит обработчик события onrowexit:


<SCRIPT LANGUAGE="JavaScript">
function myrowexit() {
if (stocklist.recordset("Last") * stocklist.recordset("Shares")
> my_cash_balance) {
alert("Purchase exceeds cash position in your account.");
returnValue = false;
}
}
</SCRIPT>

Событие onrowenter

Как видно по имени, событие onrowenter (переход на строку) возникает после перемещения указателя текущей записи. При генерации данного события все данные из новой текущей записи будут представлены в HTML-элементах, связанных с объектом источника данных.

Событие onrowenter нельзя отменить, поскольку данные из новой текущей записи уже отображаются на экране. Событие onrowenter полезно для вычисляемых полей на основе элементов данных в строке. Приведенный ниже пример демонстрирует использование события onrowenter:


<SCRIPT LANGUAGE="JavaScript">
function myrowenter() {
total_value.text =
stocklist.recordset("Price") * stocklist.recordset("Shares");
}
</SCRIPT>


Событие ondatasetchanged

Web-мастерам необходимо точно знать, когда объект источника данных готов передавать данные, и событие ondatasetchanged является первым из трех событий, которые помогают в решении этой задачи. Событие ondatasetchanged генерируется на объекте источника данных, как только данные становятся доступными, извещая о возможности получения набора данных ADOR из объекта источника данных. Событие ondatasetchanged нельзя отменить.

Помимо запуска при первом отображении HTML-страницы, событие ondatasetchanged генерируется, когда объекты источника данных выполняют манипуляции с данными. Эти манипуляции могут выполняться в ответ на изменение порядка в наборе данных, вызванным сортировкой, или на изменения в основной структуре набора данных (число строк или столбцов, или имен столбцов), вызванное отбором.


Событие ondataavailable

Web-мастер может получить уведомление о поступлении дополнительных данных из объекта источника данных при помощи обработки события ondataavailable. Событие ondataavailable генерируется, когда данные из объекта источника данных были получены браузером. Событие ondataavailable нельзя отменить.

Объект источника данных определяет частоту возникновения события ondataavailable. По соображениям производительности большинство объектов источников данных не запускают событие ondataavailable для каждой отображаемой записи. Напротив, объекты источников данных будут собирать ряд строк и столбцов в виде блока и запускать событие ondataavailable для данного блока строк. Событие ondataavailable, однако, не указывает число доступных строк и их положение в наборе данных. Данная информация должна быть определена непосредственно из набора данных ADOR.

Событие ondataavailable может быть использовано для расчета текущей суммы записей по мере их поступления или для выполнения операций сценариев по мере поступления данных в браузер:


<SCRIPT LANGUAGE="JavaScript">
var count;
function myondataavailable() {
total_stocks.value = stocklist.recordset.RecordCount;
}
</SCRIPT>


Событие ondatasetcomplete

Последним в наборе асинхронных событий является событие ondatasetcomplete. Являясь, возможно, самым полезным асинхронным событием, событие ondatasetcomplete уведомляет Web-мастера о завершении асинхронной передачи и доступности всего набора данных.

Событие ondatasetcomplete устанавливает свойство reason объекта event с целью сообщения Web-мастеру о состоянии передачи. В табл. 15.3 перечислены три возможных значения для свойства reason.

Таблица 15.3. Значения свойства reason


Значение Описание

0 Передача была завершена без ошибок
1 Пользователь прервал передачу. В общем случае, данное прерывание возникает, когда пользователь нажимает кнопку Stop (Стоп) на странице
2 Передача привела к возникновению ошибки. Это общий случай для различных срывов передачи, включая невозможность связи с хостом или разрыва соединения


Событие onbeforeunload

Событие onbeforeunload не является характерным для связывания данных, но его обработка может быть полезна для предотвращения потери данных на страницах со связыванием данных. Некоторые объекты источников данных могут кэшировать обновления данных, которые они поставляют клиенту, до тех пор, пока метод не будет вызван на объекте для сохранения обновленных значений на сервере. Поскольку данные значения могут быть кэшированы, пользователь может попытаться покинуть страницу до сохранения обновленных значений. Событие onbeforeunload может быть использовано для того, чтобы попросить пользователя отменить переход во избежание потери измененных данных.

Работа события onbeforeunload отчасти отличается от других событий, которые обсуждались ранее. Событие onbeforeunload запускается в ответ на запрос пользователя для перехода на новую страницу. Например, когда пользователь нажимает гиперссылку, щелкает по кнопке Back (Назад) или Forward (Вперед) или вводит новый URL в адресной строке. Событие onbeforeunload запускается на объекте window до события unload на странице. Когда возникает данное событие, Web-мастер может установить значение свойства returnValue объекта event равным строковому значению, которое будет отображено на компьютере пользователя наряду со стандартным сообщением браузера, объясняющим, что пользователь может отменить запрашиваемый переход. В общем случае Web-мастеры устанавливают возврат сообщения о том, что продолжение навигации приведет к отмене кэшированных изменений. Если пользователь решает отменить навигацию, то страница остается на экране и пользователь может взаимодействовать с ней так, как будто методы гиперссылки или перехода не были вызваны. Если пользователь продолжает навигацию, то страница выгружается и изменения данных отменяются.


Отмена события unload требует участия пользователя

Должен ли Web-мастер иметь возможность просто отменить событие unload, не спрашивая мнение пользователя? Ответ на этот вопрос находится в центре проблем безопасности операционной системы. Если бы Web-мастер имел возможность отмены события unload, то было бы можно создать страницу, которая никогда не была бы выгружена. То есть, событие unload всегда бы отменяло навигацию. Единственным способом для пользователя покинуть данную страницу было бы прекращение процесса браузера, что является нарушением базовой целостности операционной системы, поскольку пользователь всегда имел бы возможность управления своей локальной машиной и процессами. Событие onbeforeunload может быть отменено, но именно пользователь принимает решение об отмене события unload, а не Web-мастер. Web-мастер имеет только возможность вывода информационного сообщения для пользователя.



Дополнительные элементы

После ознакомления с основами перейдем к изучению дополнительных элементов связывания данных, которые позволяют создавать более сложные страницы, похожие на приложения.



Обновление данных

Объект источника данных может разрешить пользователю обновлять поставляемые данные. Когда пользователь обновляет данные в элементе, связанном с объектом источника данных, агент связывания сохраняет модифицированное значение в объекте источника данных. Объект источника данных может затем сохранить данные измененные значения в основном источнике данных.

В общем случае объекты источников данных поддерживают обновления данных, предоставляя пользователю возможность изменения данных, сохраняемых в локальном кэше. Объект источника данных может затем выбрать момент обновления данных в основном источнике данных: данные могут быть обновлены немедленно или в пакетном режиме. В кэше могут быть сохранены изменения в отдельной ячейке, отдельной строке или во всем наборе данных. Режим работы объекта источника данных будет выбран в зависимости от того, поддерживается ли соединение с основным источником данных. Когда кэшируется весь набор данных, то объекты источников данных обычно предоставляют метод, который Web-мастеры могут использовать для сохранения кэшируемых данных.

RDS является примером объекта источника данных, который обеспечивает возможность обновления данных. RDS работает в сочетании с компонентом серверной стороны, который активизирует доступ к источникам данных ODBC (Online Database Connectivity - средства связи с открытыми базами данных). RDS сохраняет весь набор данных (результат запроса SQL) в кэше локальной памяти. Помимо сохранения данных RDS сохраняет сопутствующую информацию для решения конфликтов, когда многочисленные пользователи одновременно модифицируют одни и те же значения данных. Данные, изменяемые пользователем, отправляются вместе с сопутствующей информацией серверному компоненту, который выполняет обновление базы данных. RDS может быть использована для построения сложных приложений клиент/сервер при помощи HTML и сценариев.

Примечание: Примеры приложений, написанных с использованием RDS, можно найти на Web-узле компании Microsoft по адресу www.microsoft.com/data. Серверные компоненты можно получить бесплатно по тому же адресу. Клиентские компоненты RDS являются составным элементом браузера Internet Explorer 4.0 и инсталлируются в минимальной конфигурации браузера.



Свойство recordNumber

Свойство recordNumber доступно для всех элементов, которые являются частью шаблона таблицы с повторением. Напомним, что при использовании таблицы с повторением содержание таблицы используется как шаблон и повторяется для каждой записи в наборе записей. Каждый экземпляр повторения называется экземпляром шаблона (template instance). Для всех элементов в экземпляре шаблона (включая элементы, которые не являются связанными данными, такие как теги <TR> и <TD>), свойство recordNumber обеспечивает номер записи из набора записей, который генерируется элементом.

Свойство recordNumber соответствует непосредственно свойству AbsoiutePosition набора записей ADOR. Используя свойство recordNumber для установки значения свойства AbsolutePosition в наборе записей, Web-мастер может получить доступ к дополнительным элементам данных из того же столбца набора данных. Вам требуется установить значение свойства AbsolutePosition, поскольку ADOR разрешает доступ только к полям текущей записи.

Свойство recordNumber не является закладкой. Это свойство изменяется в результате вставки или удаления строк из кэша локального клиента. Используя ADOR, однако, Web-мастер может получить закладку для столбца, используя свойство recordNumber:


<SCRIPT LANGUAGE="JavaScript">
var clone_rs = stocklist.recordset.clone();
clone_rs.AbsolutePosition = textbox1.recordNumber;
var bkmk = clone_rs.Bookmark;
</SCRIPT>

Данная закладка всегда указывает текущую запись в наборе записей, независимо от того, вставлены или удалены строки.

Свойство recordNumber может быть также использовано для помощи при навигации в семействе элементов в таблице с повторением. Вы можете установить уникальное имя для элемента HTML путем включения атрибута ID в тег элемента. Когда вы даете имя элементу в шаблоне таблицы с повторением, результатом является семейство элементов с одинаковым идентификатором (ID), поскольку шаблон повторяется для каждой записи в наборе данных. Свойство recordNumber может быть использовано в сочетании со сценарием для отображения подробной информации из записи, соответствующей выбранному элементу. Например, вместо одновременного просмотра всех данных по акциям, вам требуется просмотреть подробную информацию для определенной акции. Вы можете включить в таблицу кнопки селектора для выбора акции и затем установить выбранную акцию в качестве текущей записи с целью отображения подробных данных, используя приведенный ниже код:


<BODY TOPMARGIN=0 LEFTMARGIN=40 BGCOLOR="#FFFFFF">
<FONT FACE="verdana,arial,helvetica" SIZE=2>
<H2>Record Number</H2>
§
<TABLE>
<TR>
<TD VALIGN=top>
<TABLE ID="stocktbl" DATASRC="#stocklist" BORDER=1>
<THEAD>
<TR ONCLICK="sort();">
<TD> 
<TD CLASS=thd><DIV ID=Symbol>Symbol</DIV></TD>
<TD CLASS=thd><DIV ID=Last>Shares</DIV></TD>
<TD CLASS=thd><DIV ID=Volume>Volume</DIV></TD>
</TR>
</THEAD>
<TBODY>
<TR>
<TD>
<BUTTON CLASS=sb ONCLICK="setrn(this);">
<B>show</B>
</BUTTON>
</TD>
<TD><A DATASRC="Website"><SPAN DATAFLD="Symbol">
</SPAN></A>
</TD> <TD ALIGN=right><DIV DATAFLD="Shares"></DIV></TD>
<TD ALIGN=right>
<SPAN DATAFLD="Volume" DATAFORMATAS=HTML>
</SPAN>
</TD>
</TR>
</TBODY>
</TABLE>
</TD>
<TD VALIGN=top>
<B>Company Name:</B>
<SPAN DATASRC="#stocklist" DATAFLD="CompanyName">
</SPAN>
<BR>
<B>Last Updated:</B>
<SPAN DATASRC="#stocklist" DATAFLD="DateUpdated">
</SPAN>
<BR>
<B>Open:</B>
<SPAN DATASRC="#stocklist" DATAFLD="Open">
</SPAN>
<BR>
<B>High:</B>
<SPAN DATASRC="#stocklist" DATAFLD="High">
</SPAN>
<BR>
<B>Low:</B>
<SPAN DATASRC="#stocklist" DATAFLD="Low">
</SPAN>
<BR>
<B>PE Ratio:</B>
<SPAN DATASRC="#stocklist" DATAFLD="PERatio">
</SPAN>
<BR>
<B>Chart:</B>
<IMG ALIGN=top DATASRC="#stocklist" DATAFLD="Chart">
</SPAN>
</TR>
</TABLE>
§
<SCRIPT LANGUAGE="JavaScript">
function setrn(button) { stocklist.recordset.AbsolutePosition = button.recordNumber;
}
</SCRIPT>
</BODY>

На рис. 15.5 показана подробная информация, которая выводится на странице рядом с таблицей.

Рис. 15.5. Свойство recordNumber используется для отображения определенной записи в таблице с повторением



Изменение атрибутов связывания

Динамический HTML представляет свойства, которые соответствуют атрибутам и стилям тегов HTML-элементов. Атрибуты связывания данных не являются исключением. Web-мастер имеет возможность добавления, удаления и изменения свойств связывания данных для HTML-элементов после вывода страницы на экран. Более того, используя динамический HTML, Web-мастер может также добавлять и удалять объекты источника данных на странице.

Единственным недостатком данного соответствия является то, что атрибуты DATASRC, DATAFLD и DATAFORMATAS не могут быть изменены для элементов внутри таблицы с повторением. Вы можете обойти данное ограничение путем преобразования таблицы в стандартную HTML-таблицу. Сначала удалите атрибут DATASRC из таблицы. Таблица переходит к состоянию без повторения и содержит только шаблон. Элементы внутри шаблона, хотя они и не связаны, могут быть изменены. Атрибут DATASRC может быть затем добавлен обратно в таблицу для повторной установки режима повторения. Используя мультимедиа-расширения браузера Internet Explorer 4.0, Web-мастер может также приостановить повторное отображение таблицы, так что данная серия шагов будет происходить без многочисленных обновлений содержания экрана.

Примечание: Дополнительная информация о связывании данных может быть получена из раздела, посвященному Internet Explorer 4.0, на Web-узле компании Microsoft no адресу www.microsoft.com. Примеры можно также найти по тому же адресу.