Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Передача данных окну-детенышу (https://javascript.ru/forum/events/3847-peredacha-dannykh-oknu-detenyshu.html)

ec_stasis 28.05.2009 21:48

Передача данных окну-детенышу
 
Есть код
var win = window.open('url.php', 'mywindow', 'trata');
win.varName = 'Значение';



в большистве броузеров это работает, т.е. в документе 'url.php' в переменной varName я получаю значение 'Значение'.
Но не в Опере. Там получается, что переменная не определена.

Как сделать чтобы опера "увидела" эту передаваемую переменную?

Pattern 29.05.2009 00:37

Не знаю, как у кого, но у меня лично с оперой очень натянутые отношения.
А по вопросу... Чисто теория... А сделать наоборот не получится, всмысле, получить данные окна-родителя?

ec_stasis 29.05.2009 00:43

Наоборот не хотелось бы делать, т.к. для этого нужно создавать глобальные переменные. Приложение объемное, не хочется разводить бардак.
Да и для разных окон могут понадобиться разные данные.

Т.е. это конечно решение, но не самое лучшее.

Kolyaj 29.05.2009 00:48

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

Pattern 01.06.2009 00:26

Цитата:

Сообщение от ec_stasis (Сообщение 20327)
Наоборот не хотелось бы делать, т.к. для этого нужно создавать глобальные переменные. Приложение объемное, не хочется разводить бардак.

Ну тут вовсе не обязательно хранить глобальную переменную явным образом. Это может быть объект-хранитель данных.
var storage={
  param1: 'anyval1',
  param2: 'anyval1',
  ...,
  paramN: 'anyvalN'
};

Всё будет храниться в единой "базе данных" без всякого бардака. Всё зависит от организации хранимых данных.
Цитата:

Сообщение от ec_stasis (Сообщение 20327)
Да и для разных окон могут понадобиться разные данные.

Это никакого значения не имеет. Можешь напрямую обращаться к свойствам объекта, можешь написать функцию что то наподобии
var storage={
    ...
    setParam: function(p,v){
        if(this[p]&&v)
            this[p]=(typeof this[p]==='string')?v.length>0?v:'':parseInt(v);
    }
};

или если требуется какая то новая переменная
storage.newparam='newval';

Цитата:

Сообщение от ec_stasis (Сообщение 20327)
Т.е. это конечно решение, но не самое лучшее.

Боюсь, для реализации кроссбраузерности не избежать решений тех, которые являются "не самыми лучшими". Единого стандарта пока нет... И боюсь что вряд ли он когда-либо появится.

Octane 01.06.2009 02:00

Цитата:

Сообщение от Pattern (Сообщение 20548)
typeof this[p]==='string'

typeof всегда возвращает строку, поэтому строгое равенство без приведения типов здесь не нужно, всегда строка со строкой сравнивается.

x-yuri 01.06.2009 02:24

http://bash.org.ru/quote/354952
вспомнилось, не в обиду ;)

Pattern 01.06.2009 03:49

согласен с недочетом... чёт припарился... =)

ec_stasis 03.06.2009 01:33

Вобщем пришлось сделать "наоборот", т.е. из детеныша обращаться к родителю и брать данные из его свойств.

Количество детенышей ограничил количеством "один". Это даже логичнее в моей ситуации.

Данное решение пришлось применить по еще одной причине: при рефреше окно-детеныш теряет полученные при открытии данные. Пробовал закрывать окно при рефреше, но там вылезают новые косяки.

Можно было брать параметры из location'а, но это лишний код, преимуществ не дающий.

Всем спасибо за комментарии.


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