2009-04-24 3 views
6

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

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

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

window.opener.add_data(data_from_popup); 

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

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

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

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

ответ

6

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

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

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

Update:

Вот быстрый пример ...

<!--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> 

Update 2

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

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

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

+0

Как вы храните данные на открывателе? В частности, хранились ли сложные данные (объекты, массивы, даты) через window.opener? –

+0

Я использовал 2 1 window.opener.foo = somevalue, в результате чего в открывшемся окне хранится глобальная переменная «foo». Или я открою всплывающее окно и вызову обратный вызов ... скажем, window.opener.myCallback (someDataObj); где моя функция обратного вызова открывателя делает все, что она хочет/нуждается в данных. – scunliffe

+0

Интересно. Эти два примера - это то, что ломается в IE. Когда пользователь закрывает дочернее окно, ссылка открывателя на данные просто обновляется. – JPot

2

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

 Смежные вопросы

  • Нет связанных вопросов^_^