‹‹ 首页jQuery Form Plugin

概述

jQuery Form Plugin 能够让你简洁的将以HTML形式提交的表单升级成采用AJAX技术提交的表单。 插件里面主要的方法, ajaxFormajaxSubmit, 能够从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>
引入jQuery和Form Plugin Javascript脚本文件并且添加几句简单的代码让页面在DOM加载完成后初始化表单:
<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>
这就行了! 当表单提交后namecomment的值就会被提交给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();

可选参数项对象

ajaxFormajaxSubmit 都支持大量的可选参数,它们通过可选参数项对象传入。可选参数项对象只是一个简单的 JavaScript对象,里边包含了一些属性和一些值:
target
用server端返回的内容更换指定的页面元素的内容。 这个值可以用jQuery 选择器来表示, 或者是一个jQuery 对象, 一个 DOM 元素。
缺省值: null
url
表单提交的地址。
缺省值: 表单的action的值
type
表单提交的方式,'GET' 或 'POST'.
缺省值: 表单的 method 的值 (如果没有指明则认为是 'GET')
beforeSubmit
表单提交前执行的方法。这个可以用在表单提交前的预处理,或表单校验。如果'beforeSubmit'指定的函数返回false,则表单不会被提交。 'beforeSubmit'函数调用时需要3个参数:数组形式的表单数据,jQuery 对象形式的表单对象,可选的用来传递给ajaxForm/ajaxSubmit 的对象。 数组形式的表单数据是下面这样的格式:
[ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
缺省值: null
success
当表单提交后执行的函数。 如果'success' 回调函数被指定,当server端返回对表单提交的响应后,这个方法就会被执行。 responseText 和 responseXML 的值会被传进这个参数 (这个要依赖于dataType的类型).

缺省值: null

dataType
指定服务器响应返回的数据类型。其中之一: null, 'xml', 'script', 或者 'json'. 这个 dataType 选项用来指示你如何去处理server端返回的数据。 这个和 jQuery.httpData 方法直接相对应。 下面就是可以用的选项:

'xml': 如果 dataType == 'xml' 则 server 端返回的数据被当作是 XML 来处理, 这种情况下'success'指定的回调函数会被传进去 responseXML 数据

'json': 如果 dataType == 'json' 则server端返回的数据将会被执行,并传进'success'回调函数

'script': 如果 dataType == 'script' 则server端返回的数据将会在上下文的环境中被执行

缺省值: null

semantic
一个布尔值,用来指示表单里提交的数据的顺序是否需要严格按照语义的顺序。一般表单的数据都是按语义顺序序列化的,除非表单里有一个type="image"元素. 所以只有当表单里必须要求有严格顺序并且表单里有type="image"时才需要指定这个。
缺省值: false
resetForm
布尔值,指示表单提交成功后是否需要重置。
缺省值: null
clearForm
布尔值,指示表单提交成功后是否需要清空。
缺省值: null
iframe
布尔值,用来指示表单是否需要提交到一个iframe里。 这个用在表单里有file域要上传文件时。更多信息请参考 代码示例 页面里的File Uploads 文档。
缺省值: false

例子:

// 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 方法的参数使用很熟悉,你也可以把它当作ajaxFormajaxSubmit 的参数使用。

代码示例

下面这个控制HTML表单的代码就是基于这个方法的。它使用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.');
}

Name:
Password:
Multiple:
Single:
Single2:
Check:
Radio:
Text:

输出 Div (#output1):

用 AJAX 响应的数据替换Div的内容。

下面的用于控制HTML表单的代码就是基于这个用法的。它使用 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.');
}
Name:
Password:
Multiple:
Single:
Single2:
Check:
Radio:
Text:  

输出 Div (#output2):

用 AJAX 响应的数据替换Div的内容。

这个页面提供了几个例子,用来在表单提交到server之前校验其数据的合法性。让它起作用的一句就是 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 参数校验表单

Username: Password:
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 参数校验表单

Username: Password:
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 方法校验表单

Username: Password:
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 插件。

这个页面展示如何处理server返回的JSON数据。

下面的例子是表单向server提交一段文本,server端将它以JSON格式返回。
表单代码:

<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>

Message:

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);
}

这个页面展示如何处理server返回的HTML数据。

下面的例子里表单向server提交一条文本信息,server将它放在div里以HTML形式将它返回。返回的数据将被添加到这个页面上 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>

Message:

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 (输出的信息将会被加到下面):

这个页面展示如何处理server返回的 XML 数据。

下面的例子里表单向server提交一条文本信息,server将它以 XML 形式返回。
表单代码:

<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>

Message:

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 来决定返回的响应数据的格式类型。

File: Return Type:


[1] Safari不支持XML类型的响应值。

处理表单域

这个页面将介绍和演示如何使用这个插件的fieldValuefieldSerialize 方法。

fieldValue

fieldValue 方法可以让你获得一个表单域的当前值。例如,如果想获得id为'myForm'的表单里密码域里的值,你可以这样写:
var pwd = $('#myForm :password').fieldValue()[0];
这个方法用于都返回数组。如果没有发现有效值,就返回空数组,否则必定含有多于一个值的数组。

fieldSerialize

fieldSerialize 这个方法可以用来序列化表单里某一部分域,将其转变成查询串。你可以用在只想处理表单中某个或某些域的情况下。例如,只把表单里的文本类型的域序列化,你应该写成下面这样:
var queryString = $('#myForm :text').fieldSerialize();
演示

在下面的文本框里输入一个jQuery表达式,然后点击 'Test',看看 fieldValuefieldSerialize 方法执行的结果。这些方法将在下面的表单里运行。

jQuery 表达式: (例如: textarea, [@type='hidden'], :radio, :checkbox, 等等)
Successful controls only [1]


测试表单

<input type="hidden" name="Hidden" value="secret" />
<input name="Name" type="text" value="MyName1" />
<input name="Password" type="password" />
<select name="Multiple" multiple="multiple">
<select name="Single">
<input type="checkbox" name="Check" value="1" />
<input type="checkbox" name="Check" value="2" />
<input type="checkbox" name="Check" value="3" />
<input type="checkbox" name="Check2" value="4" />
<input type="checkbox" name="Check2" value="5" />
<input type="checkbox" name="Check3" />
<input type="radio" name="Radio" value="1" />
<input type="radio" name="Radio" value="2" />
<input type="radio" name="Radio" value="3" />
<input type="radio" name="Radio2" value="4" />
<input type="radio" name="Radio2" value="5" />
<textarea name="Text" rows="2" cols="20"></textarea>
<input type="reset" name="resetButton" value="Reset" />
<input type="submit" name="sub" value="Submit" />

[1] http://www.w3.org/TR/html4/interact/forms.html#successful-controls.

缺省条件下,fieldValuefieldSerialize 只按 '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 提交。这是一个步到位的方法。
ajaxFormajaxSubmit 的不同之处是什么?
它们主要有两种区别:
  1. ajaxSubmit 会提交这个表单, ajaxForm 不会。当你调用 ajaxSubmit 方法是,它会立即序列化你表单里的数据,把它提交给server。当使用 ajaxForm 时,它只是给你的表单上添加了一些必要的事件监听器,当用户提交表单时它能监听到用户的动作。当用户有提交动作时 ajaxSubmit 方法就会被调用。
  2. 当使用 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来访问这个邮件列表。

贡献者

这插件的开发是一个团体的共同努力的结果,很多人对此贡献了想法和代码。 下面的是给这个插件做出了各种贡献的人的清单: 如果我遗漏了谁,请发邮件告诉我。