我使用下面的代码来尝试向bar对象添加一个新属性:
$(document).ready(function(){
$('form').on("submit",preventDefault);
});
function preventDefault(e) {
e.preventDefault();
$url="contact/send";
bar = $('form').serialize();
bar["foo"]='xyz';
//bar.foo="123";
console.log(bar);
}然而,我似乎从来没有意识到bar.foo的价值。如果我在Chrome中查看控制台,我总是得到类似如下的结果:
name=Grahame&email=foo%40bar.com&message=Hello.为什么我得不到foo的值/属性?
发布于 2013-05-23 18:45:23
你可以使用下面的代码:
bar = $('form').serialize();
bar += '&foo=xyz';
console.log(bar);目前,您正尝试将bar用作数组(或注释代码中的对象)。.serialize()实际上会生成一个URL编码的字符串,所以你可以简单地将你的值附加到它上面。
发布于 2013-05-23 18:46:56
这里的其他答案谈到了如何绕过这个问题,但没有人解释为什么会发生这种情况,所以我想我会试一试。
下面是后台正在发生的事情:
.serialize,它会生成一个字符串JavaScript中的
String引用类型对象。中
console.log(bar);记录了bar对象,它已经是一个字符串,它也是一个原始值类型。这既是因为String类型的toString,也因为bar是一个原始值类型,所以您将获得相同的初始值。您可以在the secret life of primitives in JavaScript.或the specification中阅读有关此内容的更多信息
如何修复它?
参见How to add a value to jQuery serialize。这个问题已经在那里得到了回答。
发布于 2013-05-23 18:45:32
bar是序列化的表单数据。它是一个字符串而不是一个对象。
如果你想添加数据,你需要序列化数据:
bar += "&" + encodeURIComponent('foo') + "=" + encodeURIComponent('xyz');(如果知道数据中没有URL特殊字符,则可以跳过encode URI组件)。
https://stackoverflow.com/questions/16711845
复制相似问题