1.jQuery的Ajax应用
Ajax,我一直读的是"阿贾克斯",据当时大学老师讲该读音出处是根据当年风靡欧洲的荷兰足球俱乐部阿贾克斯的名字来的,我觉得说法挺靠谱的。
jQuery封装了Ajax的交互过程,用户不需要考虑XMLHttpRequest对象的兼容性问题以及使用XMLHttpRequest建立连接、发送请求、发送方式、接收方式等细节,利用jQuery定义
的几个简单方法,即可轻松实现客户端与服务端异步通信的问题,从而帮助开发人员从繁琐的技术细节中解脱出来,专心于业务层开发工作。
最初始的JavaScript的Ajax在刚刚接触编程的时候接触过,现在都忘没了,只记得首先得获取XMLHttpRequest对象,实际开发中用的全都是jQuery封装好的Ajax,用的也是很繁。
jQuery中$.ajax()方法属于最底层的方法,第二层是load()、$.get()和$.post()方法,第三层是$.getScript()和$.getJSON()方法,其中当属第二层的三个方法使用的频率最高。
1、使用get和post请求
get()方法包含4个参数,说明如下:
第一个参数表示要请求的URL地址
第二个参数表示一个对象结构的 名/值对 列表
第三个参数表示异步交互成功之后调用的回调函数,回调函数的参数值为服务器端相应的信息。
第四个参数表示服务器端响应信息返回的内容格式(如XML、HTML、Script、JSON、Text)
其中第一个参数Url是必选参数,后面三个为可选参数。
get()方法是只能在请求成功后调用回调函数,如果要在出错的时候执行回调函数,则必须使用$.ajax()方法。第二个参数所传递的参数可以写在url后面。
- <span style="font-family:SimSun;font-size:12px;"> $.get(
- "test1.jsp",
- {
- name:"haha",
- pass:"123"
- },
- function(data){ //回调函数
- alert(data); //响应信息
- }
- )
- 就可以改成
- $.get
- (
- "test1.jsp?name=haha&pass=123",function(data){
- alert(data);
- }
- ) </span>
jQuery还定义了两个专用方法getJSON()和getScript()。这两个方法的功能和用法与get是完全相同的,只是支持前三个参数,不需要设置第四个参数,从他们的名字上就看出了他
们已经指定响应数据的类型。
post()方法与get()方法几乎相同,只是请求方式的不同,具体选择哪种请求方式开发人员自己根据特定需求去决定。
2、$.ajax
url | 发送请求的地址,默认为当前页面地址。 |
type | 设置请求方式,如GET或者POST,默认为GET。 |
timeout | 设置请求超时时间(毫秒)。此设置将覆盖全局设置。 |
data | 发送到服务器的数据。将自动转换为请求字符串格式,必须为key/value格式。 |
dataType | 预期服务器返回的数据类型。如果不指定,jQuery自动根据HTTP包含的MINE信息返回responseXML或responseText。 xml:返回xml文档,可用jquery处理 html:返回纯文本HTML信息:包含的script标签会在插入DOM时执行 script:返回纯文本JavaScript代码。不会自动缓存结果,除非设置了cache参数。 json:返回JSON数据 text:返回纯文本字符串 |
async | boolean类型,这个参数极为重要!! 设置是否为异步请求,默认为true,即所有请求均为异步请求。如果需要发送同步请求,设置为false即可。 同步和异步的区别,同步请求将锁住浏览器,用户其他操作必须等待请求完成才可以执行;而异步请求不会影响其他代码的执行。回想一下以前遇到过这种问题,就是在ajax方法内给变量赋值,再ajax方法后面alert该变量,有时候是得不到ajax方法内赋予的那个值。就是因为ajax请求设置的是异步请求的原因。 |
beforeSend | 发送请求可修改XMLHttpRequest对象的函数,如添加自定义的HTTP头,XMLHttpRequest对象时唯一参数,该函数如果返回fasle,可以取消本次Ajax请求。不常用,反正我是还没用过。 |
cache | 设置缓存。默认值为true,当dataType为script的时候默认值是false,设置为false的时候将不会从浏览器缓存中加载请求信息。以前遇到过这个参数设置不对导致的问题,比较常用。 |
complete | 请求完成后的回调函数(请求成功和失败均调用)。该函数包含两个参数:XMLHttpRequest对象和一个描述成功请求的类型的字符串。 |
global | 是否触发全局Ajax事件,默认值为true。设置为false将不会触发全局ajax事件,如ajaxStart或ajaxStop可用于控制不同的Ajax事件 |
success | 请求成功后的回调函数,函数的参数是由服务器返回并根据dataType参数进行处理后的数据 |
error | 请求失败时调用的回调函数。该函数包含三个参数:XMLHttpRequest对象、错误信息(可选)、捕获的错误对象。如果发生了错误,错误信息(第二个参数)除了得到null之外,还可能是timeout、error、notmodified和parsererror。 |
scriptCharset | 只有当请求时datatype为jsonp或script,并且type是GET才会用于强制修改charset。通常在本地和远程的内容编码不同时使用。 |
dataFilter | 给Ajax返回的原始数据进行预处理的函数。提供data和type两个参数,data是ajax返回的原始数据,type是ajax请求时设置的dataType参数。函数的返回值将由jquery进一步处理。 |
其余也有一些,几乎没用过,不整理了。
3、跟踪状态
jQuery在XMLHttpRequest对象定义的readyState属性基础上,对异步交互中服务器响应状态进行封装,提供了6个响应事件,以便于进一步细化对整个请求响应过程的跟踪
- <span style="font-family:SimSun;font-size:12px;"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <title> New Document </title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <script src="jquery-2.1.0.min.js" type="text/javascript"></script>
- <script type="text/javascript">
- //页面加载方法
- $(function(){
- $("input").click(function(){
- $.ajax({
- type:"POST",
- url:"addClass.html",
- data :"name=css8"
- });
- //设置全局ajax跟踪事件
- $(document).ajaxStart(function(){
- alert("Ajax请求开始")
- });
- $(document).ajaxSend(function(){
- alert("Ajax请求将要发送")
- });
- $(document).ajaxComplete(function(){
- alert("Ajax请求完成")
- });
- $(document).ajaxSuccess(function(){
- alert("Ajax请求成功")
- });
- $(document).ajaxStop(function(){
- alert("Ajax请求结束")
- });
- $(document).ajaxError(function(){
- alert("Ajax请求失败")
- });
- })
- })
- </script>
- </head>
- <body>
- <input type="button" value="ajax请求过程">
- </body>
- </html></span>
4、设置Ajax全局参数
对于频繁与服务器进行交互的页面来说,每一次交互都要设置许多选项,这种操作是很繁琐的,也容易出错。为此,jQuery定义了ajaxSetup()方法,该方法可以预设异步交互中的通用
选项,从而减轻频繁设置选项的繁琐。ajaxSetup()方法的参数跟$.ajax()方法的参数类似,都是一个参数列表,在该方法中设置的选项可以实现全局共享,从而在具体的交互中只要
设置个性化参数即可。
使用方法:
- <span style="font-family:SimSun;font-size:12px;"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <title> New Document </title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <script src="jquery-2.1.0.min.js" type="text/javascript"></script>
- <script type="text/javascript">
- //页面加载方法
- $(function(){
- $.ajaxSetup({
- type:"POST",
- dataType:"text",
- success:function(data){
- alert(data);
- }
- });
- $("input").eq(0).click(function(){
- $.ajax({
- data:"name=wang"
- });
- });
- $("input").eq(1).click(function(){
- $.ajax({
- data:"name=zhang"
- });
- });
- })
- </script>
- </head>
- <body>
- <input type="button" value="按钮1" onclick="">
- <input type="button" value="按钮2" onclick="">
- </body>
- </html></span>
知道有这个东西就行,用起来还是比较简单 的。
2.jQuery实例一
jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯。
废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对jQuery.ajax()进行封装以方便我们使用的方法,当然,如果要处理复杂的逻辑,还是需要用到jQuery.ajax()的(这个后面会说到).
1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中。
url (String) : 请求的HTML页的URL地址。
data (Map) : (可选参数) 发送至服务器的 key/value 数据。
callback (Callback) : (可选参数) 请求完成时(不需要是success的)的回调函数。
这个方法默认使用 GET 方式来传递的,如果[data]参数有传递数据进去,就会自动转换为POST方式的。jQuery 1.2 中,可以指定选择符,来筛选载入的 HTML 文档,DOM 中将仅插入筛选出的 HTML 代码。语法形如 "url #some > selector"。
这个方法可以很方便的动态加载一些HTML文件,例如表单。
示例代码:
$(".ajax.load").load("http://www.cnblogs.com/yeer/archive/2009/06/10/1500682.html .post",
function (responseText, textStatus, XMLHttpRequest){
this;//在这里this指向的是当前的DOM对象,即$(".ajax.load")[0]
//alert(responseText);//请求返回的内容 //alert(textStatus);//请求状态:success,error //alert(XMLHttpRequest);//XMLHttpRequest对象 });
注:不知道为什么URL写绝对路径在FF下会出错,知道的麻烦告诉下。下面的get()和post()示例使用的是绝对路径,所以在FF下你将会出错并不会看到返回结果。还有get()和post()示例都是跨域调用的,发现传上来后没办法获取结果,所以把运行按钮去掉了。
2. jQuery.get( url, [data], [callback] ):使用GET方式来进行异步请求
参数:
url (String) : 发送请求的URL地址.
data (Map) : (可选) 要发送给服务器的数据,以 Key/value 的键值对形式表示,会做为QueryString附加到请求URL中。
callback (Function) : (可选) 载入成功时回调函数(只有当Response的返回状态是success才是调用该方法)。
这是一个简单的 GET 请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax。示例代码:
$.get("./Ajax.aspx", {Action:"get",Name:"lulu"}, function (data, textStatus){
//返回的 data 可以是 xmlDoc, jsonObj, html, text, 等等. this; // 在这里this指向的是Ajax请求的选项配置信息,请参考下图 alert(data);
//alert(textStatus);//请求状态:success,error等等。
当然这里捕捉不到error,因为error的时候根本不会运行该回调函数 //alert(this); });
点击发送请求:
jQuery.get()回调函数里面的 this ,指向的是Ajax请求的选项配置信息:
3. jQuery.post( url, [data], [callback], [type] ) :使用POST方式来进行异步请求
参数:
url (String) : 发送请求的URL地址.
data (Map) : (可选) 要发送给服务器的数据,以 Key/value 的键值对形式表示。
callback (Function) : (可选) 载入成功时回调函数(只有当Response的返回状态是success才是调用该方法)。
type (String) : (可选)官方的说明是:Type of data to be sent。其实应该为客户端请求的类型(JSON,XML,等等)
这是一个简单的 POST 请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax。示例代码:
Ajax.aspx:
Response.ContentType = "application/json";jQuery 代码:
Response.Write("{result: '" + Request["Name"] + ",你好!(这消息来自服务器)'}");
$.post("Ajax.aspx", { Action: "post", Name: "lulu" },
function (data, textStatus){
// data 可以是 xmlDoc, jsonObj, html, text, 等等. //this; // 这个Ajax请求的选项配置信息,请参考jQuery.get()说到的this alert(data.result);
}, "json");
点击提交:
这里设置了请求的格式为"json":
如果你设置了请求的格式为"json",此时你没有设置Response回来的ContentType 为:Response.ContentType = "application/json"; 那么你将无法捕捉到返回的数据。
注意一下,alert(data.result); 由于设置了Accept报头为“json”,这里返回的data就是一个对象,并不需要用eval()来转换为对象。
4. jQuery.getScript( url, [callback] ) : 通过 GET 方式请求载入并执行一个 JavaScript 文件。
参数
url (String) : 待载入 JS 文件地址。
callback (Function) : (可选) 成功载入后回调函数。
jQuery 1.2 版本之前,getScript 只能调用同域 JS 文件。 1.2中,您可以跨域调用 JavaScript 文件。注意:Safari 2 或更早的版本不能在全局作用域中同步执行脚本。如果通过 getScript 加入脚本,请加入延时函数。
这个方法可以用在例如当只有编辑器focus()的时候才去加载编辑器需要的JS文件.下面看一些示例代码:
加载并执行 test.js。jQuery 代码:
$.getScript("test.js");
加载并执行 AjaxEvent.js ,成功后显示信息。
jQuery 代码:
$.getScript("AjaxEvent.js", function(){
alert("AjaxEvent.js 加载完成并执行完成.你再点击上面的Get或Post按钮看看有什么不同?");
});
加载完后请重新点击一下上面的 Load 请求看看有什么不同。
jQuery Ajax 事件
Ajax请求会产生若干不同的事件,我们可以订阅这些事件并在其中处理我们的逻辑。在jQuery这里有两种Ajax事件:局部事件 和 全局事件。
局部事件就是在每次的Ajax请求时在方法内定义的,例如:
$.ajax({
beforeSend: function(){
// Handle the beforeSend event }, complete: function(){
// Handle the complete event } // ... });
全局事件是每次的Ajax请求都会触发的,它会向DOM中的所有元素广播,在上面 getScript() 示例中加载的脚本就是全局Ajax事件。全局事件可以如下定义:
$("#loading").bind("ajaxSend", function(){
$(this).show();
}).bind("ajaxComplete", function(){
$(this).hide();
});
或者:
$("#loading").ajaxStart(function(){
$(this).show();
});
我们可以在特定的请求将全局事件禁用,只要设置下 global 选项就可以了:
$.ajax({
url: "test.html",
global: false,// 禁用全局Ajax事件. // ... });
下面是jQuery官方给出的完整的Ajax事件列表:
- ajaxStart (Global Event)
This event is broadcast if an Ajax request is started and no other Ajax requests are currently running.- beforeSend (Local Event)
This event, which is triggered before an Ajax request is started, allows you to modify the XMLHttpRequest object (setting additional headers, if need be.) - ajaxSend (Global Event)
This global event is also triggered before the request is run. - success (Local Event)
This event is only called if the request was successful (no errors from the server, no errors with the data). - ajaxSuccess (Global Event)
This event is also only called if the request was successful. - error (Local Event)
This event is only called if an error occurred with the request (you can never have both an error and a success callback with a request). - ajaxError (Global Event)
This global event behaves the same as the local error event. - complete (Local Event)
This event is called regardless of if the request was successful, or not. You will always receive a complete callback, even for synchronous requests. - ajaxComplete (Global Event)
This event behaves the same as the complete event and will be triggered every time an Ajax request finishes.
- beforeSend (Local Event)
- ajaxStop (Global Event)
This global event is triggered if there are no more Ajax requests being processed.具体的全局事件请参考API文档。
好了,下面开始说jQuery里面功能最强的Ajax请求方法 $.ajax();jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据
这个是jQuery 的底层 AJAX 实现。简单易用的高层实现见 $.get, $.post 等。
$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该对象,但特殊情况下可用于手动终止请求。
注意: 如果你指定了 dataType 选项,请确保服务器返回正确的 MIME 信息,(如 xml 返回 "text/xml")。错误的 MIME 类型可能导致不可预知的错误。见 Specifying the Data Type for AJAX Requests 。
当设置 datatype 类型为 'script' 的时候,所有的远程(不在同一个域中)POST请求都回转换为GET方式。$.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息。详细参数选项见下。
jQuery 1.2 中,您可以跨域加载 JSON 数据,使用时需将数据类型设置为 JSONP。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。数据类型设置为 "jsonp" 时,jQuery 将自动调用回调函数。(这个我不是很懂)
参数列表:
参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址。 type String (默认: "GET") 请求方式 ("POST" 或 "GET"), 默认为 "GET"。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。 timeout Number 设置请求超时时间(毫秒)。此设置将覆盖全局设置。 async Boolean (默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。 beforeSend Function 发送请求前可修改 XMLHttpRequest 对象的函数,如添加自定义 HTTP 头。XMLHttpRequest 对象是唯一的参数。
function (XMLHttpRequest) {
this; // the options for this ajax request }cache Boolean (默认: true) jQuery 1.2 新功能,设置为 false 将不会从浏览器缓存中加载请求信息。 complete Function 请求完成后回调函数 (请求成功或失败时均调用)。参数: XMLHttpRequest 对象,成功信息字符串。
function (XMLHttpRequest, textStatus) {
this; // the options for this ajax request }contentType String (默认: "application/x-www-form-urlencoded") 发送信息至服务器时内容编码类型。默认值适合大多数应用场合。 data Object,
String发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组,jQuery 将自动为不同值对应同一个名称。如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。 dataType String 预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息返回 responseXML 或 responseText,并作为回调函数参数传递,可用值:
"xml": 返回 XML 文档,可用 jQuery 处理。
"html": 返回纯文本 HTML 信息;包含 script 元素。
"script": 返回纯文本 JavaScript 代码。不会自动缓存结果。
"json": 返回 JSON 数据 。
"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
error Function (默认: 自动判断 (xml 或 html)) 请求失败时将调用此方法。这个方法有三个参数:XMLHttpRequest 对象,错误信息,(可能)捕获的错误对象。
function (XMLHttpRequest, textStatus, errorThrown) {
// 通常情况下textStatus和errorThown只有其中一个有值 this; // the options for this ajax request }global Boolean (默认: true) 是否触发全局 AJAX 事件。设置为 false 将不会触发全局 AJAX 事件,如 ajaxStart 或 ajaxStop 。可用于控制不同的Ajax事件 ifModified Boolean (默认: false) 仅在服务器数据改变时获取新数据。使用 HTTP 包 Last-Modified 头信息判断。 processData Boolean (默认: true) 默认情况下,发送的数据将被转换为对象(技术上讲并非字符串) 以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。 success Function 请求成功后回调函数。这个方法有两个参数:服务器返回数据,返回状态
function (data, textStatus) {
// data could be xmlDoc, jsonObj, html, text, etc... this; // the options for this ajax request }这里有几个Ajax事件参数:beforeSend ,success ,complete ,error 。我们可以定义这些事件来很好的处理我们的每一次的Ajax请求。注意一下,这些Ajax事件里面的 this 都是指向Ajax请求的选项信息的(请参考说 get() 方法时的this的图片)。
请认真阅读上面的参数列表,如果你要用jQuery来进行Ajax开发,那么这些参数你都必需熟知的。示例代码,获取博客园首页的文章题目:
$.ajax({
type: "get",
url: "http://www.cnblogs.com/rss",
beforeSend: function(XMLHttpRequest){
//ShowLoading(); }, success: function(data, textStatus){
$(".ajax.ajaxResult").html("");
$("item",data).each(function(i, domEle){
$(".ajax.ajaxResult").append("<li>"+$(domEle).children("title").text()+"</li>");
});
},
complete: function(XMLHttpRequest, textStatus){
//HideLoading(); }, error: function(){
//请求出错处理 } });这里将显示首页文章列表。
其他
jQuery.ajaxSetup( options ) : 设置全局 AJAX 默认选项。
设置 AJAX 请求默认地址为 "/xmlhttp/",禁止触发全局 AJAX 事件,用 POST 代替默认 GET 方法。其后的 AJAX 请求不再设置任何选项参数。
jQuery 代码:
$.ajaxSetup({
url: "/xmlhttp/",
global: false,
type: "POST"
});
$.ajax({ data: myData });serialize() 与 serializeArray()
serialize() : 序列表表格内容为字符串。
serializeArray() : 序列化表格元素 (类似 '.serialize()' 方法) 返回 JSON 数据结构数据。
示例:
HTML代码:
<p id="results"><b>Results: </b> </p> <form> <select name="single"> <option>Single</option> <option>Single2</option> </select> <select name="multiple" multiple="multiple"> <option selected="selected">Multiple</option> <option>Multiple2</option> <option selected="selected">Multiple3</option> </select><br/> <input type="checkbox" name="check" value="check1"/> check1
<input type="checkbox" name="check" value="check2"
checked="checked"/> check2
<input type="radio" name="radio" value="radio1"
checked="checked"/> radio1
<input type="radio" name="radio" value="radio2"/> radio2
</form> -
serializeArray() 结果为:
3.jQuery实例二
根据服务器端返回的数据格式的不同,分为三种情况:
1)服务器返回JSON格式的数据:
getJSON.html文件的内容如下:
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- <link rel="stylesheet" type="text/css" href="../css/ui-lightness/jquery-ui-1.8.1.custom.css" mce_href="css/ui-lightness/jquery-ui-1.8.1.custom.css">
- <mce:script type="text/javascript" src="../js/jquery.js" mce_src="js/jquery.js"></mce:script>
- <mce:script type="text/javascript"><!--
- $(document).ready(function(){
- $('#send').click(function(){
- $.get('getJSON.jsp',{
- username:$('#username').val(),
- content:$('#content').val()
- },function(data,textStatus){
- var username=data.username;
- var content=data.content;
- var textHtml="<div class='comment'><h6>"+username+":</h6><p class='para'>"+content+" </p></div>"
- $('#resText').html(textHtml);
- },"json");
- });
- });
- // --></mce:script>
- </head>
- <body>
- <form id="form1" action="#">
- <p>评论:</p>
- <p>姓名:<input type="text" name="username" id="username"/></p>
- <p>内容:<textarea name="content" id="content" rows="3" cols="20">
已有评论getJSON.jsp的内容如下:- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%
- String username = request.getParameter("username");
- String content = request.getParameter("content");
- out.println("{ username : '"+username+"' , content : '"+content+"'}");
- %>
2.服务器返回XML格式的数据:getXMLData.html:- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- <link rel="stylesheet" type="text/css" href="../css/ui-lightness/jquery-ui-1.8.1.custom.css" mce_href="css/ui-lightness/jquery-ui-1.8.1.custom.css">
- <mce:script type="text/javascript" src="../js/jquery.js" mce_src="js/jquery.js"></mce:script>
- <mce:script type="text/javascript"><!--
- $(document).ready(function(){
- $('#send').click(function(){
- $.get('getXmlData.jsp',{
- username:$('#username').val(),
- content:$('#content').val()
- },function(data,textStatus){
- var username=$(data).find("comment").attr("username");
- var content=$(data).find("comment content").text();
- var textHtml="<div class='comment'><h6>"+username+":</h6><p class='para'>"+content+" </p></div>"
- $('#resText').html(textHtml);
- });
- });
- });
- // --></mce:script>
- </head>
- <body>
- <form id="form1" action="#">
- <p>评论:</p>
- <p>姓名:<input type="text" name="username" id="username"/></p>
- <p>内容:<textarea name="content" id="content" rows="3" cols="20">
已有评论getXMLData.jsp:- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%
- String username = request.getParameter("username");
- String content = request.getParameter("content");
- response.setContentType("text/xml");
- out.println("<?xml version='1.0' encoding='UTF-8' ?>");
- out.println("<comments>");
- out.println("<comment username='"+username+"'>");
- out.println("<content>"+content+"</content>");
- out.println("</comment>");
- out.println("</comments>");
- %>
3.服务器端返回HTML格式数据:getHTMLData.html:- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- <link rel="stylesheet" type="text/css" href="../css/ui-lightness/jquery-ui-1.8.1.custom.css" mce_href="css/ui-lightness/jquery-ui-1.8.1.custom.css">
- <mce:style><!--
- * { margin:0; padding:0;}
- body { font-size:12px;}
- .comment { margin-top:10px; padding:10px; border:1px solid #ccc;background:#DDD;}
- .comment h6 { font-weight:700; font-size:14px;}
- .para { margin-top:5px; text-indent:2em;background:#DDD;}
- --></mce:style><style mce_bogus="1">* { margin:0; padding:0;}
- body { font-size:12px;}
- .comment { margin-top:10px; padding:10px; border:1px solid #ccc;background:#DDD;}
- .comment h6 { font-weight:700; font-size:14px;}
- .para { margin-top:5px; text-indent:2em;background:#DDD;}</style>
- <mce:script type="text/javascript" src="../js/jquery.js" mce_src="js/jquery.js"></mce:script>
- <mce:script type="text/javascript"><!--
- $(document).ready(function(){
- $('#send').click(function(){
- //$.get('get.jsp',参数,回调函数);
- $.get("getXMLData.jsp", {
- username : $("#username").val() ,
- content : $("#content").val()
- }, function (data, textStatus){
- $("#resText").html( data ); // 把返回的数据添加到页面上
- }
- );
- });
- });
- // --></mce:script>
- </head>
- <body>
- <form id="form1" action="#">
- <p>评论:</p>
- <p>姓名:<input type="text" name="username" id="username"/></p>
- <p>内容:<textarea name="content" id="content" rows="3" cols="20">
已有评论getXMLData.jsp:- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <%
- String username = request.getParameter("username");
- String content = request.getParameter("content");
- out.println("<div class='comment'><h6> "+username+" :</h6><p class='para'> "+content+" </p></div>");
- %>
get方法介绍:$.get(url [,data] [,callback] [,type]);url:向服务器请求的资源的地址data:异步请求时传给服务器的参数callback:服务器返回response成功时调用的函数type:服务器端返回的数据的格式(html,json,script,xml,text等)
Jquery在异步提交方面封装的很好,直接用AJAX非常麻烦,Jquery大大简化了我们的操作,不用考虑浏览器的诧异了。
推荐一篇不错的jQuery Ajax 实例文章,忘记了可以去看看,地址为:http://www.cnblogs.com/yeer/archive/2009/07/23/1529460.html 和 http://www.w3school.com.cn/jquery/
$.post、$.get是一些简单的方法,如果要处理复杂的逻辑,还是需要用到jQuery.ajax()
一、$.ajax的一般格式
$.ajax({
type: 'POST',
url: url ,
data: data ,
success: success ,
dataType: dataType
});
二、$.ajax的参数描述
参数 描述url 必需。规定把请求发送到哪个 URL。 data 可选。映射或字符串值。规定连同请求发送到服务器的数据。 success(data, textStatus, jqXHR) 可选。请求成功时执行的回调函数。 dataType 可选。规定预期的服务器响应的数据类型。
默认执行智能判断(xml、json、script 或 html)。
三、$.ajax需要注意的一些地方:
1.data主要方式有三种,html拼接的,json数组,form表单经serialize()序列化的;通过dataType指定,不指定智能判断。
2.$.ajax只提交form以文本方式,如果异步提交包含<file>上传是传过不过去,需要使用jquery.form.js的$.ajaxSubmit
四、$.ajax我的实际应用例子
- //1.$.ajax带json数据的异步请求
- var aj = $.ajax( {
- url:'productManager_reverseUpdate',// 跳转到 action
- data:{
- selRollBack : selRollBack,
- selOperatorsCode : selOperatorsCode,
- PROVINCECODE : PROVINCECODE,
- pass2 : pass2
- },
- type:'post',
- cache:false,
- dataType:'json',
- success:function(data) {
- if(data.msg =="true" ){
- // view("修改成功!");
- alert("修改成功!");
- window.location.reload();
- }else{
- view(data.msg);
- }
- },
- error : function() {
- // view("异常!");
- alert("异常!");
- }
- });
- //2.$.ajax序列化表格内容为字符串的异步请求
- function noTips(){
- var formParam = $("#form1").serialize();//序列化表格内容为字符串
- $.ajax({
- type:'post',
- url:'Notice_noTipsNotice',
- data:formParam,
- cache:false,
- dataType:'json',
- success:function(data){
- }
- });
- }
- //3.$.ajax拼接url的异步请求
- var yz=$.ajax({
- type:'post',
- url:'validatePwd2_checkPwd2?password2='+password2,
- data:{},
- cache:false,
- dataType:'json',
- success:function(data){
- if( data.msg =="false" ) //服务器返回false,就将validatePassword2的值改为pwd2Error,这是异步,需要考虑返回时间
- {
- textPassword2.html("<font color='red'>业务密码不正确!</font>");
- $("#validatePassword2").val("pwd2Error");
- checkPassword2 = false;
- return;
- }
- },
- error:function(){}
- });
- //4.$.ajax拼接data的异步请求
- $.ajax({
- url:'<%=request.getContextPath()%>/kc/kc_checkMerNameUnique.action',
- type:'post',
- data:'merName='+values,
- async : false, //默认为true 异步
- error:function(){
- alert('error');
- },
- success:function(data){
- $("#"+divs).html(data);
- }
- });
4.jQuery解析xml和json数据
1.解析并返回xml
- <input type="text" id="userName" />
- <input type="button" value="校验" οnclick="verify()"/>
- <!--这个div用于存放服务器段返回的信息,开始为空-->
- <!--id属性定义是为了利用dom的方式找到某一个节点,进行操作-->
- <div id="result"></div>
- <!--div和span的直观差异,div中的内容独占行,span中的内容和前后其他内容相处良好-->
- function verify(){
- //Jquery的查找节点的方式,参数中#加上id属性值可以找到一个节点。
- //jquery的方法返回的都是jquery的对象,可以继续在上面执行其他的jquery方法
- var jqueryObj = $("#userName");
- //获取节点的值
- var userName = jqueryObj.val();
- //使用jquery的XMLHTTPrequest对象get请求的封装
- $.ajax({
- type: "POST", //http请求方式
- url: "AJAXXMLServer", //服务器段url地址
- data: "name=" + userName, //发送给服务器段的数据
- dataType: "xml", //告诉JQuery返回的数据格式
- success: callback //定义交互完成,并且服务器正确返回数据时调用的回调函数
- });
- }
- //回调函数
- function callback(data) {
- // 接收服务器端返回的数据
- // 需要将data这个dom对象中的数据解析出来
- // 首先需要将dom的对象转换成JQuery的对象
- var jqueryObj = $(data);
- // 获取message节点
- var message = jqueryObj.children();
- // 获取文本内容
- var text = message.text();
- // 将服务器段返回的数据动态的显示在页面上
- // 找到保存结果信息的节点
- var resultObj = $("#result");
- // 动态的改变页面中div节点中的内容
- resultObj.html(text);
- }
- public class AJAXXMLServer extends HttpServlet{
- protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
- doGet(httpServletRequest, httpServletResponse);
- }
- protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
- try{
- // 响应的Content-Type必须是text/xml
- httpServletResponse.setContentType("text/xml;charset=utf-8");
- PrintWriter out = httpServletResponse.getWriter();
- // 取参数
- String old = httpServletRequest.getParameter("name");
- // 返回的数据需要拼装成xml格式
- StringBuilder builder = new StringBuilder();
- builder.append("<message>");
- //2.检查参数是否有问题
- if(old == null || old.length() == 0){
- builder.append("用户名不能为空").append("</message>");
- } else{
- //3.校验操作
- String name = old;
- if(name.equals("hardwin")){
- // 和传统应用不同之处。这一步需要将用户感兴趣的数据返回给页面段,而不是将一个新的页面发送给用户
- builder.append("用户名[" + name + "]已经存在,请使用其他用户名").append("</message>");
- } else{
- builder.append("用户名[" + name + "]尚未存在,可以使用该用户名注册").append("</message>");
- }
- out.println(builder.toString());
- System.out.println(builder.toString());
- }
- } catch(Exception e){
- e.printStackTrace();
- }
- }
- }
2.jquery解析html,json和xml
- <input type="text" id="userName" />
- <input type="button" value="校验" οnclick="verify()"/>
- <!--这个div用于存放服务器段返回的信息,开始为空-->
- <!--id属性定义是为了利用dom的方式找到某一个节点,进行操作-->
- <div id="result"></div>
- <!--div和span的直观差异,div中的内容独占行,span中的内容和前后其他内容相处良好-->
- function verify(){
- //Jquery的查找节点的方式,参数中#加上id属性值可以找到一个节点。
- //jquery的方法返回的都是jquery的对象,可以继续在上面执行其他的jquery方法
- var jqueryObj = $("#userName");
- //获取节点的值
- var userName = jqueryObj.val();
- //使用jquery的XMLHTTPrequest对象get请求的封装
- $.ajax({
- type: "POST", //http请求方式
- url: "AJAXXMLServer", //服务器段url地址
- data: "name=" + userName, //发送给服务器段的数据
- dataType: "xml", //告诉JQuery返回的数据格式
- success: callback //定义交互完成,并且服务器正确返回数据时调用的回调函数
- });
- }
- //回调函数
- function callback(data) {
- // 接收服务器端返回的数据
- // 需要将data这个dom对象中的数据解析出来
- // 首先需要将dom的对象转换成JQuery的对象
- var jqueryObj = $(data);
- // 获取message节点
- var message = jqueryObj.children();
- // 获取文本内容
- var text = message.text();
- // 将服务器段返回的数据动态的显示在页面上
- // 找到保存结果信息的节点
- var resultObj = $("#result");
- // 动态的改变页面中div节点中的内容
- resultObj.html(text);
- }
- public class AJAXXMLServer extends HttpServlet{
- protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
- doGet(httpServletRequest, httpServletResponse);
- }
- protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
- try{
- // 响应的Content-Type必须是text/xml
- httpServletResponse.setContentType("text/xml;charset=utf-8");
- PrintWriter out = httpServletResponse.getWriter();
- // 取参数
- String old = httpServletRequest.getParameter("name");
- // 返回的数据需要拼装成xml格式
- StringBuilder builder = new StringBuilder();
- builder.append("<message>");
- //2.检查参数是否有问题
- if(old == null || old.length() == 0){
- builder.append("用户名不能为空").append("</message>");
- } else{
- //3.校验操作
- String name = old;
- if(name.equals("hardwin")){
- // 和传统应用不同之处。这一步需要将用户感兴趣的数据返回给页面段,而不是将一个新的页面发送给用户
- builder.append("用户名[" + name + "]已经存在,请使用其他用户名").append("</message>");
- } else{
- builder.append("用户名[" + name + "]尚未存在,可以使用该用户名注册").append("</message>");
- }
- out.println(builder.toString());
- System.out.println(builder.toString());
- }
- } catch(Exception e){
- e.printStackTrace();
- }
- }
- }
1、HTML
有的时候会将一段HTML片段保存在HTML文件中,在另外的主页面直接读取该HTML文件,然后解析里面的HTML代码片段融入到主页面中。
fragment.html文件,其内容:
<div>hello Jquery</div>在主页面
Test.html中解析代码$("#a1").click(function(){
$("#div2").load('fragment.html');
return false;
});[code]2、JSON
JSON文件是test.json,其内容:
[code]
[{"name":"jim","age":"20"},{"name":"lily","age":"18","hobby":["swim","movie"]}]在主页面
Test.html中解析代码$("#a2").click(function(){3、XML
$.getJSON('test.json',function(data){
var html = '<table>';
$.each(data,function(entryIndex,entry){
html += '<tr><td>'+entry.name+'</td><td>'+entry.age+'</td>';
if(entry.hobby){
html += '<td>';
$.each(entry.hobby, function(lineindex,line) {
html += line+",";
});
html += '</td>';
}
html += '</tr>';
});
html += '</table>';
$("#div2").html(html);
return false;
});
});
XML文件是test.xml,其内容是:<?xml version="1.0" encoding="utf-8" ?>在主页面
<root>
<book id="1">
<name>深入浅出extjs</name>
<author>张三</author>
<price>88</price>
</book>
<book id="2">
<name>锋利的jQuery</name>
<author>李四</author>
<price>99</price>
</book>
<book id="3">
<name>深入浅出flex</name>
<author>王五</author>
<price>108</price>
</book>
<book id="4">
<name>java编程思想</name>
<author>钱七</author>
<price>128</price>
</book>
</root>
Test.html中解析代码$("#a3").click(function(){对JQuery解析不同文档做了一个Demo,Test.html的原码是
$.get('test.xml',function(data){
var s="";
$(data).find('book').each(function(i){
var id=$(this).attr('id');
var name=$(this).children('name').text();
var author=$(this).children('author').text();
var price=$(this).children('price').text();
s+=id+" "+name+" "+author+" "+price+"<br>";
});
$('#div2').html(s);
});
});<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(function(){
$("#a1").click(function(){
$("#div2").load('fragment.html');
return false;
});
$("#a2").click(function(){
$.getJSON('test.json',function(data){
var html = '<table>';
$.each(data,function(entryIndex,entry){
html += '<tr><td>'+entry.name+'</td><td>'+entry.age+'</td>';
if(entry.hobby){
html += '<td>';
$.each(entry.hobby, function(lineindex,line) {
html += line+",";
});
html += '</td>';
}
html += '</tr>';
});
html += '</table>';
$("#div2").html(html);
return false;
});
});$("#a3").click(function(){
$.get('test.xml',function(data){
var s="";
$(data).find('book').each(function(i){
var id=$(this).attr('id');
var name=$(this).children('name').text();
var author=$(this).children('author').text();
var price=$(this).children('price').text();
s+=id+" "+name+" "+author+" "+price+"<br>";
});
$('#div2').html(s);
});
});
});
</script>
</head>
<body>
<form id="form1" runat="server">
<ul id="div1">
<li><a id="a1" href="#">show html fragment</a></li>
<li><a id="a2" href="#">show json</a></li>
<li><a id="a3" href="#">show xml</a></li>
</ul>
<p>Show Content:</p>
<div id ="div2"></div>
</form>
<div>
</div>
</body>
</html>点第一个超链接会在Show Content区域显示新插入的html片段
点第二个超链接,会显示json数据:
点第三个超链接,会显示xml数据:
- <input type="text" id="userName" />
- <input type="button" value="校验" οnclick="verify()"/>
- <!--这个div用于存放服务器段返回的信息,开始为空-->
- <!--id属性定义是为了利用dom的方式找到某一个节点,进行操作-->
- <div id="result"></div>
- <!--div和span的直观差异,div中的内容独占行,span中的内容和前后其他内容相处良好-->
- function verify(){
- //Jquery的查找节点的方式,参数中#加上id属性值可以找到一个节点。
- //jquery的方法返回的都是jquery的对象,可以继续在上面执行其他的jquery方法
- var jqueryObj = $("#userName");
- //获取节点的值
- var userName = jqueryObj.val();
- //使用jquery的XMLHTTPrequest对象get请求的封装
- $.ajax({
- type: "POST", //http请求方式
- url: "AJAXXMLServer", //服务器段url地址
- data: "name=" + userName, //发送给服务器段的数据
- dataType: "xml", //告诉JQuery返回的数据格式
- success: callback //定义交互完成,并且服务器正确返回数据时调用的回调函数
- });
- }
- //回调函数
- function callback(data) {
- // 接收服务器端返回的数据
- // 需要将data这个dom对象中的数据解析出来
- // 首先需要将dom的对象转换成JQuery的对象
- var jqueryObj = $(data);
- // 获取message节点
- var message = jqueryObj.children();
- // 获取文本内容
- var text = message.text();
- // 将服务器段返回的数据动态的显示在页面上
- // 找到保存结果信息的节点
- var resultObj = $("#result");
- // 动态的改变页面中div节点中的内容
- resultObj.html(text);
- }
- public class AJAXXMLServer extends HttpServlet{
- protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
- doGet(httpServletRequest, httpServletResponse);
- }
- protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
- try{
- // 响应的Content-Type必须是text/xml
- httpServletResponse.setContentType("text/xml;charset=utf-8");
- PrintWriter out = httpServletResponse.getWriter();
- // 取参数
- String old = httpServletRequest.getParameter("name");
- // 返回的数据需要拼装成xml格式
- StringBuilder builder = new StringBuilder();
- builder.append("<message>");
- //2.检查参数是否有问题
- if(old == null || old.length() == 0){
- builder.append("用户名不能为空").append("</message>");
- } else{
- //3.校验操作
- String name = old;
- if(name.equals("hardwin")){
- // 和传统应用不同之处。这一步需要将用户感兴趣的数据返回给页面段,而不是将一个新的页面发送给用户
- builder.append("用户名[" + name + "]已经存在,请使用其他用户名").append("</message>");
- } else{
- builder.append("用户名[" + name + "]尚未存在,可以使用该用户名注册").append("</message>");
- }
- out.println(builder.toString());
- System.out.println(builder.toString());
- }
- } catch(Exception e){
- e.printStackTrace();
- }
- }
- }
-
5.jQuery请求,返回xml,html,json实例
-
-
jquery ajax请求返回xml,html,text,json,..数据实例详解
(2013-01-24 16:55:05)jQuery Ajax 实例 全解析jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯。
废话少说,直接进入正题,我们先来看一些简单的方法,这些方法都是对jQuery.ajax()进行封装以方便我们使用的方法,当然,如果要处理复杂的逻辑,还是需要用到jQuery.ajax()的(这个后面会说到).
1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中。
url (String) : 请求的HTML页的URL地址。
data (Map) : (可选参数) 发送至服务器的 key/value 数据。
callback (Callback) : (可选参数) 请求完成时(不需要是success的)的回调函数。
这个方法默认使用 GET 方式来传递的,如果[data]参数有传递数据进去,就会自动转换为POST方式的。jQuery 1.2 中,可以指定选择符,来筛选载入的 HTML 文档,DOM 中将仅插入筛选出的 HTML 代码。语法形如 "url #some > selector"。
这个方法可以很方便的动态加载一些HTML文件,例如表单。
示例代码:
$(".ajax.load").load("http://www.cnblogs.com/yeer/archive/2009/06/10/1500682.html .post", function (responseText, textStatus, XMLHttpRequest){ this;//在这里this指向的是当前的DOM对象,即$(".ajax.load")[0] //alert(responseText);//请求返回的内容 //alert(textStatus);//请求状态:success,error//alert(XMLHttpRequest);//XMLHttpRequest对象 });
这里将显示结果。注:不知道为什么URL写绝对路径在FF下会出错,知道的麻烦告诉下。下面的get()和post()示例使用的是绝对路径,所以在FF下你将会出错并不会看到返回结果。还有get()和post()示例都是跨域调用的,发现传上来后没办法获取结果,所以把运行按钮去掉了。
2. jQuery.get( url, [data], [callback] ):使用GET方式来进行异步请求
参数:
url (String) : 发送请求的URL地址.
data (Map) : (可选) 要发送给服务器的数据,以 Key/value 的键值对形式表示,会做为QueryString附加到请求URL中。
callback (Function) : (可选) 载入成功时回调函数(只有当Response的返回状态是success才是调用该方法)。
这是一个简单的 GET 请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax。示例代码:
$.get("./Ajax.aspx", {Action:"get",Name:"lulu"}, function (data, textStatus){ //返回的 data 可以是 xmlDoc, jsonObj, html, text, 等等. this; // 在这里this指向的是Ajax请求的选项配置信息,请参考下图 alert(data); //alert(textStatus);//请求状态:success,error等等。 当然这里捕捉不到error,因为error的时候根本不会运行该回调函数 //alert(this); });
点击发送请求:
jQuery.get()回调函数里面的 this ,指向的是Ajax请求的选项配置信息:
3. jQuery.post( url, [data], [callback], [type] ) :使用POST方式来进行异步请求
参数:
url (String) : 发送请求的URL地址.
data (Map) : (可选) 要发送给服务器的数据,以 Key/value 的键值对形式表示。
callback (Function) : (可选) 载入成功时回调函数(只有当Response的返回状态是success才是调用该方法)。
type (String) : (可选)官方的说明是:Type of data to be sent。其实应该为客户端请求的类型(JSON,XML,等等)
这是一个简单的 POST 请求功能以取代复杂 $.ajax 。请求成功时可调用回调函数。如果需要在出错时执行函数,请使用 $.ajax。示例代码:
Ajax.aspx:
Response.ContentType = "application/json"; Response.Write("{result: '" + Request["Name"] + ",你好!(这消息来自服务器)'}");
jQuery 代码:$.post("Ajax.aspx", { Action: "post", Name: "lulu" }, function (data, textStatus){ // data 可以是 xmlDoc, jsonObj, html, text, 等等. //this; // 这个Ajax请求的选项配置信息,请参考jQuery.get()说到的this alert(data.result); }, "json");
点击提交:
这里设置了请求的格式为"json":
如果你设置了请求的格式为"json",此时你没有设置Response回来的ContentType 为:Response.ContentType = "application/json"; 那么你将无法捕捉到返回的数据。
注意一下,alert(data.result); 由于设置了Accept报头为“json”,这里返回的data就是一个对象,并不需要用eval_r()来转换为对象。
4. jQuery.getScript( url, [callback] ) : 通过 GET 方式请求载入并执行一个 JavaScript 文件。
参数
url (String) : 待载入 JS 文件地址。
callback (Function) : (可选) 成功载入后回调函数。
jQuery 1.2 版本之前,getScript 只能调用同域 JS 文件。 1.2中,您可以跨域调用 JavaScript 文件。注意:Safari 2 或更早的版本不能在全局作用域中同步执行脚本。如果通过 getScript 加入脚本,请加入延时函数。
这个方法可以用在例如当只有编辑器focus()的时候才去加载编辑器需要的JS文件.下面看一些示例代码:
加载并执行 test.js。jQuery 代码:
$.getScript("test.js");
加载并执行 AjaxEvent.js ,成功后显示信息。
jQuery 代码:
$.getScript("AjaxEvent.js", function(){ alert("AjaxEvent.js 加载完成并执行完成.你再点击上面的Get或Post按钮看看有什么不同?"); });
加载完后请重新点击一下上面的 Load 请求看看有什么不同。
jQuery Ajax 事件
Ajax请求会产生若干不同的事件,我们可以订阅这些事件并在其中处理我们的逻辑。在jQuery这里有两种Ajax事件:局部事件 和 全局事件。
局部事件就是在每次的Ajax请求时在方法内定义的,例如:
$.ajax({ beforeSend: function(){ // Handle the beforeSend event }, complete: function(){ // Handle the complete event } // ... });
全局事件是每次的Ajax请求都会触发的,它会向DOM中的所有元素广播,在上面 getScript() 示例中加载的脚本就是全局Ajax事件。全局事件可以如下定义:
$("#loading").bind("ajaxSend", function(){ $(this).show(); }).bind("ajaxComplete", function(){ $(this).hide(); });
或者:
$("#loading").ajaxStart(function(){ $(this).show(); });
我们可以在特定的请求将全局事件禁用,只要设置下 global 选项就可以了:
$.ajax({ url: "test.html", global: false,// 禁用全局Ajax事件. // ... });
下面是jQuery官方给出的完整的Ajax事件列表:
- ajaxStart (Global Event)
This event is broadcast if an Ajax request is started and no other Ajax requests are currently running.- beforeSend (Local Event)
This event, which is triggered before an Ajax request is started, allows you to modify the XMLHttpRequest object (setting additional headers, if need be.) - ajaxSend (Global Event)
This global event is also triggered before the request is run. - success (Local Event)
This event is only called if the request was successful (no errors from the server, no errors with the data). - ajaxSuccess (Global Event)
This event is also only called if the request was successful. - error (Local Event)
This event is only called if an error occurred with the request (you can never have both an error and a success callback with a request). - ajaxError (Global Event)
This global event behaves the same as the local error event. - complete (Local Event)
This event is called regardless of if the request was successful, or not. You will always receive a complete callback, even for synchronous requests. - ajaxComplete (Global Event)
This event behaves the same as the complete event and will be triggered every time an Ajax request finishes.
- beforeSend (Local Event)
- ajaxStop (Global Event)
This global event is triggered if there are no more Ajax requests being processed.具体的全局事件请参考API文档。
好了,下面开始说jQuery里面功能最强的Ajax请求方法 $.ajax();jQuery.ajax( options ) : 通过 HTTP 请求加载远程数据
这个是jQuery 的底层 AJAX 实现。简单易用的高层实现见 $.get, $.post 等。
$.ajax() 返回其创建的 XMLHttpRequest 对象。大多数情况下你无需直接操作该对象,但特殊情况下可用于手动终止请求。
注意: 如果你指定了 dataType 选项,请确保服务器返回正确的 MIME 信息,(如 xml 返回 "text/xml")。错误的 MIME 类型可能导致不可预知的错误。见 Specifying the Data Type for AJAX Requests 。
当设置 datatype 类型为 'script' 的时候,所有的远程(不在同一个域中)POST请求都回转换为GET方式。$.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息。详细参数选项见下。
jQuery 1.2 中,您可以跨域加载 JSON 数据,使用时需将数据类型设置为 JSONP。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。数据类型设置为 "jsonp" 时,jQuery 将自动调用回调函数。(这个我不是很懂)
参数列表:
参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址。 type String (默认: "GET") 请求方式 ("POST" 或 "GET"), 默认为 "GET"。注意:其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。 timeout Number 设置请求超时时间(毫秒)。此设置将覆盖全局设置。 async Boolean (默认: true) 默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。 beforeSend Function 发送请求前可修改 XMLHttpRequest 对象的函数,如添加自定义 HTTP 头。XMLHttpRequest 对象是唯一的参数。
function (XMLHttpRequest) { this; // the options for this ajax request }
cache Boolean (默认: true) jQuery 1.2 新功能,设置为 false 将不会从浏览器缓存中加载请求信息。 complete Function 请求完成后回调函数 (请求成功或失败时均调用)。参数: XMLHttpRequest 对象,成功信息字符串。
function (XMLHttpRequest, textStatus) { this; // the options for this ajax request }
contentType String (默认: "application/x-www-form-urlencoded") 发送信息至服务器时内容编码类型。默认值适合大多数应用场合。 data Object,
String发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后。查看 processData 选项说明以禁止此自动转换。必须为 Key/Value 格式。如果为数组,jQuery 将自动为不同值对应同一个名称。如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。 dataType String 预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息返回 responseXML 或 responseText,并作为回调函数参数传递,可用值:
"xml": 返回 XML 文档,可用 jQuery 处理。
"html": 返回纯文本 HTML 信息;包含 script 元素。
"script": 返回纯文本 JavaScript 代码。不会自动缓存结果。
"json": 返回 JSON 数据 。
"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
error Function (默认: 自动判断 (xml 或 html)) 请求失败时将调用此方法。这个方法有三个参数:XMLHttpRequest 对象,错误信息,(可能)捕获的错误对象。
function (XMLHttpRequest, textStatus, errorThrown) { // 通常情况下textStatus和errorThown只有其中一个有值 this; // the options for this ajax request }
global Boolean (默认: true) 是否触发全局 AJAX 事件。设置为 false 将不会触发全局 AJAX 事件,如 ajaxStart 或 ajaxStop 。可用于控制不同的Ajax事件 ifModified Boolean (默认: false) 仅在服务器数据改变时获取新数据。使用 HTTP 包 Last-Modified 头信息判断。 processData Boolean (默认: true) 默认情况下,发送的数据将被转换为对象(技术上讲并非字符串) 以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。 success Function 请求成功后回调函数。这个方法有两个参数:服务器返回数据,返回状态
function (data, textStatus) { // data could be xmlDoc, jsonObj, html, text, etc... this;// the options for this ajax request }
这里有几个Ajax事件参数:beforeSend ,success ,complete ,error 。我们可以定义这些事件来很好的处理我们的每一次的Ajax请求。注意一下,这些Ajax事件里面的 this 都是指向Ajax请求的选项信息的(请参考说 get() 方法时的this的图片)。
请认真阅读上面的参数列表,如果你要用jQuery来进行Ajax开发,那么这些参数你都必需熟知的。示例代码,获取博客园首页的文章题目:
$.ajax({ type: "get", url: "http://www.cnblogs.com/rss", beforeSend: function(XMLHttpRequest){ //ShowLoading(); }, success: function(data, textStatus){ $(".ajax.ajaxResult").html(""); $("item",data).each(function(i, domEle){ $(".ajax.ajaxResult").append("
- "+$(domEle).children("title").text()+"
"); }); }, complete: function(XMLHttpRequest, textStatus){ //HideLoading(); }, error: function(){ //请求出错处理 } });
这里将显示首页文章列表。
其他
jQuery.ajaxSetup( options ) : 设置全局 AJAX 默认选项。
设置 AJAX 请求默认地址为 "/xmlhttp/",禁止触发全局 AJAX 事件,用 POST 代替默认 GET 方法。其后的 AJAX 请求不再设置任何选项参数。
jQuery 代码:
$.ajaxSetup({ url: "/xmlhttp/", global: false, type: "POST" }); $.ajax({ data: myData });
serialize() 与 serializeArray()
serialize() : 序列表表格内容为字符串。
serializeArray() : 序列化表格元素 (类似 '.serialize()' 方法) 返回 JSON 数据结构数据。
示例:
HTML代码:
<</SPAN>p id="results"><</SPAN>b>Results: </</SPAN>b> </</SPAN>p> <</SPAN>form><</SPAN>select name="single"> <</SPAN>option>Single</</SPAN>option><</SPAN>option>Single2</</SPAN>option> </</SPAN>select> <</SPAN>select name="multiple"multiple="multiple"> <</SPAN>option selected="selected">Multiple</</SPAN>option><</SPAN>option>Multiple2</</SPAN>option> <</SPAN>optionselected="selected">Multiple3</</SPAN>option> </</SPAN>select><</SPAN>br/><</SPAN>input type="checkbox" name="check" value="check1"/> check1 <</SPAN>input type="checkbox" name="check" value="check2" checked="checked"/> check2 <</SPAN>input type="radio" name="radio" value="radio1" checked="checked"/> radio1 <</SPAN>input type="radio" name="radio" value="radio2"/> radio2 </</SPAN>form>
-
serializeArray() 结果为:
- ajaxStart (Global Event)