考虑以下场景:
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.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。
有没有一种方法可以在不先将其字符串化的情况下传递数组?
最佳答案
似乎是一个跨窗口范围问题 - 这两个对象具有不同的 Object.prototype
原型(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));
}
但是,我认为在一个窗口中进行字符串化,传递字符串并在另一个窗口中解析它是最安全的方法。
关于javascript - 从第二个页面返回的 JSON 对象在 IE 8 中不进行字符串化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14726333/