Javascript передача данных из дочернего окна в родительское окно, IE ошибка? - PullRequest
7 голосов
/ 24 апреля 2009

У меня есть всплывающее окно, которое возвращает данные его родителю. Использование window.opener.document.data = data_from_popup;

Это хорошо работает в FF, но в IE (6/7) к данным можно получить доступ во время отображения всплывающего окна. Когда я закрываю всплывающее окно, похоже, что данные собираются мусором.

Я пытался использовать функцию clone () для данных, полученных из всплывающего окна:

window.opener.add_data(data_from_popup);

и в родительском:

function add_data(data_from_popup) {
 data = clone(data_from_popup); 
}

В некоторой степени это работает, но при определенных условиях функция clone() кажется бесконечной.

Вы когда-нибудь испытывали то же самое, и есть ли способ предотвратить это без использования функции клона?

Ответы [ 2 ]

6 голосов
/ 24 апреля 2009

Не знаю точно, что вы испытываете, но я успешно регулярно храню данные об открывателе из дочернего всплывающего окна в IE (6,7 и 8) в приложениях для разработки и производства.

У вас есть URL-адрес или какой-либо другой исходный код, который вы можете предоставить?

в связанной заметке ... вы не пытаетесь определить тип объекта на открывателе ... из всплывающего окна вы? - в этой области есть некоторые известные ошибки IE.

Обновление:

Вот краткий пример ...

<!--main window-->
<script>
  function getThing(id){
    url = 'http://mysite.com/...whatever...';
    features = 'locationbar=X,menubar=Y...';
    window['popup4'+id] = open(url, 'someNameWithoutSpaces', features);
  }
  function popupCallback(data){
    alert('I got data back! ' + data);
    document.getElementById('someID').innerHTML = '<b>' + data.label + ' (' + data.id + ')</b>';
    //close the popup (now that we have/are done with the data)
    window['popup4someID'].close();
  }
</script>
<div id="someID">{Nothing Selected Yet}</div>
<input type="button" value="Pick One" onclick="getThing('someID');"/>

<!--popup window-->
<script>
  function saveSelection(){
    //acquire data however you want/need
    var selData = {};
    selData.id = 123456;
    selData.label = 'iPod Touch (Jeff Atwood Edition)';
    //call callback on opener
    window.opener.popupCallback(selData);
  }
</script>

Обновление 2

При тестировании выясняется, что в IE7, IE8 (но не IE6) после закрытия всплывающего окна все справочные данные теряются (ссылки не захватывают снимок ) таким образом, если вам нужны данные после закрытия всплывающего окна, вам необходимо их клонировать.

Я подумал, что если данные можно обернуть в массив, клонирование - это просто пирог. Просто вызовите .slice (), чтобы скопировать его, , но ... это тоже не работает !

Полагаю, вам нужно сохранить нужные значения (либо для элементов формы, либо для DOM), поскольку IE не выглядит так, как будто он позволит вам использовать их после закрытия всплывающего окна. : - (

2 голосов
/ 02 июня 2009

Я наконец-то сделал это путем кодирования json сложного объекта, который я хотел передать родителю во всплывающем окне. Данные, передаваемые обратно, являются простой строкой и могут быть скопированы без проблем. На родительской стороне строка в кодировке json оценивается как объект Javascript.

...