学编程,来源栈;先学习,再交钱
当前系列: Bootstrap和JQuery 修改讲义

$.ajax()

最底层最全面的JQuery实现,传入一个options对象,可包含:

  • 核心参数:url,ajax请求的网址
  • 一系列的callback函数,按执行顺序依次为:
    1. beforeSend:$.ajax()方法调用之后,ajax请求发送之前,一般用于提示或防重复提交
    2. success:ajax请求成功完成,客户端获得请求结果
    3. error:服务器端未能成功返回请求结果。推荐总是使用,弹出错误提示(尤其是开发调试时)
    4. complete:无论成功失败,Ajax请求完成之后,通常用于恢复DOM状态
    以上详见下文
  • 其他一些参数,按使用频率由高到低排列:
    • method/type:GET/POST/PUT/DELETE……
    • data:提交到服务器的对象
    • contentType:request的类型,默认JQuery会自行转换,也就是说无论url参数格式的字符串,还是JSON格式的对象,都无须特别声明
    • dataType:response的类型,默认由JQuery自动解析,可指定为:text/html/json……
    • cache:是否缓存请求结果,默认true
    • async:是否异步,默认为true,强烈不推荐更改为false
$.ajax({
    url: "/Keyword1.html",
    method: "GET",  //或者POST
    success:function(data){},
})

演示:JQuery为请求自动添加了X-Requested-With: XMLHttpRequest

success

回调函数中的参数data

  • 如果返回的是JSON,直接将其作为对象使用,比如:
    success: function (data) {
        console.log('name:' + data.name);
    }
  • 如果返回的是HTML片段,data被视为string类型。可以直接将其作为html()内容嵌入到当前页面:
    success: function (data) {
        $('#ajaxContainer').html(data);

data再处理

有时候我们可能需要在返回的HTML片段上绑定事件等……

可以在success回调函数中(@想一想@:为什么要强调这个?不要将事件绑定写在$.ajax()之外):

  1. 以“客户端容器”为基准继续:
    success: function (data) {
        $('#ajaxContainer').html(data).find('span').click(function(){
            console.log($(this).text());
  2. 但是,有时候,容器中有一些事先的干扰,比如div中已有一个span
    <div style="border: 1px dashed; padding: 10px;" id="ajaxContainer">
        <span>之前的span</span>
    </div>
    这时候只能使用append(),但更关键的是:find('span')会包含“之前的span”,这不是我们所期望的结果。所以这时候的解决方案是:讲data转换成JQuery对象后,对$data进行操作:
    success: function (data) {
        let $data = $(data);
        $data.siblings('span').click(function(){
            console.log($(this).text());
        });    //@想一想@:这里能不能连缀?
        $data.appendTo($('#ajaxContainer'));
    },

但是,采用上述第2种方法时,如果data的HTML结构:演示

  • 是闭合的、有根节点的,完整的DOM树结构,可以使用find()查找data中的HTML元素
    $data.find('span').click(function () {
  • 否则,就只能使用siblings(),感觉好像有点奇怪?
    $data.siblings('span').click(function () {

error

和原生的JavaScript处理Ajax不同,error是当服务器返回错误代码信息时触发(这才正常!),比如:

  • 写错了url:404
  • 服务器bug抛异常:500
  • 权限不足禁止访问:403
  • ……

error的回调函数可以有三个参数:

  • jqXHR:JQuery XmlHttpRequest,被JQuery封装的Ajax请求核心对象
  • textStatus:error code对应的文本描述
  • errorThrown:字符串

建议总是将error处理函数附上!尤其是调试时,可以封装一个专门的AjaxError()方法,发布时注释……

success: function (data) {
    //....
},
error: ajaxError
    })
})

function ajaxError(jqXHR, textStatus, errorThrown) {
    console.log(errorThrown);
}

禁止重复提交

这就需要用到:

  • beforeSend:禁用掉按钮
  • complete:恢复按钮

但是,回调函数中能直接使用this指代发起Ajax请求的按钮!(演示,具体的原理详见:ES进阶之百变this)

有两种解决方案:

  1. 使用event.target
    beforeSend: function(){
        $(event.target).prop('disabled',true);
  2. 在事件开始用一个变量存储$(this),
    $('button').click(function (event) {
        let $trigger = $(this);
    供其后使用
    complete:function(){
        $trigger.prop('disabled',false);

注意:a标签不能disabled的(disabled无效),所以如果确实只能由a标签发起请求的话,可以使用hide()和show()


$.get()

以GET方式发送Ajax请求,获取响应,自定义callback函数处理

//直接传入url和success之后的回调函数
$.get("/keyword1.html",  function (data) {


$.post()

同get,但使用POST发起请求,通常会要求带data(第二个参数)。可以使用:

  • 原生的JavaScript对象:
    $.post("/keyword1.html",
        {
            name:'fg',
            age:18
        },
  • 字符串形式的键值对:
    $.post("/keyword1.html",
        "name=fg&age=18",

如果要获取整个form表单数据,我们可以使用JQuery的:

$.post("/keyword1.html",            
    $('form').serialize(),

以上F12-网络演示,success的回调函数无法被击中

文件上传

文件内容本身的处理同原生JavaScript的处理

演示:$.post()报错。

processData

JQuery的Ajax方法,默认会对数据进行处理(process),比如解析原生JavaScript对象,设定HTTP请求头的content-type等。

但文件上传时,恰恰是不需要它自作主张的!

所以我们只能使用$.ajax()方法,在其options参数中设定:

processData: false, contentType: false,

F12演示:文件内容能够上传


$(selector).load()

将Ajax请求的结果直接填充到selector确定的DOM元素

注意:异步和callback,在请求完成(complete,不是成功success)后调用:

  •         alert('加载开始!');
            $('div').load("/WebApi/GetLatestChats", function (data) {
                alert('加载中……');
            });
            alert('加载结束!');


其他方法

由$.引导的“静态”方法:

  • $.trim():字符串删除前后空白
  • $.isXXX():判断数据是不是某种类型
  • $.now():获取当前时间
  • $.parseXXX():对数据进行解析(转化成XXX格式)
  • $.unique():取出数组中重复元素
  • ……

遍历JQuery对象中所有元素的each()方法:

$('p').each(function(index,element){
    console.log(index);
    console.log(element);  //element是原生DOM对象了
})

在完成ES进阶课程后,试着学习阅读源代码……


作业

利用JQuery的$.ajax()及其简写方法,重做之前Ajax的作业。

学习笔记
源栈学历
键盘敲烂,月薪过万作业不做,等于没学

作业

觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 Bootstrap和JQuery 中继续学习:

多快好省!前端后端,线上线下,名师精讲

  • 先学习,后付费;
  • 不满意,不要钱。
  • 编程培训班,我就选源栈

更多了解 加:

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧

公众号:源栈一起帮

二维码