Ajax笔记

Ajax 的全称为 Asynchronous JavaScript and XML ,使用Ajax技术,可以实现无刷新状态更新页面(页面的局部更新),并且实现异步提交,提升了用户的体验。

jQuery对Ajax做了大量的封装,对于封装的方式,jQuery采用了三层封装:
- 最底层:$.ajax() 全局方法。
- 第二层:load()、$.get()和$.post(),其中load()为局部方法。
- 第三层:$.getScript() 和 $.getJSON()。

1. $.ajax()

在jQuery中,$.ajax()是所有Ajax方法中最底层的方法,所有其他方法都是基于$.ajax()方法的封装。

$.ajax()只有一个参数,它是键值对的json对象。

下面是关于该json参数的说明:

值的类型值的说明
url字符串请求的url地址
type字符串请求方式:get或post,默认为get
timeout数值设置请求超时的时间(毫秒)
data字符串或对象发送到服务器的数据,字符串的键值对或json键值对
dataType字符串指定服务器返回的数据类型,如html、xml、json、text等
success函数请求成功后,执行的回调函数
$.ajax({
    url:'test.php',
    type:'POST',
    data:'id=1&name=lisi',
    success:function(data){
        alert(data);
    }
});
2. load()

将请求页面的内容(请求的数据)加载到调用该方法的元素内部。

三个参数:

  • 请求页面的url地址,类型为字符串。必选参数。
  • 向请求页面发送的数据,类型为json对象或字符串。可选参数。
  • 请求成功或失败后执行的回调函数。可选参数。

在a.html中加载b.html中的内容,只需一个url即可。

$('#box').load('b.html'); // 将b.html的内容加载到id=box的元素内部

如果想对载入的HTML代码进行筛选,可以在url参数后面跟一个选择器。

$('#box').load('b.html .my'); // 只加载class=my的元素

如果请求的是php文件,还可以向服务器发送数据。提交数据的方式有两种:get和post,默认为get。

$('#box').load('test.php'); // 加载php文件的输出内容

$('#box').load('test.php?id=1&name=ccc'); // 加载php文件的输出内容(以get方式向php文件传递数据),请求方式为get

$('#box').load('test.php',{id:1,name:'ccc'}); // load方法传递了两个参数,url和json数据,这种请求的方式为post

在Ajax数据载入完毕后,执行回调函数(第三个参数)。回调函数有三个可选参数:response(服务器响应的数据)、status(请求的结果状态)、XMLHttpRequest对象。

$('#box').load('test.php',{id:1,name:'ccc'},function(response,status,xhr){
    alert('返回的数据为:'+response+',状态为:'+status+',HTTP状态码为:'+xhr.status);
});

关于回调函数参数的说明:

  • 第一个参数表示服务器返回的数据。
  • 第二个参数表示请求的结果状态,如果请求成功则为success;请求失败则为error。
  • 第三个参数表示XMLHttpRequest对象,该对象有多个属性(其实,前两个参数的值也包含在该对象的属性值中,只不过它们会经常用到,所以单独提出来了)。
3. $.get()和$.post()

$.get()和$.post()是全局方法,无须指定元素,而load()是局部方法,需要一个包含元素的jQuery对象作为前缀。

对于用途而言,load()适合于静态文件的异步获取,而对于需要传递数据到服务器的情况,$.get()和$.post()更加合适。

$.get()方法有四个参数,前面三个参数和load()一样,第四个参数为type,可以指定服务器返回的数据类型:xml、html、script、json、jsonp和text。第一个参数为必选参数,后面三个为可选参数。

说明: 第四个参数可以指定异步请求返回的数据格式,一般情况下,该参数是智能判断的,无须主动设置。如果设置了,则会强制按照指定的类型格式转换。

$.get('test.php?id=1',function(data){ alert(data); });    
// 直接在url后加上要发送的数据,这时就不用通过第二个参数发送数据

$.get('test.php','id=1',function(data){ alert(data); });   
// 通过第二个参数发送数据,数据会自动加到url的后面,第二个参数的格式为字符串(键值对)

$.get('test.php',{id:1},function(data){ alert(data); });   
// 通过第二个参数发送数据,数据会自动加到url的后面,第二个参数的格式为json(键值对)

上面三种写法都可以,实现的功能也一样。请求的方式都是get,返回的数据格式都是html类型的。回调函数中只传递了一个参数,用于获取服务器返回的数据。$.get()中回调函数的用法和load()一样。

$.post()方法也有四个参数,用法和$.get()相同,只不过$.post()不支持url问号传递数据的方式。

$.post('test.php', 'id=1', function(data){ alert(data); });    
// 使用字符串形式的键值对传参,数据会自动转换为http消息实体进行传递

$.post('test.php', {id:1}, function(data){ alert(data); });    
// 使用json传参,数据会自动转换为http消息实体进行传递

第四个参数(指定返回数据的类型格式)的用法:

$.post('test.php','id=1',function(data){ alert(data); },'html');      
// 指定数据格式为html,PHP文件返回的数据是纯文本,默认是html或text

$.post('test.php','id=1',function(data){ alert(data); },'json');
// 请求的是php文件,将文件中的数据强制按照json数据格式转换后返回
// 如果php文件输出的内容为json格式的字符串,则获取的数据是json对象;否则,获取不到内容。

$.post('test.xml',function(data){ alert(data); },'xml');
// 请求的是xml文件,返回的数据是xml对象

$.post('test.json',function(data){ alert(data); });        
// 请求的是json文件,返回的数据是json对象
4. $.getScript() 和 $.getJSON()

jQuery提供了一组用于特定文件异步加载的方法:$.getScript() ,用于加载特定的js文件;$.getJSON(),用于专门加载JSON文件。

$.getJSON() 是专门用于处理json文件的。使用方法和上面的类似。

$.getJSON()('test.json',function(data){ alert(data); });

$.getScript() 用于异步加载js文件,一般只需要一个参数就够了。

有时,我们希望在特定的情况下才加载某个js文件,而不是一开始就把所有的js文件都加载了,这时,我们就可以用到$.getScript()方法。

$.getScript('test.js');
5. 表单序列化

Ajax用的最多的地方是表单操作,但将表单的数据逐一获取,操作起来比较麻烦。为此,jQuery提供了一个表单元素序列化方法serialize()。

$('form').serialize();   
// 返回值为表单元素的序列化字符串,形式如:'username=lisi&password=123'(会对字符串进行一定的编码)

$.ajax({
    url:'test.php',
    type:'POST',
    data:$('form').serialize(),
    success:function(data){
        alert(data);
    }
});

serialize()不仅可以序列化整个表单的内容,还可以单独序列化单选框、复选框和下拉列表等的内容。

$(':radio').serialize();   
// 返回值为键值对的字符串,会进行一定的编码

var str=decodeURIComponent($(':radio').serialize()); console.log(str); 
// 利用decodeURIComponent()函数进行解码

除了serialize(),还有serializeArray()方法,返回的是json对象。

var obj=$(':radio').serializeArray();
alert(obj[0].name+'='+obj[0].value);

$.param()方法,可以将json对象转换为字符串形式的键值对。

var obj={id:1,name:'lisi'};
var str=$.param(obj);
alert(str);
6. ajaxStart()事件和ajaxStop()事件

在用Ajax异步请求数据时,可能会出现请求时间较长的问题,用户就会变得不耐烦而关闭网页。

如果在请求期间能给用户一些提示,如“正在努力加载中…”,用户体验就会好一些。

  • ajaxStart()事件 请求开始时触发
  • ajaxStop()事件 请求结束时触发
// 加载提示的显示和隐藏
$('.loading').ajaxStart(function(){
    $(this).show();
}).ajaxStop(function(){
    $(this).hide();
});

注意: 以上代码在jQuery1.8及以后的版本中不再生效,新版本中,ajaxStart()和ajaxStop()必须绑定在document元素上。

$(document).ajaxStart(function(){
    $(.loading).show();
}).ajaxStop(function(){
    $(.loading).hide();
});

如果请求时间太长,可以设置超时时间。

$.ajax({
    timeout:8000
});

如果某个ajax不想触发上述两个全局事件,可以设置取消。

$.ajax({
    global:false
});
7. 错误处理

当Ajax请求发生错误时,我们可以进行一定的处理。

$.ajax({
    url:'test.php',
    type:'POST',
    data:$('form').serialize(),
    success:function(data){
           alert(data);
    },
    error:function(xhr,errorText,errorType){
           alert(xhr.status+':'+xhr.statusText);
    }
});

$.post()使用error()方法,进行错误处理。

$.post('test.php').error(function(xhr,errorText,errorType){
    alert(xhr.status+':'+xhr.statusText);
});

$.post()还可以使用全局事件ajaxError(),进行错误处理。

// Ajax请求错误时触发该事件
$(document).ajaxError(function(e,xhr,settings,errorType){
    alert(xhr.status+':'+xhr.statusText);
});
8. 和Ajax相关的全局事件

jQuery对于Ajax操作提供了很多全局事件,如ajaxStart()、ajaxStop()、ajaxError(),除了这些,还有一些其他的全局事件。

  • ajaxSend() 发送请求之前触发。
  • ajaxSuccess() 请求成功时触发。对应的局部方法为success()。
  • ajaxComplete() 请求完成后触发。对应的局部方法为complete()。
$(document).ajaxSend(function(){
    alert('发送请求之前触发');
}).ajaxSuccess(function(){
    alert('请求成功时触发');
}).ajaxComplete(function(){
    alert('请求完成后触发');
});

注意: 全局事件都是要绑定在document元素上,所有的Ajax请求都会触发到。而局部方法,只针对某个指定的Ajax请求。

在jQuery1.5版本以后,局部方法success()、error()和complete(),可以用done()、fail()和always()取代。

9. json和jsonp

在同一个域下,$.ajax()异步请求是可以轻松实现的。但如何实现Ajax的跨域访问?(一个服务器的文件,访问另一个服务器中的文件)

如何实现Ajax的跨域访问?有以下几种方式:

这里,都以获取json数据为例。

  • 通过$.ajax()中的参数dataType,设置dataType:’jsonp’。

    $.ajax({
        url:'http://www.li.cc/test.php', // test.php输出的内容为json格式的字符串
        dataType:'jsonp',
        success:function(data){
            alert(data);
        }
    });
  • 通过在url地址中加上一个callback参数。

    $.ajax({
        url:'http://www.li.cc/test.php?callback=?', 
        dataType:'json',
        success:function(data){
            alert(data);
        }
    });
    
    $.getJSON('http://www.li.cc/test.php?callback=?',function(data){
        alert(data);
    });
  • 通过$.ajax()中的参数jsonp,设置jsonp:’callback’。

    $.ajax({
        url:'http://www.li.cc/test.php', 
        jsonp:'callback',
        success:function(data){
            alert(data);
        }
    });
10. jqXHR对象

$.ajax()之类的全局方法,返回的对象就是jqXHR对象。之前,我们讲过的局部方法:success()、complete()和error()就是jqXHR对象调用的。

在jQuery1.5版本以后,局部方法success()、error()和complete(),可以用done()、fail()和always()取代。

获取jqXHR对象。

var jqXHR=$.ajax({
        url:'test.php',
        type:'POST',
        data:$('form').serialize()
    });

jqXHR.success(function(data){
    alert(data);
});

使用jqXHR对象的连缀方式和$.ajax()的传参方式相比,有两大好处:

  • 可连缀操作,可读性大大提高。
  • 可多次执行同一个局部方法。
jqXHR.done(function(data){
    alert(data+'1');
}).done(function(data){
    alert(data+'2');
});

jqXHR.done(function(data){
    alert(data+'3');
});
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值