IE 8不支持推送功能吗?

6

我希望将一个键值对插入到序列化数组(来自jQuery的serializeArray)中。

所以我有类似这样的东西:

var form = $('#form');
var sendFormData = form.serializeArray();
sendFormData.push({ "name": "Name", "value": "test"});

在Firefox中可以正常工作,但在IE 8中会出现以下错误:
Line: 51 Error: Object doesn't support this property or method
因此,看起来是指向这一行。那么,如果IE 8不支持push方法,有什么方法可以添加一个键/值对,在所有浏览器中都能正常工作(包括五个主要的浏览器:Firefox、IE8、Chrome、Opera和Safari)?

2
你接受了一个答案,但没有解释为什么你的代码会出错...我很好奇! - Ruan Mendes
我在IE8中遇到了类似的问题,结果发现是一个误导性的错误消息和堆栈跟踪。你必须一直追踪到IE8代码中,否则它可能会做一些恼人的事情... - Chris Jaynes
5个回答

11

你现有的代码是可以正常运行的(即使在IE8中),你可以在这里进行测试:http://jsfiddle.net/ZAxzQ/

一定有其他地方引起了你所遇到的错误 :)

.push()方法与Array对象一样早就存在了,我从未见过不支持它的浏览器......你得到的不支持错误肯定是来自其他地方。


1

这不是一个详尽的答案,因为它不能解决你的问题,但是Array.push()方法在IE8中可以使用:

var arr = [];
arr.push({ "name": "Test Name", "value": "Test Value"});
alert(arr[0].name);    // Displays "Test Name"

以上内容也可以重写为以下形式:

var arr = [];
arr[arr.length] = { "name": "Test Name", "value": "Test Value"};
alert(arr[0].name);    // Displays "Test Name"

2
第二种方式在我的看法中是非常奇怪的写法。 - Camilo Martin

1

我目前无法访问IE,但我确信它支持推送。请检查sendFormData是否被视为数组:

Object.prototype.toString.call(sendFormData) === '[object Array]';

IE喜欢做的另一件事情是,在错误发生后告诉你有一行出现了错误,因此它可能是form.serializeArray()行的一部分。


嗯,它返回false。不过我不确定为什么。我的js文件中的代码就是你看到的那样。我还注释了其他所有内容,只是为了确保。 - chobo2
仅返回第一部分是什么?即Object.prototype.toString.call(sendFormData)。由于它是通过函数生成的,我不确定是否会使用该方法显示函数。 - Psytronic

1

我原本以为我也有同样的问题;但最终发现我的问题是IE7-IE8没有实现Array.prototype.indexOf。不过,如果你想使用它,你可以访问这个链接:indexOf


0

当然,另一个解决方案是像这样做:

var sendFormData = $("#form").append("<input id='someuniqueID' type='hidden' name='name' value='test' />").serializeArray();
$("#someuniqueID").remove(); //optional could keep it in there if you wanted

1
我认为我们在这里对“最简单”的方式有不同看法...这更多的是代码,不太直观,而且成本高得多...我真的不建议这样做,因为其他答案表明这不应该是问题所在,这只是一个简单的数组/对象操作。 - Nick Craver
好吧,也许不是最容易的,但它仍然可以解决问题。我同意这不应该是必需的,他现在有的应该可以工作,但如果由于任何原因他无法调试它,还有这个选项。我不认为它的直观度更低,看着它,我可以清楚地知道发生了什么。但是,是的,它的开销会更大。 - Psytronic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接