Класс Customer включен в состав серверного сценария, и можно приступить к разработке страницы, которую будет получать клиент. Как уже говорилось, основная идея состоит в том, чтобы заполнить поля формы, пока пользователь выбирает продукт. На рис. 10.2 приводится изображение тестовой страницы.

Внутри функции init() инициализируется переменная remoteCustomer. Поскольку объявление переменной не имеет спецификатора var, она получает глобальную область видимости и будет доступна из любого места страницы:
function init()
remoteCustomer = new customer(customerCallback);
}
В этой строке имеется два интересных момента. Во-первых, имя конструктора класса customer записано в нижнем регистре. Это связано с особенностями реализации механизма рефлексии в РНР. Все имена классов и методов при использовании внутри кода JavaScript должны записываться символами нижнего регистра. Во-вторых, конструктору в качестве аргумента передается объект обратного вызова. Этот объект обладает своими собственными методами, которые будут вызываться при получении ответа от сервера.
var customerCallback = {
getaddressfromemail: function(address) {
showAddress(address);
};
Объект customerCallback объявляется в JavaScript как объект-литерал. Свойство, объявленное с именем getaddressfromemail, как показано выше, - это версия метода класса Customer, имя которого записано символами нижнего регистра.
За дополнительной информацией об объектах-литералах обращайтесь к главе 7.
Со свойством связана анонимная функция. Она принимает аргумент address, содержащий информацию, полученную от сервера. Эта функция передает значение своего аргумента функции showAddress(), которая отображает полученную информацию на странице (рис. 10.3).
Когда поле ввода электронного адреса теряет фокус ввода после нажатия клавиши Tab или щелчка по элементу , возникает событие onblur, для обработки которого вызывается функция fetchAddressO, чтобы с использованием технологии Ajax получить соответствующую информацию из базы данных на сервере:
function fetchAddress(Email) {
В первую очередь проверяется, содержит ли аргумент Email строку с адресом:
function fetchAddress(Email) {

replacelfNull(Address["forenames"], ""); document.getElementByld("txtSurname").value =
replacelfNull(Address["surname"], ""); // Далее идет заполнение остальных полей ввода...
Текстовые поля на странице заполняются информацией из базы данных. Для вывода отсутствующих в базе значений вызывается маленькая вспомогательная функция replacelfNull(), которая замещает недружественное слово null на пустую строку.
function repiacelfNulKValue, ReplaceWith)
{
if (Value == null) {
return ReplaceWith; return Value;
}
Функция replacelf Null() проверяет значение первого аргумента и, если это null, возвращает значение второго аргумента ReplaceWith. Если значение первого аргумента не null, то оно и возвращается.
Если запрошенный электронный адрес не будет найден в базе данных, функция очистит все поля формы.
Затем проверяется значение элемента success. Если он содержит значение false, то перед пользователем выводится сообщение о необходимости самостоятельного заполнения полей. Вслед за этим фокус ввода перемещается в поле ввода имени.
if (!Address["success"]) {
alert("Bam адрес не зарегистрирован, "+
"пожалуйста, заполните остальные поля ввода."); document.getElementByld("txtForenames").focus();
)
}
Сохраните получившийся файл под именем CustomerClient-JPSpan.htm в том же самом каталоге, что и CustomerServer. php. В случае успешного завершения поиска, страница должна иметь примерно следующий вид.