概述
jQuery Form Plugin 能够让你简洁的将以HTML形式提交的表单升级成采用AJAX技术提交的表单。 插件里面主要的方法,ajaxForm
和 ajaxSubmit
,
能够从form组件里采集信息确定如何处理表单的提交过程。两个方法都支持众多的可选参数,能够让你对表单里数据的提交做到完全的控制。这让采用AJAX方式提交一个表单的过程简单的不能再简单了!
入门指导
<form id="myForm" action="comment.php" method="post">
Name: <input type="text" name="name" />
Comment: <textarea name="comment"></textarea>
<input type="submit" value="Submit Comment" />
</form>
<head>
<script type="text/javascript" src="path/to/jquery.js"></script>
<script type="text/javascript" src="path/to/form.js"></script>
<script type="text/javascript">
// wait for the DOM to be loaded
$(document).ready(function() {
// bind 'myForm' and provide a simple callback function
$('#myForm').ajaxForm(function() {
alert("Thank you for your comment!");
});
});
</script>
</head>
这就行了! 当表单提交后name 和 comment的值就会被提交给comment.php. 如果服务器端返回成功的状态,用户将会看到一句提示信息 "Thank you" 。
Form Plugin API
Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程。ajaxForm
- 预处理将要使用AJAX方式提交的表单,将所有需要用到的事件监听器添加到其中。它不是提交这个表单。
在页面的
ready
函数里使用ajaxForm
来给你页面上的表单做这些AJAX提交的准备工作。ajaxForm
需要零个或一个参数。这唯一的一个参数可以是一个回调函数或者是一个可选参数对象。
是否可以连环调用: 是。 例子:$('#myFormId').ajaxForm();
ajaxSubmit
- 立即通过AJAX方式提交表单。最常见的用法是对用户提交表单的动作进行响应时调用它。
ajaxForm
需要零个或一个参数。唯一的一个参数可以是一个回调函数或者是一个可选参数对象。
是否可以连环调用: 是。 例子:// attach handler to form's submit event $('#myFormId').submit(function() { // submit the form $(this).ajaxSubmit(); // return false,这样可以阻止正常的浏览器表单提交和页面转向 return false; });
formSerialize
- 将表单序列化成查询串。这个方法将返回一个形如:
name1=value1&name2=value2
的字符串。
是否可以连环调用: 否, 这个方法返回的是一个字符串。 例子:var queryString = $('#myFormId').formSerialize(); // the data could now be submitted using $.get, $.post, $.ajax, etc $.post('myscript.php', queryString);
fieldSerialize
- 将表单里的元素序列化成字符串。当你只需要将表单的部分元素序列化时可以用到这个方法。 这个方法将返回一个形如:
name1=value1&name2=value2
的字符串。
是否可以连环调用: 否, 这个方法返回的是一个字符串。 例子:var queryString = $('#myFormId .specialFields').fieldSerialize();
fieldValue
- 取出所有匹配要求的域的值,以数组形式返回。 从 0.91 版本开始,
这个方法 始终 返回一个数组。
如果没有符合条件的域,这个数组将会是个空数组,否则它将会包含至少一个值。
是否可以连环调用: 否, 这个方法返回的是一个数组。 例子:// get the value of the password input var value = $('#myFormId :password').fieldValue(); alert('The password is: ' + value[0]);
resetForm
- 通过调用表单元素的内在的DOM 上的方法把表单重置成最初的状态。
是否可以连环调用: 是 例子:$('#myFormId').resetForm();
clearForm
- 清空表单所有元素的值。这个方法将会清空所有的文本框,密码框,文本域里的值,去掉下拉列表所有被选中的项,让所有复选框和单选框里被选中的项不再选中。
是否可以连环调用: 否$('#myFormId').clearForm();
clearFields
- 清空某个表单域的值。这个可以用在只需要清空表单里部分元素的值的情况。
是否可以连环调用: 否$('#myFormId .specialFields').clearFields();
可选参数项对象
ajaxForm
和 ajaxSubmit
都支持大量的可选参数,它们通过可选参数项对象传入。可选参数项对象只是一个简单的 JavaScript对象,里边包含了一些属性和一些值:
例子:
// prepare Options Object
var options = {
target: '#divToUpdate',
url: 'comment.php',
success: function() {
alert('Thanks for your comment!');
}
};
// pass options to ajaxForm
$('#myForm').ajaxForm(options);
注意,这个参数对象也可以当作 jQuery's
$.ajax
方法的参数。
如果你对 $.ajax
方法的参数使用很熟悉,你也可以把它当作ajaxForm
和
ajaxSubmit
的参数使用。
代码示例
ajaxForm
绑定这个表单,然后演示如何使用表单提交之前和之后的回调函数。
// prepare the form when the DOM is ready
$(document).ready(function() {
var options = {
target: '#output1', // target element(s) to be updated with server response
beforeSubmit: showRequest, // pre-submit callback
success: showResponse // post-submit callback
// other available options:
//url: url // override for form's 'action' attribute
//type: type // 'get' or 'post', override for form's 'method' attribute
//dataType: null // 'xml', 'script', or 'json' (expected server response type)
//clearForm: true // clear all form fields after successful submit
//resetForm: true // reset the form after successful submit
// $.ajax options can be used here too, for example:
//timeout: 3000
};
// bind form using 'ajaxForm'
$('#myForm1').ajaxForm(options);
});
// pre-submit callback
function showRequest(formData, jqForm, options) {
// formData is an array; here we use $.param to convert it to a string to display it
// but the form plugin does this for you automatically when it submits the data
var queryString = $.param(formData);
// jqForm is a jQuery object encapsulating the form element. To access the
// DOM element for the form do this:
// var formElement = jqForm[0];
alert('About to submit: \n\n' + queryString);
// here we could return false to prevent the form from being submitted;
// returning anything other than false will allow the form submit to continue
return true;
}
// post-submit callback
function showResponse(responseText, statusText) {
// for normal html responses, the first argument to the success callback
// is the XMLHttpRequest object's responseText property
// if the ajaxForm method was passed an Options Object with the dataType
// property set to 'xml' then the first argument to the success callback
// is the XMLHttpRequest object's responseXML property
// if the ajaxForm method was passed an Options Object with the dataType
// property set to 'json' then the first argument to the success callback
// is the json data object returned by the server
alert('status: ' + statusText + '\n\nresponseText: \n' + responseText +
'\n\nThe output div should have already been updated with the responseText.');
}
输出 Div (#output1):
ajaxSubmit
来提交这个表单。
// prepare the form when the DOM is ready
$(document).ready(function() {
var options = {
target: '#output2', // target element(s) to be updated with server response
beforeSubmit: showRequest, // pre-submit callback
success: showResponse // post-submit callback
// other available options:
//url: url // override for form's 'action' attribute
//type: type // 'get' or 'post', override for form's 'method' attribute
//dataType: null // 'xml', 'script', or 'json' (expected server response type)
//clearForm: true // clear all form fields after successful submit
//resetForm: true // reset the form after successful submit
// $.ajax options can be used here too, for example:
//timeout: 3000
};
// bind to the form's submit event
$('#myForm2').submit(function() {
// inside event callbacks 'this' is the DOM element so we first
// wrap it in a jQuery object and then invoke ajaxSubmit
$(this).ajaxSubmit(options);
// !!! Important !!!
// always return false to prevent standard browser submit and page navigation
return false;
});
});
// pre-submit callback
function showRequest(formData, jqForm, options) {
// formData is an array; here we use $.param to convert it to a string to display it
// but the form plugin does this for you automatically when it submits the data
var queryString = $.param(formData);
// jqForm is a jQuery object encapsulating the form element. To access the
// DOM element for the form do this:
// var formElement = jqForm[0];
alert('About to submit: \n\n' + queryString);
// here we could return false to prevent the form from being submitted;
// returning anything other than false will allow the form submit to continue
return true;
}
// post-submit callback
function showResponse(responseText, statusText) {
// for normal html responses, the first argument to the success callback
// is the XMLHttpRequest object's responseText property
// if the ajaxSubmit method was passed an Options Object with the dataType
// property set to 'xml' then the first argument to the success callback
// is the XMLHttpRequest object's responseXML property
// if the ajaxSubmit method was passed an Options Object with the dataType
// property set to 'json' then the first argument to the success callback
// is the json data object returned by the server
alert('status: ' + statusText + '\n\nresponseText: \n' + responseText +
'\n\nThe output div should have already been updated with the responseText.');
}
输出 Div (#output2):
beforeSubmit
参数。如果提交之前执行的回调函数返回false,表单的提交将会终止。
下面的这个登录表单会在随后的几个例子中用到。每个例子都校验用户填入的用户名和密码。
表单代码:
<form id="validationForm" action="dummy.php" method="post">
Username: <input type="text" name="username" />
Password: <input type="password" name="password" />
<input type="submit" value="Submit" />
</form>
首先,我们初始化这个表单,给它一个 beforeSubmit
回调函数 - 这是一个用来校验的函数。
// prepare the form when the DOM is ready
$(document).ready(function() {
// bind form using ajaxForm
$('#myForm2').ajaxForm( { beforeSubmit: validate } );
});
使用 formData
参数校验表单
function validate(formData, jqForm, options) {
// formData is an array of objects representing the name and value of each field
// that will be sent to the server; it takes the following form:
//
// [
// { name: username, value: valueOfUsernameInput },
// { name: password, value: valueOfPasswordInput }
// ]
//
// To validate, we can examine the contents of this array to see if the
// username and password fields have values. If either value evaluates
// to false then we return false from this method.
for (var i=0; i < formData.length; i++) {
if (!formData[i].value) {
alert('Please enter a value for both Username and Password');
return false;
}
}
alert('Both fields contain values.');
}
使用 jqForm
参数校验表单
function validate(formData, jqForm, options) {
// jqForm is a jQuery object which wraps the form DOM element
//
// To validate, we can access the DOM elements directly and return true
// only if the values of both the username and password fields evaluate
// to true
var form = jqForm[0];
if (!form.username.value || !form.password.value) {
alert('Please enter a value for both Username and Password');
return false;
}
alert('Both fields contain values.');
}
使用 fieldValue
方法校验表单
function validate(formData, jqForm, options) {
// fieldValue is a Form Plugin method that can be invoked to find the
// current value of a field
//
// To validate, we can capture the values of both the username and password
// fields and return true only if both evaluate to true
var usernameValue = $('input[@name=username]').fieldValue();
var passwordValue = $('input[@name=password]').fieldValue();
// usernameValue and passwordValue are arrays but we can do simple
// "not" tests to see if the arrays are empty
if (!usernameValue[0] || !passwordValue[0]) {
alert('Please enter a value for both Username and Password');
return false;
}
alert('Both fields contain values.');
}
注意
你可以在jQuery Plugins Page页面找到各种各样的校验表单的 jQuery 插件。表单代码:
<form id="jsonForm" action="json-echo.php" method="post">
Message: <input type="text" name="message" value="Hello JSON" />
<input type="submit" value="Echo as JSON" />
</form>
json-echo.php
里的server端代码:
<?php echo '{ message: "' . $_POST['message'] . '" }'; ?>
JavaScript:
// prepare the form when the DOM is ready
$(document).ready(function() {
// bind form using ajaxForm
$('#jsonForm').ajaxForm({
// dataType identifies the expected content type of the server response
dataType: 'json',
// success identifies the function to invoke when the server response
// has been received
success: processJson
});
});
回调函数
function processJson(data) {
// 'data' is the json object returned from the server
alert(data.message);
}
htmlExampleTarget
div 里。
表单代码:
<form id="htmlForm" action="html-echo.php" method="post">
Message: <input type="text" name="message" value="Hello HTML" />
<input type="submit" value="Echo as HTML" />
</form>
html-echo.php
里server端的代码:
<?php
echo '<div style="background-color:#ffa; padding:20px">' . $_POST['message'] . '</div>';
?>
JavaScript:
// prepare the form when the DOM is ready
$(document).ready(function() {
// bind form using ajaxForm
$('#htmlForm').ajaxForm({
// target identifies the element(s) to update with the server response
target: '#htmlExampleTarget',
// success identifies the function to invoke when the server response
// has been received; here we apply a fade-in effect to the new content
success: function() {
$('#htmlExampleTarget').fadeIn('slow');
}
});
});
htmlExampleTarget (输出的信息将会被加到下面):
表单代码:
<form id="xmlForm" action="xml-echo.php" method="post">
Message: <input type="text" name="message" value="Hello XML" />
<input type="submit" value="Echo as XML" />
</form>
xml-echo.php
中的server端代码:
<?php
// !!! IMPORTANT !!! - the server must set the content type to XML
header('Content-type: text/xml');
echo '<root><message>' . $_POST['message'] . '</message></root>';
?>
JavaScript:
// prepare the form when the DOM is ready
$(document).ready(function() {
// bind form using ajaxForm
$('#xmlForm').ajaxForm({
// dataType identifies the expected content type of the server response
dataType: 'xml',
// success identifies the function to invoke when the server response
// has been received
success: processXml
});
});
回调函数
function processXml(responseXML) {
// 'responseXML' is the XML document returned by the server; we use
// jQuery to extract the content of the message node from the XML doc
var message = $('message', responseXML).text();
alert(message);
}
这个页面将要展示这个表单插件如何处理上传文件的功能。不需要什么特别的代码来处理文件上传。文件上传域会被自动的检测到,自动的为你做好所需要的一切。
因为使用浏览器的XMLHttpRequest
对象是不可能上传文件的,这个表单插件使用了一个隐藏的iframe来完成这个工作。这是个常用的技巧,但它有一些固有的限制。这个iframe是当做表单提交的target目标的,也就意味着server返回的响应数据都会被写到这个iframe里。
如果server返回的数据是HTML 或 XML[1]形式的,这是没问题的,但当返回的数据类型是
script 或 JSON 时, 这两种形式的数据一般都需要处理一下然后利用页面上一些HTML代码来重新展示。
考虑到处理 script 和 JSON 类响应的困难,这个插件允许你把这些响应代码嵌入到 textarea
元素里而且我们推荐当表单中有上传域时你使用这种方法’ 然而,请注意,
如果这个上传域里没有提供值,那么表单将会按常规的 XHR 方式提交(不使用iframe)。这就需要server端代码去判断何时使用textarea,何时不使用textarea。如果你喜欢,你可以一直按iframe
方式处理。
插件有个选项可以使它强制一直使用 iframe 模式 而你的server端代码就可以一直使用在textarea里嵌入响应代码的形式。
下面的就是一个从server端返回的一个script代码的示例:
<textarea>
for (var i=0; i < 10; i++) {
// do some processing
}
</textarea>
下面的表单里有一个文件上传域和一个用来指示选择返回类型的下拉选项。 表单将提交到
files.php
里,这个php文件根据 dataType 来决定返回的响应数据的格式类型。
处理表单域
这个页面将介绍和演示如何使用这个插件的fieldValue
和
fieldSerialize
方法。
fieldValue
fieldValue
方法可以让你获得一个表单域的当前值。例如,如果想获得id为'myForm'的表单里密码域里的值,你可以这样写:
var pwd = $('#myForm :password').fieldValue()[0];
这个方法用于都返回数组。如果没有发现有效值,就返回空数组,否则必定含有多于一个值的数组。
fieldSerialize
fieldSerialize
这个方法可以用来序列化表单里某一部分域,将其转变成查询串。你可以用在只想处理表单中某个或某些域的情况下。例如,只把表单里的文本类型的域序列化,你应该写成下面这样:
var queryString = $('#myForm :text').fieldSerialize();
[1] http://www.w3.org/TR/html4/interact/forms.html#successful-controls. 缺省条件下,
fieldValue
和 fieldSerialize
只按
'successful controls'定义的情况运行。这就是说像下面的代码,如果一个checkbox没有被选中,返回的结果将会是个空数组。
// value will be an empty array if checkbox is not checked:
var value = $('#myUncheckedCheckbox').fieldValue();
// value.length == 0
然而,如果你只是想知道这个checkbox的‘value’是什么,不管它是否被选中,你可以这样写:
// value will hold the checkbox value even if it's not checked:
var value = $('#myUncheckedCheckbox').fieldValue(false);
// value.length == 1
常见问题
- 这个插件跟哪些版本的jQuery兼容?
- 这个插件需要jQuery v1.0.3 或 以后的版本。
- 这个插件需要其它插件的支持吗?
- 不需要。
- 这个插件的运行效率高吗?
- 是的!请到 对比页面 查看这个插件和其它库(包括 Prototype 和 dojo)的比较情况。
- 最简单的使用这个插件的方法是怎样的?
ajaxForm
提供一个最简单的方式你够让你的HTML表单可以使用 AJAX 提交。这是一个步到位的方法。-
ajaxForm
和ajaxSubmit
的不同之处是什么? - 它们主要有两种区别:
ajaxSubmit
会提交这个表单,ajaxForm
不会。当你调用ajaxSubmit
方法是,它会立即序列化你表单里的数据,把它提交给server。当使用ajaxForm
时,它只是给你的表单上添加了一些必要的事件监听器,当用户提交表单时它能监听到用户的动作。当用户有提交动作时ajaxSubmit
方法就会被调用。- 当使用
ajaxForm
提交表单时,被提交的数据里包括执行提交动作的元素的name和value (如果提交按钮是image类型,则包含的是点击事件的坐标)。
- 如何取消一个表单的提交?
- 你可以在初始化这个表单时添加一个 'beforeSubmit' 回调函数,当这个函数返回false时提交就会取消。代码演示页面有这样的例子。
- 这个插件有没有单元测试套件?
- 有! 这个插件有大量的单元测试用例,你可以用来测试这个插件的功能。 Run unit tests.
- 这个插件支持文件上传功能吗?
- 支持!
下载
官方插件文件是在jQuery Subversion 库里: http://jqueryjs.googlecode.com/svn/trunk/plugins/form/jquery.form.js. 在jQuery Plugins页面还有很多的有用的 Form Plugins 。支持
你可以从jQuery 邮件列表 里获得一些支持. 这是一个非常活跃的列表,有大量的jQuery开发者和使用用户。 你也可以通过 Nabble Forums来访问这个邮件列表。贡献者
这插件的开发是一个团体的共同努力的结果,很多人对此贡献了想法和代码。 下面的是给这个插件做出了各种贡献的人的清单:- John Resig
- Mike Alsup
- Mark Constable
- Klaus Hartl
- Matt Grimm
- Yehuda Katz
- Jörn Zaefferer
- Sam Collett
- Gilles van den Hoven
- Kevin Glowacz