Javascript 错误的jQuery表单序列化和不一致

Javascript 错误的jQuery表单序列化和不一致,javascript,jquery,html,serialization,forms,Javascript,Jquery,Html,Serialization,Forms,在提交表单和使用.serialize()通过ajax提交表单时,我发现了一些奇怪的不一致。下面是一个简单的例子: <html> <body> <form action="somewhere"> <select name="thing"> <option value="volvo">Volvo</option> <option value="saab">Saab</option> <o

在提交表单和使用
.serialize()
通过ajax提交表单时,我发现了一些奇怪的不一致。下面是一个简单的例子:

<html>
<body>
<form action="somewhere">
<select name="thing">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="subaru" selected="selected">Subaru</option>
</select>
<input type="text" name="name" value="val">
<button type="submit" name="thing" value="save" >Click me</button>
</form>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>
<script>
var $ = jQuery;
$('form').on('submit', function(evt) {
    //evt.preventDefault();
    console.log($('form').serialize());
    console.log($('form').clone().serialize());
});
</script>
</body>
</html>
这些是jQuery中常见的bug类型吗?jQuery是否需要一些表单插件来实现应该使用相同表单值创建的表单的精确克隆

这些是jQuery中常见的bug类型吗

这些都是记录在案的正确行为。您应该阅读文档以确保您实际正确使用了该库,而不是假设您在一个流行且经过良好测试的库中发现了如此明显的错误

Serialize永远不会包含您的
。它只包括

clone
将不包括选择框的
selected
属性。从:

注意:出于性能原因,某些表单元素的动态状态(例如,键入textarea的用户数据和用户对select的选择)不会复制到克隆的元素中。克隆输入元素时,元素的动态状态(例如,键入文本输入的用户数据和用户对复选框的选择)保留在克隆的元素中


正如我们的朋友meagar所说,克隆将不包括选择框的selected属性。那么,为什么不从序列化表单中获取结果字符串的副本呢?! 您只需执行以下操作即可实现您的愿望:

$('form').on('submit', function(evt) {
    //evt.preventDefault();
    var fm = $(this).serialize();
    var fn = fm;
    console.log(fm);
    console.log(fn);
});

clone()仅在创建表单时进行克隆,不进行选择。@bansi这是错误的。它按元素的存在方式克隆元素,而不是按原始标记的编写方式克隆元素。@meagar你是什么意思?引用您的答案
注意:出于性能原因,某些表单元素的动态状态(例如,键入textarea的用户数据和用户对select的选择)不会复制到克隆元素中这不是我说的吗?你说的是“创建表单时克隆”;那不是真的。它克隆表单的当前状态,包括任何新元素,以及大多数类型元素的当前值。它不会像创建时那样复制表单的状态。不包括奇怪的按钮名称,值是有意义的,因为这是奇怪的和非标准的-但非常奇怪的是,
.clone()
有这样的行为-谢谢:)只有单击的按钮在正常表单提交期间才会发送到服务器。jQuery的serialize不知道单击了什么按钮(如果有的话),因此没有包含任何按钮。克隆不复制textarea/select状态是否有解决方法?我不确定为什么首先需要序列化/clone/serialize。最好的答案可能是根本不克隆表单。这不是重点-这是一个最小的示例,我需要在获取新值之前处理表单的副本。然后,您已经获得的输出都是正确的!它将为您提供创建时表单的新(未填充)元素集!但这些变化不会被复制
$('form').on('submit', function(evt) {
    //evt.preventDefault();
    var fm = $(this).serialize();
    var fn = fm;
    console.log(fm);
    console.log(fn);
});