Использование объектов Javascript в разных окнах IE - PullRequest
3 голосов
/ 02 ноября 2011

Мне нужно открыть новое окно браузера из другого окна браузера и получить доступ к объекту из родительского окна в дочернем окне.Поэтому, когда загружается дочернее окно, я использую свойство opener для доступа к объекту из родительского окна.Прекрасно работает в Firefox, однако в IE свойства массива преобразуются в объекты.

Например,

function openChild() {
    window.open(window.document.location, '_blank');
}

var data = {
    myArray: []
};

$(document).ready(function() {
    alert('data is array: ' + (data.myArray instanceof Array));
    alert('prototype: ' + (Object.prototype.toString.call(data.myArray)));

    if (window.opener) {
        var parentData = window.opener.data;
        alert('parent data is array: ' + (parentData.myArray instanceof Array));
        alert('parent prototype: ' + (Object.prototype.toString.call(parentData.myArray)));
    }
});

Когда дочернее окно открывается в IE, результат будет

data is array: true
prototype: [object Array]
parent data is array: false
parent prototype: [object Object]

, и в Firefox получается

data is array: true
prototype: [object Array]
parent data is array: false
parent prototype: [object Array]

Один из способов - слишком сериализовать объект в JSON, передать строку и затем десериализовать.Тем не менее, любые методы на объекте потеряны.

Что еще я могу сделать, кроме как сидеть и говорить о том, как IE - проклятие веб-разработки?

Ответы [ 2 ]

2 голосов
/ 02 ноября 2011

Один из способов - преобразовать объект в JSON в родительском окне и передать строку дочернему элементу, который затем анализирует JSON обратно в объект.

Например, в родительском окне:

function getData() {
    return JSON.stringify(data);
}

и в дочернем окне:

var parentData = JSON.parse(window.opener.getData());

Однако это приведет к потере любых методов на любых объектах.

0 голосов
/ 30 января 2017

Сегодня я столкнулся с подобной проблемой и нашел следующее решение с использованием underscore.js:

var parentData = _.toArray(window.opener.data);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...