Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как присвоить значение элементу формы материнского окна из дочернего? (https://javascript.ru/forum/events/10748-kak-prisvoit-znachenie-ehlementu-formy-materinskogo-okna-iz-dochernego.html)

libinstyle 19.07.2010 13:11

Как присвоить значение элементу формы материнского окна из дочернего?
 
Добрый день! Возможно ли вообще это сделать?
Есть форма
<form name="mother" id="mother">
<input type="text" name="getvalue" id="getvalue" value="" />

</form>


Я открываю дочернее окно
function newwin() {
	var params = "width=300px, height=400px"
	var  newWin = window.open("dotter.html", "_blank" , params)
newWin.focus()


теперь, я хочу чтобы при onClick где нибудь в дочернем окне, текстовому полю главного окна
input type="text" name="getvalue"
присвоилось значение "fgkjfk" или какой нить переменной,
window.opener.document.getElementById('getvalue'). value="fgkjfk" не работает. Прошу вашей помощи.
Заранее спасибо!

exec 19.07.2010 13:17

window.parent.document.getElementById('getvalue').value="fgkjfk";

libinstyle 19.07.2010 13:20

Неа, не работает, так я тоже пробовал...

libinstyle 19.07.2010 13:33

var k=window.parent.document.getElementById('getval');
alert(k);
получаю значение null
а если заменить parent на opener, то вообще никакого alert'a нет

Получается, что эти два метода вообще мимо?

Kolyaj 19.07.2010 13:37

opener, наверное, null равен. Бывает такое. Можно попробовать так сделать.

function newwin() {
    var params = "width=300px, height=400px"
    var  newWin = window.open("dotter.html", "_blank" , params)
    newWin.focus()
    newWin.setValue = function(value) {
        document.getElementById('getvalue').value=value;
    }
}


А в дочернем окне писать
window.setValue('sdfsf');

libinstyle 19.07.2010 13:45

К сожалению, это тоже не работает, просто ничего не происходит..

libinstyle 19.07.2010 13:49

var k=window.parent.location;
alert(k);


выдает почему то ссылку на дочернее окно, а не на материнское..

Kolyaj 19.07.2010 13:53

Потому что parent -- это про фреймы.

Цитата:

Сообщение от libinstyle
просто ничего не происходит..

Просто ничего не происходит бывает крайне редко в особо извращённых случаях. Обычно показываются ошибки.

libinstyle 19.07.2010 14:04

Цитата:

Сообщение от Kolyaj (Сообщение 64338)
Потому что parent -- это про фреймы.


Просто ничего не происходит бывает крайне редко в особо извращённых случаях. Обычно показываются ошибки.

Кстати, да. По поводу ошибок, проверить в firebug не получилось, так как по не понятной причине, в firefox все работает исправно. В Opera, IE, Chrome не работает. IE- хрен с ним, это не уже давно не удивляет, оперой я не пользуюсь, но Хром.... От любимого браузера и такой удар в спину.... В общем это работает только в фаерфоксе... В чем подвох?

libinstyle 19.07.2010 14:09

Uncaught TypeError: Object [object DOMWindow] has no method 'setValue'

Это то что выдает Хромовский дебагер

libinstyle 19.07.2010 16:02

Вопрос остается в силе. Кто знает, подскажите, есть решение, которое хоть как то работает. а точнее работает только в ФФ:
function newwin() {
    var params = "width=300px, height=400px"
    var  newWin = window.open("dotter.html", "_blank" , params)
    newWin.focus()
    newWin.setValue = function(value) {
        document.getElementById('getvalue').value=value;
    }
}


Как сделать его кросс браузерным?

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

Panzermaus 19.07.2010 16:29

Неужто same-origin policy?!

Допустим, вы обращаететсь к основной странице как что-то-там/index.html, тогда если написать:
var  newWin = window.open("*!*что-то-там/*/!*dotter.html", "_blank" , params)
то в хроме начинает работать. В опере - не начинает.

Еще одна причина ненавидеть попапы :-E

libinstyle 19.07.2010 19:56

Да, но бывает, что для юзабилити они очень подходят..
 
Да, но бывает, что для юзабилити они очень подходят...:(

x-yuri 19.07.2010 22:00

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<input id="input" type="text">
<a href="#" onclick="
	var params = 'width=300px, height=400px';
	var  newWin = window.open('19.html', '_blank' , params);
">link</a>
</body>
</html>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<script type="text/javascript">
window.opener.document.getElementById('input').value = 2;
</script>
</body>
</html>

так работает в ie 8, opera 9, chrome

Цитата:

Сообщение от libinstyle
Да, но бывает, что для юзабилити они очень подходят...

хотелось бы продолжить тему... какие-нибудь конкретные примеры...

Panzermaus 19.07.2010 22:17

libinstyle, я вот тоже сейчас развлекаюсь, тупо через window.opener работает везде: IE 6, 7, 8, Chrome 2, Safari 4, Opera 10.6, FireFox 3.6.

Вы проверяли предположение Kolyaj?
Цитата:

Сообщение от Kolyaj (Сообщение 64333)
opener, наверное, null равен


Маэстро 28.07.2010 16:56

Теория здесь следующая. Броузеры загружают файлы в себя (в окна, во фреймы) асинхронно. Делают это они в отдельных потоках. И заранее не известно, когда произойдет процесс полной загрузки. Причём Fire Fox и Opera делают это со свойственными им прибамбасами. В то же время javascript продолжает работать...
см. http://javascript.ru/window.open

Это значит, что в общем случае, когда Вы объявили
newWin = window.open("dotter.html", "_blank" , params) и сразу следующей строкой назначили функцию окну newWin.setValue = function() ....,то
функция setValue хоть и присвоится окну, но после загрузки страницы в окно сразу же затрётся телом загруженного документа (в Вашем случае dotter.html)

Поэтому функцию доступа к объектам материнского окна необходимо вставлять в текст скрипта дочернего окна (в dotter.html)

пример.
материнская форма:
<form>
<input type="text" name="getvalue" id="getvalue" value="abcd">
</form>

<script type="text/javascript">
function newwin()
{
var params = "left=100px, top=300px, width=500px, height=200px";
newWin = window.open("dotter.html", "_blank", params)
newWin.focus();
}
</script>

<a href="javascript:newwin()">start newwin</a>

дочерняя форма (dotter.html):
<script type="text/javascript">
function buttononclick()
{
window.opener.document.getElementById('getvalue'). value = document.getElementById('dotterinput').value;
}
</script>

<input name=dotterinput id=dotterinput type="text" value="12345">
<button onclick=buttononclick()>GO</button>

Это работает в Opera, Fire Fox, Google Chrome и даже в IE 6.

Хочу предупредить, что если Вы экспериментируете со скриптами на локальном компьютере, то Google Chrome хоть и показывает объект window.opener, но дальше никуда не пускает. Он не показывает window.opener.document, соответственно нельзя воспользоваться window.opener.document.getElementById(). Но это не страшно, т.к. после загрузки скриптов на реальный сервер Google Chrome "попускает" ;)
В некоторых случаях для получения доступа из дочернего окна к элементам материского окна прийдётся указать document.domain='lalalala.com'

А вообще мой совет - не используйте window.open(). Практически его оставили только для совместимости со старыми скриптами. Всплывающие окна, вызванные window.open() сейчас раздражают большинство людей. Какая альтернатива? - На этом сайте в какой-то статье описывалось как создать свои собственные окна на примере замены стандартного "alert()"


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