Главная
>>
Каталог задач
>>
Веб-разработка
>>
Клиентский скриптинг(js, vba и т.д.)
>>
popup ("всплывающие") динамические окна
>>
Передача данных из основного во всплывающее-popup окно через POST
Aвтор:
this
Дата:
23.11.2006
Просмотров: 118615
реализации(javascript: 1шт...)
+добавить
В данной задаче решается следующая проблема.
Имеется некая javascript-функция. При выполнении эта функция должна открыть(создать) дополнительное popup, всплывающее окно передавая туда необходимые параметры, имеющиеся в виде js переменных в коде главного окна.
Что обычно делается в такой ситуации - вызывается window.open и указывается url, в составе которого добавляются все требуемые переменные, например:
window.open('/server.php?param1=1111¶m2=some%20datatopost¶m3=and_etc..',
'winname',
'top=15,left=20');
НО: длина url ограничена.
В протоколе http указано рекомендуемое ограничение(1024 символа). На деле и веб-сервер и браузер имеют свое ограничение, поэтому неограниченной длины url вообще не может быть, и если ваши данные закодированные в виде строки url - слишком объемные - они просто обрежутся.
Один из обходных - это серверная реализация, т.е. при формировании на сервере страницы главного окна, мы необходимые параметры помещаем в сессию, а при открытии popup-окна - еще на сервере эти данные из сессии достаются и достигаются требуемые цели.
Но если данные требуемые для передачи - до сервера еще не дошли: например, они только что были введены в input-поля пользователем, то вы ими располагаете всего лишь в переменных javascript-а, откуда передать их в серверную сессию хотя и можно(ajax или постинг в iframe) - но не советуется, очень усложняется код, логика обработки, да и сессия засоряется лишними, временными данными, которые нужны лишь чтоб 1 раз передать из popup окну.
Что еще можно сделать? Да, конечно же, у нас же есть POST метод, но как передать данные из javascript-а post-ом в popup окно? Довольно нетравиальная задача.
К счастью, очень изящно и просто решается в нескольких строчках кода. Выход в том, что если в атрибуте "target" формы указать имя, назначенное popup окну - постинг формы(вне завистимости от того каким методом: post/get) будет осуществлен браузером - в это окно, вне зависимости от того, какой url у него был назначен до этого. Т.е.:
- Динамически создаем скрытую POST-форму(css display = none)
- Динамически добавляем туда в виде input-ов все необходимые значения
- Открываем popup окно с определенным именем(например, pop1)
- Присваиваем свойству target формы значение = имени popup окна(target="pop1" т.е.)
- Динамически добавляем форму на страницу главного окна(appendChild в document.body например)
- Отправляем форму(метод submit())
- Удаляем эту форму со страницы, т.к. больше она не нужна.
Реализации:
javascript(1)
+добавить
1)
Передача данных из основного во всплывающее-popup окно используя POST на javascript, code #187[автор:this]
function Form2Popup(params, actionUrl, name, popupConfig, get) {
// free in choice: post or get
var method = (get == undefined || !get) ? 'POST' : 'GET';
// it's important to assign non-null name!
if (name == undefined || name == '') {
name = 'tmpPopup';
}
var form = document.createElement('<form action="' + actionUrl + '" method="' + method + '" target="' + name + '" style="display:none;"></form>');
var element = null;
for (var propName in params) {
element = document.createElement('<input type="text" name="' + propName + '" value="' + params[propName] + '">');
form.appendChild(element);
}
document.body.appendChild(form);
// First, open empty window: why make redundant request to server?
var win = window.open('about:blank', name, popupConfig);
// in order to restore this window
// if it's already been opened before
win.focus();
form.submit();
form.removeNode(true);
return win;
}
.......
// Example:
var _name = document.getElementById("nameDiv");
var _text = forms['myform'].messageTextarea.value;
var params = {name:_name,title:"user preview",txt:_text};
var previewPopup = Form2Popup(params, 'save.jsp?preview=1', 'preview', 'top=100,left=100,scrollbars=1');