Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как передать параметры из дочернего окна в родительское с задержкой? (https://javascript.ru/forum/misc/13238-kak-peredat-parametry-iz-dochernego-okna-v-roditelskoe-s-zaderzhkojj.html)

javascript_pupil 22.11.2010 12:03

Как передать параметры из дочернего окна в родительское с задержкой?
 
Есть родительское окно. В нём стоит обычный select при изменении которого в текстовое поле подставляются выбранные значения из выпадающего списка. Всё прекрасно работает.

Потребовалось дать возможность пользователю добавлять собственные значения, а не только те, что предлагают опции выпадающего списка. Добавил в javascript if/else которые при выборе клиентской опции открывает новое окно. Окно открывается, пользователь производит какие-то действия, затем возвращает в родительское окно opener, всё возвращается, только проблема в том, что javascript уже отработал и возвращённое значение уже никому не нужно. Как быть?

Вот кусок кода:

var file_name = document.submit_form.file_from_select.value;

if (file_name == "new") {
window.open("bla-bla-bla");
}
...
req.open("GET", "script.cgi?file=" + , true);


Соответственно пока открывается новое окно javascript уже доходит до вызова GET, передает туда не данные из открывшегося окна (т.к. там пользователь еще не успел ничего выбрать), а "new", соответственно script.cgi такого значения не находит и нужной работы не выполняет.

Какой-то таймаут ставить я не понимаю как, ведь пользователь с этим новым окном может работать и минуту и 10 минут.

Как быть и есть ли вообще решение?

P.S. В примерах везде приводится открытие нового окна и только после выбора в нем некоего значения возврат к родительскому. В моем же случае у javascript'а уже есть набор необходимых значений и он их обрабатывает не дожидаясь возврата.

ksa 22.11.2010 14:32

javascript_pupil, при таком открытии окон вы вообще можете остаться без родительского... :)
Как вариант делать "псевдоокно", т.е. обычный див, разукрашеный как окно и все действия производить в нём.
Либо showModalDialog!

monolithed 22.11.2010 14:53

Цитата:

Сообщение от ksa
showModalDialog!

давайте тогда уже и showHelp() возьмем для кооллекции;

на этом можно и остановиться:
Цитата:

Сообщение от ksa
Как вариант делать "псевдоокно", т.е. обычный див, разукрашеный как окно и все действия производить в нём.


ksa 22.11.2010 15:12

Цитата:

Сообщение от monolithed
давайте тогда уже и showHelp() возьмем для кооллекции;

Ну это на любителя...

monolithed 22.11.2010 15:15

Цитата:

Сообщение от ksa
Ну это на любителя...

Я же пошутил:blink: :D

javascript_pupil 22.11.2010 15:34

Я плохо понимаю о чем вы? У меня был и есть скрипт который работал и выполнял свою задачу. Я решил его усовершенствовать и добавил опцию, которая открывает новое окно, в котором можно указать новое название файла.

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

ksa 22.11.2010 16:26

Цитата:

Сообщение от monolithed
Я же пошутил

Я тоже... :dance:

monolithed 22.11.2010 16:28

Цитата:

Сообщение от javascript_pupil
Новый файл загружается, но для того, чтобы он появился в выпадающем списке необходимо перезагрузить родительскую страницу. Этого я и хотел избежать передавая имя файла (с чем собственно скрипт и проводит манипуляции) обратно к родителю.

Ajax'om подгружайте

ksa 22.11.2010 16:29

Цитата:

Сообщение от javascript_pupil
чтобы он появился в выпадающем списке необходимо перезагрузить родительскую страницу

Это не обязательно делать...
Достаточно просто обратиться к родительскому окну из дочернего и выполнить в нём нужные преобразования.

Цитата:

Сообщение от javascript_pupil
Я решил его усовершенствовать и добавил опцию, которая открывает новое окно, в котором можно указать новое название файла.

Правда при этом никто не помешает пользователю закрыть родительское окно и привет. :cray:

Может пора более радикально усовершенствовать свой "скрипт"?

javascript_pupil 22.11.2010 18:34

Цитата:

Сообщение от ksa
обратиться к родительскому окну из дочернего и выполнить в нём нужные преобразования.

Так вот я это и пытаюсь сделать, а javascript уже выполнен к тому времени, когда пользователь в дочернем окне создал событие onchange. Как остановить выполнение я не понимаю, т.к. вовсе не обязательно, что пользователю потребуется новый файл. Вполне возможно, что он будет использовать уже имеющийся из списка.

Т.е. мне каким-то образом надо прервать выполнение скрипта, если одно из значений выпадающего списка равно, например, "new'. После этого в новом окне определится название нового файла и через opener будет возвращено родителю. Родитель же продолжит выполнение скрипта, но уже с новым, полученным из дочернего окна значением. Если же переменная не эквивалента заданному значению, то текущий скрипт выполняется как обычно. Как это сделать (вставить доп.условие и прервать выполнение скрипта до получения нового значения) я не знаю. Пытаюсь найти ответ у специалистов по этому языку. :)

Kolyaj 22.11.2010 18:44

Цитата:

Сообщение от javascript_pupil
прервать выполнение скрипта до получения нового значения

Никак.

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

Вместо
function foo() {
    return 5;
}
alert(foo());

Надо
function foo(callback) {
    callback(5);
}
foo(function(res) {
    alert(res);
})

ksa 22.11.2010 18:59

javascript_pupil, таки не в том скрипте ты это делаешь... Пиши скрипт в дочернем окне. Именно он и будет менять родительские данные...

Скрипт в родительском должен закончить работу, если вызвано дочернее окно...

Далее без конкретики и тестовых примеров видно дело не продвинется... :)

javascript_pupil 23.11.2010 01:55

Kolyaj, честно говоря ничего не понял из примера.

Цитата:

Сообщение от ksa
Пиши скрипт в дочернем окне. Именно он и будет менять родительские данные

Это оказалось проще всего, но я наткнулся на другие грабли. Сейчас объясню где: изменил расположение if/else так, что либо скрипт с уже определенными именами выполняется, либо при выборе нового файла открывается новое окно. Всё замечательно и прекрасно работает. Но! вернуть opener'ом данные в select невозможно, да и смысла нет т.к. их потом не выбрать родительским javascript'ом. Вернуть opener как я понял можно только в данные формы, если же я это успешно делаю, то название файла замещает текст в поле textarea, а мне нужно, чтобы opener не замещал, а добавлял его к уже имеющемуся в форме, иначе вся эта суета теряет смысл. Я так понимаю, что это невозможно?

javascript_pupil 23.11.2010 03:02

я так понял, что мне проще перегружать AJAX'ом выпадающий список, вызвав соответствующую функцию после загрузки нового файла в дочернем окне. В связи с этим возникли дополнительные вопросы:
1. Как javascript'ом проверить является ли окно дочерним или нет? Т.е. мн необходимо запускать функцию только в том случае, если данное окно было открыто родительским. Если же окно не является дочерним, данная функция запускаться не должна.
2. Пока не могу понять, как AJAX'ом перезагрузить выпадающий список (всё это работает в перловом скрипте).

ksa 23.11.2010 09:07

Цитата:

Сообщение от javascript_pupil
название файла замещает текст в поле textarea, а мне нужно, чтобы opener не замещал, а добавлял его к уже имеющемуся

таки пиши не так
document.getElementById('ид_textarea').value=<имя_файла>


а вот так
var val=document.getElementById('ид_textarea').value
document.getElementById('ид_textarea').value=val+<имя_файла>


Цитата:

Сообщение от javascript_pupil
вернуть opener'ом данные в select невозможно

Как так? :blink:
Добавь в селект еще один оптион и сделай его выбраным элементом...

Пора тебе делать тестовые примеры. Чего на пальцах-то тренироваться?

Цитата:

Сообщение от javascript_pupil
Как javascript'ом проверить является ли окно дочерним или нет?

Как вариант...

<!DOCTYPE html>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<style>
</style>
<script>
</script>
</head>
<body onload='alert((window.opener)? "дочернее": "родительское")'>
<input type='button' value='Go' onclick='window.open("tmp.html")'>
</body>
</html>

Пример скопировать в файл tmp.html и открыть в браузере...

javascript_pupil 23.11.2010 21:42

Всем спасибо за советы и участие!

Самым оптимальным вариантом оказалось использование Ajax'а для перезагрузки выпадающего меню, что собственно и было реализовано. Многие советы и подсказки в этой ветке были интересными и полезными, ещё раз спасибо - они пригодились!


Часовой пояс GMT +3, время: 02:56.