jQuery的serializeArray不包括被点击的提交button
我有一个有两个button的表单。 一个用于保存logging,另一个用于取消保存程序。 我正在使用rails.js
(一个常见的AJAX / jQuery插件,用于那些你不知道的) JavaScript文件,它可以与jQuery一起使用,用于不显眼的javascript / ajax调用。 当我通过ajax发送表单数据时,我希望我点击的button的名称和值与其余的数据一起提交,以便我可以根据哪个button被点击来做出决定。
rails.js
文件中的方法使用.serializeArray()
将表单数据发送到服务器。 问题是这不包括我点击的button的名称/值对。 jQuery的网站声明,他们这样做的目的(尽pipe我认为他们应该):
“ .serializeArray()
方法使用标准的W3C规则来控制成功的控件,以确定它应该包含哪些元素,特别是元素不能被禁用,并且必须包含一个名称属性,没有提交button值被序列化,因为表单没有被提交一个button。”
他们怎么能假定一个表格不是用button提交的呢? 我相信这是毫无意义和错误的假设。
根据W3C规则,为提交表单而激活的button被视为成功的控件 。
由于jQuery的开发人员已经决定这样做的目的,我可以假设有另一种方法, 不排除序列化中激活的button?
编辑:这是我的表单可能看起来像什么样子的快速示例…
<!DOCTYPE html5> <html> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function() { $('#form').submit(function(e) { // put your breakpoint here to look at e var x = 0; }); }); </script> </head> <body> <form id="form"> <input name="name" type="text"><br/> <input name="commit" type="submit" value="Save"/> <input name="commit" type="submit" value="Cancel"/> </form> </body>
没有,行为是基于<form>
的submit
事件,而不是一个button ,例如在JavaScript中按 Enter 键或调用.submit()
。 你在这里混合了两个概念,一个.serialize()
或者.serializeArray()
可能会或者可能不会与button点击有关 – 它只是一个单独的事件,它们没有连接。 这些方法的级别高于此:可以随时出于任何原因序列化表单(或其子集)。
但是,您可以添加提交名称/值对,就像从该button提交的正常表单一样,如果您从一个button提交,例如:
$("#mySubmit").click(function() { var formData = $(this).closest('form').serializeArray(); formData.push({ name: this.name, value: this.value }); //now use formData, it includes the submit button });
我使用下面的代码片段,基本上添加了一个同名的隐藏元素
var form = $("form"); $(":submit",form).click(function(){ if($(this).attr('name')) { $(form).append( $("<input type='hidden'>").attr( { name: $(this).attr('name'), value: $(this).attr('value') }) ); } }); $(form).submit(function(){ console.log($(this).serializeArray()); });
这个解决scheme是“通用的”,因为它将处理所有的input提交,并在提交时将每个input作为表单variables传递。
$(document).ready(function(){ $('input:submit').each(function(){ $(this).click(function(){ var formData = $(this).closest('form').serializeArray(); formData.push({ name: $(this).attr('name'), value: $(this).val() }); }); }); });
var form = button.closest('form'); var serialize = form.serialize(); if (button.attr('name') !== undefined) { serialize += '&'+button.attr('name')+'='; }