2

考虑以下场景:

FooPage 是在单击“添加”时打开 BarPage 的页面。

BarPage 有一个“返回”按钮。单击它后,它会执行以下操作:

function Add() {
    var selectedResources = [{ 
        "ResourceID": "10", 
        "ResourceName": "Foo", 
        "ResourceTypeName": "Bar"
    }];
    if (window.opener != null 
        && typeof window.opener.AddResources != "undefined") {
        window.opener.AddResources(selectedResources);
        window.close();
    }
}

如您所见,FooPage 有一个名为AddResources. 它执行以下操作:

function AddResourcesCallback(selectedResources) {
    var result = JSON.stringify(selectedResources);
}

在 Chrome 中,这很好用——字符串是从 JSON 中创建的JSON.stringify,每个人都很高兴。

但是,在 IE8 中,这不起作用。JSON 不会被创建为字符串 - 而是JSON.stringify返回undefined.

我尝试将场景更改为此,作为测试:

function AddResourcesCallback(selectedResources) {
    var selectedResources = [{ 
        "ResourceID": "10", 
        "ResourceName": "Foo", 
        "ResourceTypeName": "Bar"
    }];
    var result = JSON.stringify(selectedResources);
}

在这种情况下,JSON.stringify在 IE8 中返回正确的值,就像 Chrome 一样。这意味着,在 IE8 中,当在页面之间传递数组时,您无法将数组解析为 JSON。

有没有办法在不先对它进行字符串化的情况下传递数组?

4

1 回答 1

1

似乎是一个跨窗口范围问题 - 这两个对象具有不同的Object.prototype原型对象,这可能会使 IE 感到困惑(特别是如果其中一个对象由于窗口关闭而被垃圾收集)。尝试使用其他窗口的JSON函数进行字符串化,如下所示:

// BarPage
if (window.opener != null && typeof window.opener.AddResources != "undefined") {
    window.opener.AddResources(selectedResources, JSON);
    window.close();
}

// FooPage
function AddResourcesCallback(selectedResources, json) {
    var result = json.stringify(selectedResources));
}

但是,我认为在一个窗口中进行字符串化,将字符串传递并在另一个窗口中将其解析回将是最安全的方法。

于 2013-02-06T10:34:40.213 回答