考虑以下情况:
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。
有没有办法传递数组而不先将其字符串化?
答案 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));
}
但是,我认为在一个窗口中进行字符串化,传递字符串并在另一个窗口中将其解析回来将是最安全的方法。