|
|
|
|
|
для: coloboc66
(15.08.2007 в 11:32)
| | У вас неувязочка в заголовке.
opener - это как раз то самое родительское окно. Оно же - parent
А передать значение просто.
Обязательно нужно при открытии окна озаботиться присвоением этого окна переменной, т.е. записать открытие следует не как window.open (бла_бла_бла), а присваивая это окно какой-нить переменной, вот так: var MyNewWindow = window.open (бла_бла_бла)
Теперь в родительском окне любая переменная (существующая или вновь создаваемая) - это объект родительского окна, а те, которые "привязаны" к объекту MyNewWindow - те из дочернего:
Все записи - в скрипте родительского окна:
var AAA = document.body.bgColor; //ААА - это переменная родительского окна
MyNewWindow.BBB = AAA; // а это вы переменной BBB из дочернего окна
// передали значение переменной из родительского. При этом,
// если таковая переменная BBB в дочернем окне не была определена ранее,
// то этой записью вы переменную BBB в дочернем окне создали.
MyNewWindow.ССС = MyNewWindow.BBB; // а это вы переменной ССС из дочернего окна
// присвоили значение другой переменной ВВВ из того же дочернего окна
|
| |
|
|
|
|
|
|
|
для: CNT
(16.08.2007 в 02:11)
| | Не получается: в родительском окне пишу
<script>
var MyNewWindow=window.open('play.htm','windowname','toolbar=no,location=no,width=200px,height=200px');
var AAA='Hi';
MyNewWindow.BBB=AAA;
MyNewWindow.focus();
</script>
|
В файле play.htm пишу:
<script>
document.write(MyNewWindow.BBB);
</script>
|
Получаю ошибку MyNewWindow is not defined | |
|
|
|
|
|
|
|
для: coloboc66
(17.08.2007 в 11:14)
| | Разумеется, получите ошибку.
Скрипт выпоняется последовательно и СРАЗУ!
У вас написано - открыть окно (var MyNewWindow=window.open...)
И поотом СРАЗУ идет обращение к объекту (MyNewWindow), который ещё не сформирован (не успело окно-то открыться!).
Необходимо дать время на открытие окна и формирование в нем документа.
И вообще, желательно не просто дать время, а и иметь уверенность в том, что объект сформирован.
Т.е. вам в родительском окне надо запустить таймер, проверяя каждую секунду (или сколько вы там хотите) - является ли объект MyNewWindow сформированным. Это делается просто - после команды на открытие окна прописываете следующее:
setTimeout (myFunc, 1000);
function myFunc ()
{
if (!self.MyNewWindow) setTimeout (myFunc, 1000);
else {здесь всё то, что вы хотите сделать с переменными дочернего и родительского окна}
}
|
| |
|
|
|
|
|
|
|
для: CNT
(17.08.2007 в 19:26)
| | Всё-равно не выходит, уже для верности все нужные переменные сделал глобальными:
<html>
<body>
<a href="#" id="1758.avi" onclick="open_window(this.id)">file1</a><br/>
<a href="#" id="1759.avi" onclick="open_window(this.id)">file2</a><br/>
<a href="#" id="1760.avi" onclick="open_window(this.id)">file3</a><br/>
<script>
var clip;
var MyNewWindow;
var a;
function open_window(file_id)
{
clip=file_id;
var url="play.htm";
MyNewWindow=window.open(url,"opener","toolbar=no,location=no,directories=no,status=yes,menubar=no,scrollbars=no,resizable=no,width=300px,height=300px");
setTimeout (myFunc, 1000);
MyNewWindow.focus();
}
function myFunc ()
{
if (!window.self.MyNewWindow) {setTimeout (myFunc, 1000);}
else
{
a=MyNewWindow.file=clip;
}
}
</script>
</body>
</html>
|
и получаю ту же ошибку: а is not defined | |
|
|
|
|
|
|
|
для: coloboc66
(18.08.2007 в 16:54)
| | А не лучше play.htm в play.php пределать и передать методом GET всё что надо? Дальше дело техники... | |
|
|
|
|
|
|
|
для: Chronus
(18.08.2007 в 17:08)
| | С РНР это слишком просто. Но вот очень хочется решить эту задачу средствами ява-скрипт. У меня, может, хостинг без РНР... | |
|
|
|
|
|
|
|
для: coloboc66
(18.08.2007 в 17:24)
| | Если JS, то ещё как вариант, сымитировать окно с помощью отдельного слоя, а не окна и юзать уже на полную со всеми переменными. При желании слой можно сделать так, что он будет неотличим от настоящего окна. Хотя, если важно именно окно (window), то надо подумать. А пошагово делал или нет? То есть 1) клик - открываем окно 2) второй клик - пробуем передать что-то в него и смотрим. То есть чтобы завязок на тайминги не были, сомнений по поводу создалось, не создалось...в ручную всё. Если полуавтоматом по шагам заработает, то значит возможно сделать и автоматически. | |
|
|
|
|
|
|
|
для: Chronus
(18.08.2007 в 18:05)
| | Пробовал пошагово: дохожу до того. что переменная
а получает нужное мне значение и является глобальной, осталось её только передать в дочернее окно, тут всё и стопорится... Короче вопрос такой: имеем в родительском окне
<script>
var a ="Hello";
</script>
|
Как её передать в выпадающее? | |
|
|
|
|
|
|
|
для: coloboc66
(18.08.2007 в 18:23)
| | Всё очень даже просто. Прилагаю наваенный мной сейчас пример.
Шаг 1. Создаём файл №1. Главный.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Main Win</title>
<script>
var a="Hello World!";
function init(){
var url='childwin.html', win = window.open(url,'winname','toolbar=no,location=no,width=100,height=100');
window.alert('Click OK and view child win');
win.document.getElementById('fortext').innerHTML=a;
}
</script>
</head>
<body>
<p onclick="init()">CLICK ME!</p>
</body>
</html>
|
Шаг 2. Создаём файл №2. Дочерний (не забыть назвать childwin.html).
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>I'm child Win</title>
</head>
<body>
<p id="fortext"></p>
</body>
</html>
|
Шаг 3. Наслаждаемся результатом.
Примечание.
Если нужно передать много чего, то предлагаю создать объекты - скрытые слои (в дочернем документе конечно, можно сразу создать, а можно и динамически организовать) и в них всё передавать и хранить. | |
|
|
|
|
|
|
|
для: Chronus
(18.08.2007 в 19:10)
| | to Cronus: ваш код без алерта не работает, оказывается. В общем, использовал ваш код и добавил в родительском и дочернем окне по таймеру, как советовал CNT, алерт убрал, после этого всё заработало. Спасибо всем. | |
|
|
|
|
|
|
|
для: coloboc66
(19.08.2007 в 09:23)
| | Есть событие window.onload, позволяющее обойтись без таймеров. Здесь вы, по сути, создали прослушивание, дублирующее прослушивание браузера. | |
|
|
|
|
|
|
|
для: Shiva
(19.08.2007 в 11:22)
| | И где его использовать? В дочернем окне? | |
|
|
|
|
|
|
|
для: coloboc66
(19.08.2007 в 11:31)
| | Давайте рассмотрим варианты.
Вариант 1. В родительском окне один раз формируется значение некой переменной (например, клиент ввёл что-то в текстовое окно, или же отметил какой-то чекбокс...) и после этого (переменная уже определена) открывается дочернее окно, куда необходимо это значение передать.
В этом варианте я бы решал задачу так.
В родительском окне прописываю:
// РОДИТЕЛЬСКОЕ ОКНО
var AAA = "передаваемое значение";
window.open ('дочерний_файл.htm?' + escape (AAA), '' , параметры дочернего окна);
| А в файле дочернего окна устраиваю разбор query_string
// ДОЧЕРНЕЕ ОКНО
<head><script>
var BBB = unescape (document.location.href.split ('?') [1]);</script>
| Таким образом, ещё до формирования тела документа дочернему окну будет передано значение переменной AAA родительского окна.
ИМХО - самый простой и надежный метод (эскейпирование необходимо при передаче не-ASCII символов, типа кириллицы)
-----
Вариант 2. Значение переменной в родительском окне ещё неизвестно, а окно уже открыто. Значение переменной может быть сформировано в родительском окне несколько раз и эти несколько раз нужно будет это значение пердавать в дочернее.
Тогда в родительском окне прописываю:
// РОДИТЕЛЬСКОЕ ОКНО
var Flag = false; //флаг окончания загрузки тела дочернего окна
var newWin = window.open ('дочерний_файл.htm', '' , параметры дочернего окна);
...
//каждый раз (или даже всего один раз), когда нужно передать
var AAA = "передаваемое значение";
if (!Flag) {включаем таймер и дожидаемся открытия дочернего окна, ибо сигнала из него не получено}
else if (!newWin.closed ()) newWin.CCC (AAA);
else {клиент закрыл дочернее окно, передать ничего нельзя}
|
А в дочернем окне, во-первых, формирую функцию CCC, которая будет запускаться из родительского окна и переданный аргумент присваивать переменной BBB; во-вторых, передаю сигнал в родительское окно об окончании загрузки:
// ДОЧЕРНЕЕ ОКНО
<head>
<script>
var BBB;
function CCC (x) {BBB = x; ну и далее - что нужно с этим BBB делать}
onload = function () {window.opener.Flag = true}
</script>
| Т.е. без таймера, если момент передачи из родительского в дочернее неизвестен, всё равно не обойтись, даже используя onload в дочернем окне. А ежели момент известен, и совпадает с открытием дочернего окна (и однократен), то тогда смотри вариант 1. | |
|
|
|
|
|
|
|
для: CNT
(19.08.2007 в 17:48)
| | Ну да: не получается с window.onload... | |
|
|
|
|
|
|
|
для: coloboc66
(19.08.2007 в 22:43)
| | Не понял - что не получается? | |
|
|
|
|
|
|
|
для: CNT
(20.08.2007 в 04:13)
| | Да ставил в дочернем окне вместо таймера window.onload и код переставал работать. Оставил таймер. | |
|
|
|
|
|
|
|
для: coloboc66
(21.08.2007 в 17:58)
| | А в дочернем окне таймер и не нужен вовсе.
Таймер нужен в окне родительском для случая, если окно дочернее ещё не открылось.
А в дочернем - onload, который передаст в родительское сообщение "я готово" (изменит значение флага Flag с false на true).
PS. Я сейчас в посте (где про два варианта) дополнительно написал жирно - где родитель, а где дочка. | |
|
|
|