我有以下由服务器注入网页的JavaScript变量。
<script type="text/javascript">
var jsonData = [{"display_mode":...}];
</script>
页面上有一个按钮,可以根据需要通过AJAX发回这些数据,以应用一些转换。这适用于Chrome,FF,IE10和IE11。
在IE8和IE9中,这个数组的处理方式不同,当你使用IE8调试器监视窗口时,你会看到
当它将这些数据发送到服务器时,它看起来像这样:
'{"0":{"display_mode":"TREE",...
注意一旦数组离开浏览器,数组现在是一个带字符串键的对象,但它是一个在浏览器中带有整数键的对象,以及一个在源中发送它的真实数组。
应该看起来像:
'[{"display_mode":"TREE",....
我在此浏览器中如何触发此行为?有没有办法不触发这种行为?
我使用extjs4.2.2来序列化JSON,就像IE10和11,Chrome和FF一样。仅在这些版本的IE上,它才将数组更改为用于序列化的键控对象
现在我正在开发一个解决方案,我将迭代假数组并构建一个新的有效数组,根据extjs框架检测到的版本发送回网络服务器。我不喜欢添加这样的代码,因为版本检测很脆弱。我更喜欢这种情况从一开始就不会发生。
答案 0 :(得分:0)
当你在IE8中查看原始的jsonData变量时,它显示如下:
幸运的是,这也会检测到具有Ext.isArray()的数组。因此,了解数据结构后,我可以执行以下操作:
var fixed, items, t, i, transaction;
// This fix is here for ie8 and ie9 to turn the arrays back into arrays
if(!Ext.isArray(jsonData)) {
fixed = [];
for(t=0; t < jsonData.length; ++t) {
transaction = jsonData[t];
items = [];
for(i=0; i < transaction.items.length; ++i) {
items.push(transaction.items[i]);
}
transaction.items = items;
fixed.push(transaction);
}
jsonData = fixed;
}
在我这样做之后,调试将其显示为:
请注意,在我更正后,&#34;对象&#34;有一个叫做[方法]的东西。这使它作为JSON数组正确序列化。我怀疑的事情正在发生,但我无法完全证明,由于IE蹩脚的工具集,他们在解析脚本标签时进行从数组到对象的转换。这不会导致浏览器内的任何操作问题,因为这些数组/对象支持长度,这允许循环迭代,Ext.each工作,它们在内部像数组一样运行。但序列化程序识别出差异并以错误的方式发送它们。
关于将要发生什么的另一个数据点来自javascript控制台
jsonData看起来像一个对象,但表现得像一个数组,因为我可以为jsonData.length获取一个有效值(这是在我&#34之前;纠正&#34;数组)。如果我创建一个真实的对象x,并尝试获得它的长度,我会得到未定义的,我期望。因此,我将把这个问题归结为另一个IE缺陷。如果有其他人遇到这个问题,至少它会更容易解决。