Решение, позволяющее применять запросы POST в скрытых плавающих фреймах, заключается в том, чтобы загрузить в скрытый фрейм страницу, содержащую форму, заполнить эту форму необходимой информацией и затем передать ее. Когда пользователь потребует отправить данные из видимой формы (т. е. из формы, в которую пользователь
вводит данные), надо будет отменить отправку формы и перенести информацию в скрытый фрейм.Для этого опишем функцию, которая создает плавающий фрейм и загружает в него скрытую форму:
function checklFrame() {
if (!oIFrame) {
createIFrame();
}
setTimeout(function () {
oIFrame.location = "ProxyForm.htm";
}10);
}
Функция checkFrame () сначала проверяет, был ли ранее создан скрытый плавающий фрейм. Если нет, она вызывает функцию createlFrame().Затем через определенный промежуток времени устанавливается адрес страницы, которая должна быть загружена во фрейм ProxyForm.html) и которая представляет собой скрытую страницу с формой. Поскольку эта функция может вызываться много раз,важно обеспечить, чтобы эта страница каждый раз загружалась снова.
Файл Proxy Form, html очень прост. Он содержит небольшой фрагмент кода JavaScript,который извещает главную страницу о том, что он был загружен:
Скрытая форма
window.onload = function () {
parent.formReady();
}
Как видите, тело страницы содержит только пустую форму, а заголовок
- только обработчик события onload. После загрузки страницы будет
вызвана функция parent. formReadyO, которая даст знать основной
странице, что готова принять запрос. Функция formReadyO, расположенная
в главной странице, выглядит следующим образом:
function forReady(){
var oHiddenForm = oIFrame.document.forms[0];
var oForm = document.forms[0];
for (var i=0 ; i < oForm.elements.length; i++) {
var oHidden = oIFrame.document.createElement("input");
oHidden.type = "hidden";
oHidden.name = oForm.elements[i].name;
oHidden.value = oForm.elements[ij.value;
oHiddenForm.appendChild(oHidden);
}
oHiddenForm.action = oForm.action;
oHiddenForm. submit();
}
Прежде всего эта функция получает ссылку на форму в скрытом плавающем фрейме через массив document, forms этого фрейма. Поскольку в этой странице существует всего одна форма, мы без опаски можем взять ссылку на первую форму (индекс 0) и сохранить ее в переменной
oHiddenForm. Вслед за этим мы получаем ссылку на форму в главной странице и сохраняем ее в переменной oForm. Далее в цикле for выполняется обход всех элементов формы главной страницы (с помощью массива elements). Для каждого элемента формы главной страницы создается соответствующий элемент формы в скрытом фрейме (обратите внимание: привычное обращение document, с reateElement () надо заменить обращением oIFrame. document. createElement()). Затем вновь созданному
скрытому элементу присваиваются значения атрибутов name
и value элемента главной формы, после чего он добавляется в скрытую форму с помощью функции appendChild().
После добавления всех элементов атрибуту action скрытой формы присваивается такое же значение, какие у формы главной страницы. Благодаря тому что значение атрибута action копируется, а не жестко зашито
в код, мы получаем возможность применять одну и ту же функцию formReady() на любом количестве различных страниц. В заключение функция выполняет отправку скрытой формы.
Нам осталось побеспокоиться только о том, чтобы предотвратить отправку главной формы обычным способом (по умолчанию). Для этого в качестве обработчика события onsubmit подставляется функция checkIFrame() и возвращается значение false:
<р>Введите сведения о клиенте:
<р>Имя клиента:
Адрес:
Город:
Область:
Почтовый индекс:
Телефон:
Электронная почта:
Возвращая значение false, мы тем самым отменяем поведение формы по умолчанию (отправить себя серверу). Вместо этого запускается метод checkIFrame(), и начинается процесс отправки скрытой формы.
Теперь вы можете использовать этот пример точно так же, как и пример,построенный на основе скрытого обычного фрейма; страница SaveCustomer.php будет обрабатывать данные и вызывать функцию saveResult
( ) главной страницы по окончании обработки.