我有一个jQuery ajax函数,并希望提交一个完整的表单作为发布数据。我们不断更新表单,因此不断更新应在请求中发送的表单输入变得乏味。
答案 0 :(得分:250)
有一个功能可以完成这个:
http://api.jquery.com/serialize/
var data = $('form').serialize();
$.post('url', data);
答案 1 :(得分:45)
serialize()不是一个好主意。例如,如果你想通过ajax传递一个文件,那就不行了。
更好的解决方案是制作FormData并发送它:
var myform = document.getElementById("myform");
var fd = new FormData(myform );
$.ajax({
url: "example.php",
data: fd,
cache: false,
processData: false,
contentType: false,
type: 'POST',
success: function (dataofconfirm) {
// do something with the result
}
});
答案 2 :(得分:24)
通常在表单元素上使用serialize()
。
请注意多个< select>选项在同一个键下序列化,例如
<select id="foo" name="foo" multiple="multiple">
<option value="1">one</option>
<option value="2">two</option>
<option value="3">three</option>
</select>
将生成一个查询字符串,其中包含多个相同查询参数的出现位置:
[path]?foo=1&foo=2&foo=3&someotherparams...
可能不是你想要的后端。
我使用这个JS代码将多个参数减少为以逗号分隔的单个键(在John Resig所在地的线程中从评论者的响应中无耻地复制):
function compress(data) {
data = data.replace(/([^&=]+=)([^&]*)(.*?)&\1([^&]*)/g, "$1$2,$4$3");
return /([^&=]+=).*?&\1/.test(data) ? compress(data) : data;
}
将上述内容变为:
[path]?foo=1,2,3&someotherparams...
在您的JS代码中,您可以这样称呼它:
var inputs = compress($("#your-form").serialize());
希望有所帮助。
答案 3 :(得分:15)
答案 4 :(得分:1)
执行此操作的好jQuery选项是FormData。通过表单发送文件时,此方法也适用!
<form id='test' method='post' enctype='multipart/form-data'>
<input type='text' name='testinput' id='testinput'>
<button type='submit'>submit</button>
</form>
jQuery中的send函数如下所示:
$( 'form#test' ).submit( function(){
var data = new FormData( $( 'form#test' )[ 0 ] );
$.ajax( {
processData: false,
contentType: false,
data: data,
dataType: 'json',
type: $( this ).attr( 'method' );
url: 'yourapi.php',
success: function( feedback ){
console.log( "the feedback from your API: " + feedback );
}
});
要向表单添加数据,您可以在表单中使用隐藏的输入,也可以动态添加:
var data = new FormData( $( 'form#test' )[ 0 ] );
data.append( 'command', 'value_for_command' );
答案 5 :(得分:0)
其他解决方案对我不起作用。也许我正在研究的项目中的旧DOCTYPE阻止了HTML5选项。
我的解决方案:
<form id="form_1" action="result.php" method="post"
onsubmit="sendForm(this.id);return false">
<input type="hidden" name="something" value="1">
</form>
js:
function sendForm(form_id){
var form = $('#'+form_id);
$.ajax({
type: 'POST',
url: $(form).attr('action'),
data: $(form).serialize(),
success: function(result) {
console.log(result)
}
});
}