Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как передать переменную из родительского окна в выпадающее (opener)?
 
 автор: coloboc66   (15.08.2007 в 11:32)   письмо автору
 
 

Заранее спасибо.

   
 
 автор: CNT   (16.08.2007 в 02:11)   письмо автору
 
   для: 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; // а это вы переменной ССС из дочернего окна
                                   // присвоили значение другой переменной ВВВ из того же дочернего окна

   
 
 автор: coloboc66   (17.08.2007 в 11:14)   письмо автору
 
   для: 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

   
 
 автор: CNT   (17.08.2007 в 19:26)   письмо автору
 
   для: coloboc66   (17.08.2007 в 11:14)
 

Разумеется, получите ошибку.
Скрипт выпоняется последовательно и СРАЗУ!

У вас написано - открыть окно (var MyNewWindow=window.open...)
И поотом СРАЗУ идет обращение к объекту (MyNewWindow), который ещё не сформирован (не успело окно-то открыться!).

Необходимо дать время на открытие окна и формирование в нем документа.
И вообще, желательно не просто дать время, а и иметь уверенность в том, что объект сформирован.

Т.е. вам в родительском окне надо запустить таймер, проверяя каждую секунду (или сколько вы там хотите) - является ли объект MyNewWindow сформированным. Это делается просто - после команды на открытие окна прописываете следующее:
setTimeout (myFunc, 1000);
function myFunc ()
{
if (!self.MyNewWindow) setTimeout (myFunc, 1000);
else {здесь всё то, что вы хотите сделать с переменными дочернего и родительского окна}
}

   
 
 автор: coloboc66   (18.08.2007 в 16:54)   письмо автору
 
   для: 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

   
 
 автор: Chronus   (18.08.2007 в 17:08)   письмо автору
 
   для: coloboc66   (18.08.2007 в 16:54)
 

А не лучше play.htm в play.php пределать и передать методом GET всё что надо? Дальше дело техники...

   
 
 автор: coloboc66   (18.08.2007 в 17:24)   письмо автору
 
   для: Chronus   (18.08.2007 в 17:08)
 

С РНР это слишком просто. Но вот очень хочется решить эту задачу средствами ява-скрипт. У меня, может, хостинг без РНР...

   
 
 автор: Chronus   (18.08.2007 в 18:05)   письмо автору
 
   для: coloboc66   (18.08.2007 в 17:24)
 

Если JS, то ещё как вариант, сымитировать окно с помощью отдельного слоя, а не окна и юзать уже на полную со всеми переменными. При желании слой можно сделать так, что он будет неотличим от настоящего окна. Хотя, если важно именно окно (window), то надо подумать. А пошагово делал или нет? То есть 1) клик - открываем окно 2) второй клик - пробуем передать что-то в него и смотрим. То есть чтобы завязок на тайминги не были, сомнений по поводу создалось, не создалось...в ручную всё. Если полуавтоматом по шагам заработает, то значит возможно сделать и автоматически.

   
 
 автор: coloboc66   (18.08.2007 в 18:23)   письмо автору
 
   для: Chronus   (18.08.2007 в 18:05)
 

Пробовал пошагово: дохожу до того. что переменная
а получает нужное мне значение и является глобальной, осталось её только передать в дочернее окно, тут всё и стопорится... Короче вопрос такой: имеем в родительском окне
<script>
var a ="Hello";
</script>

Как её передать в выпадающее?

   
 
 автор: Chronus   (18.08.2007 в 19:10)   письмо автору
 
   для: 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. Наслаждаемся результатом.

Примечание.
Если нужно передать много чего, то предлагаю создать объекты - скрытые слои (в дочернем документе конечно, можно сразу создать, а можно и динамически организовать) и в них всё передавать и хранить.

   
 
 автор: coloboc66   (19.08.2007 в 09:23)   письмо автору
 
   для: Chronus   (18.08.2007 в 19:10)
 

to Cronus: ваш код без алерта не работает, оказывается. В общем, использовал ваш код и добавил в родительском и дочернем окне по таймеру, как советовал CNT, алерт убрал, после этого всё заработало. Спасибо всем.

   
 
 автор: Shiva   (19.08.2007 в 11:22)   письмо автору
 
   для: coloboc66   (19.08.2007 в 09:23)
 

Есть событие window.onload, позволяющее обойтись без таймеров. Здесь вы, по сути, создали прослушивание, дублирующее прослушивание браузера.

   
 
 автор: coloboc66   (19.08.2007 в 11:31)   письмо автору
 
   для: Shiva   (19.08.2007 в 11:22)
 

И где его использовать? В дочернем окне?

   
 
 автор: CNT   (19.08.2007 в 17:48)   письмо автору
 
   для: 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.

   
 
 автор: coloboc66   (19.08.2007 в 22:43)   письмо автору
 
   для: CNT   (19.08.2007 в 17:48)
 

Ну да: не получается с window.onload...

   
 
 автор: CNT   (20.08.2007 в 04:13)   письмо автору
 
   для: coloboc66   (19.08.2007 в 22:43)
 

Не понял - что не получается?

   
 
 автор: coloboc66   (21.08.2007 в 17:58)   письмо автору
 
   для: CNT   (20.08.2007 в 04:13)
 

Да ставил в дочернем окне вместо таймера window.onload и код переставал работать. Оставил таймер.

   
 
 автор: CNT   (21.08.2007 в 18:47)   письмо автору
 
   для: coloboc66   (21.08.2007 в 17:58)
 

А в дочернем окне таймер и не нужен вовсе.
Таймер нужен в окне родительском для случая, если окно дочернее ещё не открылось.
А в дочернем - onload, который передаст в родительское сообщение "я готово" (изменит значение флага Flag с false на true).

PS. Я сейчас в посте (где про два варианта) дополнительно написал жирно - где родитель, а где дочка.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования