从第二页返回的JSON对象在IE 8中不进行字符串化

时间:2013-02-06 10:08:30

标签: javascript json internet-explorer-8

考虑以下情况:

FooPage是一个页面,点击"添加",打开BarPage。

BarPage有一个" Return"按钮。点击它后,它会执行以下操作:

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.stringify中的JSON创建的,每个人都很高兴。

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

我尝试将方案改为此,作为测试:

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

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

有没有办法传递数组而不先将其字符串化?

1 个答案:

答案 0 :(得分: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));
}

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