Ajax 异步通信详解

简介: 本文介绍前端开发中的 Ajax 异步通信

Ajax 异步通信基础


jcLee95 的个人博客

已入驻阿里云博客

邮箱 :291148484@163.com
本文地址
- https://developer.aliyun.com/article/
- https://blog.csdn.net/qq_28550263/article/details/125801370

目 录


1. Ajax 概述

2. Ajax 的使用

3. jQuery 中的 Ajax


1. Ajax 概述

1.1 什么是 Ajax

Ajax 全称为 async javascript and XML,即 异步JavaScript和XML ,它使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。XMLHttpRequest 对象是称为 Ajax(异步 JavaScript 和 XML)的技术的一部分。使用 Ajax 后可以使用 XMLHttpRequest API 在浏览器和服务器之间传递数据,而无需重新加载网页。Ajax 请求由 JavaScript 代码触发,当你的代码向 URL 发送请求后收到响应时,可以触发回调函数来处理响应。因为请求是异步的,所以您的其余代码会在处理请求时继续执行,因此必须使用回调来处理响应。

1.2 Ajax 的优势 和 缺点

从使用来看,Ajax 不需要插件的支持,是需要使用原生的JavaScript。从体验效果上看,使用 Ajax 不需要刷新页面就可以异步地更新页面上地数据,因此用户体验将更好。从服务器角度来看,可以减小服务器带宽地负担,因为用户只需要页面上地一小片数据时,不会再需要重新请求整个页面。

Ajax 目前对搜索引擎不很友好,或者说因为爬虫技术目前无法很好地应对 Ajax 异步数据处理问题,更多地停留在解析页面已经有地数据。即使是 google 和 bing ,在处理异步数据时也不会等待到异步数据全部加载完成。因此为了让网页被搜索引擎捕捉到时,需要做 SEO (搜索引擎优化)。

2. Ajax 的使用

2.1 体验 Jquery 中使用 ajax

$.ajax({
    url: "./xxx.xxx",                    // 请求的地址
    sucess: function(json_str){          // 请求成功后,拿着返回的字符串,一般时json,进一步相应处理
        var arr = JSON.parse(json_str);
        //...
    }
})

2.2 创建一个 Ajxa 对象

我们习惯上将一个 Ajax 对象简称为 xhr,它在不同浏览器中的使用方式有所不同。

2.2.1 IE 浏览器(已经淘汰)

IE9 以下版本

const xhr = new ActiveXObject('Microsoft.XMLHTTP');

IE9及以上版本

const xhr = new XMLHttpRequest();

2.2.2 chrome等浏览器

const xhr = new XMLHttpRequest();

2.3 使用 Ajax 发送请求

2.3.1 配置请求信息

创建 XMLHttpRequest 实例对象后(以下称xhr),可以使用 xhr 的相关方法。在其提供的诸方法中,使用open()方法来配置请求信息:

xhr.open(method, url);
xhr.open(method, url, async);
xhr.open(method, url, async, user);
xhr.open(method, url, async, user, password);

XMLHttpRequest .open()方法用于初始化一个请求代码。XMLHttpRequest .open()方法的参数含义如下:

参数 描述 备注
method 要使用的 HTTP 方法,比如 GET、POST、PUT、DELETE、等。对于非 HTTP(S) URL 被忽略。 必要参数
url 一个 DOMString 表示要向其发送请求的 URL 必要参数
async 一个可选的布尔参数,表示是否异步执行操作,默认为 true。如果值为 false,send() 方法直到收到答复前不会返回。如果 true,已完成事务的通知可供事件监听器使用。如果 multipart 属性为 true 则这个必须为 true,否则将引发异常 可选参数
user 用户名用于认证用途;默认为 null 可选参数
password 可选的密码用于认证用途,默认为 null。 可选参数

2.3.2 配置请求头

使用XMLHttpRequest.setRequestHeader()方法可以设置 HTTP 请求头。该方法必须在 open() 方法和 send() 之间调用。如果多次对同一个请求头赋值,只会生成一个合并了多个值的请求头。其语法格式为:

xhr.setRequestHeader(header, value);

该方法的参数含义如下:

参数 描述
header 属性的名称
value 属性的值

2.3.3 使用send()方法发送请求

XMLHttpRequest.send() 方法用于发送 HTTP 请求。如果是异步请求(默认为异步请求),则此方法会在请求发送后立即返回;如果是同步请求,则此方法直到响应到达后才会返回。XMLHttpRequest.send() 方法接受一个可选的参数,其作为请求主体;如果请求方法是 GET 或者 HEAD,则应将请求主体设置为 null。其格式为:

xhr.send();
xhr.send(ArrayBuffer data);
xhr.send(ArrayBufferView data);
xhr.send(Blob data);
xhr.send(Document data);
xhr.send(DOMString? data);
xhr.send(FormData data);

其中,参数 body 为在 XHR 请求中要发送的数据体,格式上看,它可以是:

  • document: 在这种情况下,它在发送之前被序列化。
  • XMLHttpRequestBodyInit:是从 per the Fetch spec (规范中)可以是 Blob, BufferSource, FormData, URLSearchParams, 或者 USVString 对象。
  • null

默认值:如果 body 没有指定值,则默认值为 null

2.3.4 事件监听与处理

作为 XMLHttpRequest 实例的属性之一,所有浏览器都支持 onreadystatechange。后来许多浏览器实现了一些额外的事件(onload、onerror、onprogress 等)更多现代浏览器,包括 Firefox,除了可以设置 on* 属性外,也提供标准的监听器 addEventListener() API 来监听 XMLHttpRequest 事件。

2.3.4.1 关于 EventTarget

EventTarget 是一个 DOM 接口,由可以接收事件、并且可以创建侦听器的对象实现。Element,document 和 window 是最常见的 event targets 。本文中的XMLHttpRequest 对象也可以作为 event targets。

2.3.4.2 注册 事件监听器

使用 EventTarget.addEventListener() 方法将指定的监听器注册到 EventTarget 上。本节中,监听的是 XMLHttpRequest 事件,以一个 xhr 为 target。addEventListener 方法的语法格式为:

// 此处 target 即 xhr
xhr.addEventListener(type, listener, options);
xhr.addEventListener(type, listener, useCapture);

2.3.4.3 删除 事件监听器

EventTarget.removeEventListener() 方法用于从EventTarget 中删除事件监听器。该方法的语法格式为:

target.removeEventListener(type, listener[, options]);
target.removeEventListener(type, listener[, useCapture]);

其中参数:

参数 描述 说明
type 一个字符串,表示需要移除的事件类型,如 “click” 必须参数
listener 需要从目标事件移除的 EventListener 函数 必须参数
options 一个指定事件侦听器特征的可选对象。 可选参数
useCapture 指定需要移除的 EventListener 函数是否为捕获监听器。如果无此参数,默认值为 false 可选参数

参数 options 的可选项有:

  • capture: 一个 Boolean 表示这个类型的事件将会被派遣到已经注册的侦听器,然后再派遣到 DOM 树中它下面的任何 EventTarget。
  • mozSystemGroup(非标准): 仅可运行于 XBL 或者 Firefox Chrome,它是一个 Boolean,用于定义是否将侦听器添加到系统组。

2.3.4.4 分派 事件到目标对象

EventTarget.dispatchEvent() 方法用于将事件分派到此 EventTarget。当 EventTarget 为 XMLHttpRequest 对象时,即分派到你创建的 xhr 对象。dispatchEvent() 方法的语法格式为:

cancelled = !target.dispatchEvent(event)

其中参数如下:

参数 描述
event 是要被派发的事件对象
target 被初始化使用和决定触发事件目标

2.3.5 示范1:发起 GET 请求

// 1. 创建 xht 对象
var xhr = new XMLHttpRequest();
// 2. 配置请求参数
xhr.open('GET', '/server', true);
// 3. 定义回调
xhr.onload = function () {
   // 请求结束后,在此处写处理代码
};
// 4. 执行请求,可以多次调用 send方法 执行不同请求
xhr.send(null);
xhr.send('string');
xhr.send(new Blob());
xhr.send(new Int8Array());
xhr.send(document);
// xhr.send(...)

2.3.6 示范2:发起 POST 请求

// 1. 创建 xht 对象
var xhr = new XMLHttpRequest();
// 2. 配置请求参数
xhr.open("POST", '/server', true);
//发送合适的请求头信息
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
// 3. 定义回调
xhr.onload = function () {
    // 请求结束后,在此处写处理代码
};
// 4. 执行请求,可以多次调用 send方法 执行不同请求
xhr.send("foo=bar&lorem=ipsum");
xhr.send('string');
xhr.send(new Blob());
xhr.send(new Int8Array());
xhr.send(document);
// xhr.send(...)

2.3.7 同步与异步

2.3.8 请求的终止

XMLHttpRequest.abort() 方法 用于终止一个已被发出的请求,其语法格式为:

xhrInstance.abort();

例如:

var xhr = new XMLHttpRequest();
xhr.open('GET', '/server', true);
xhr.send();
xhr.send();
if (YOUR_CONDITION) {
  xhr.abort();
}

2.4 Ajax 事件

事件 描述 说明
abort 当 request 被停止时触发,例如当程序调用 XMLHttpRequest.abort() 时 也可以使用 onabort 属性。
error 当 request 遭遇错误时触发 也可以使用 onerror 属性
load XMLHttpRequest请求成功完成时触发 也可以使用 onload 属性。
loadend 当请求结束时触发,无论请求成功 ( load) 还是失败 (abort 或 error) 也可以使用 onloadend 属性。
loadstart 接收到响应数据时触发 也可以使用 onloadstart 属性。
progress 当请求接收到更多数据时,周期性地触发 也可以使用 onprogress 属性。
timeout 在预设时间内没有接收到响应时触发 也可以使用 ontimeout 属性。

jQuery 中的 Ajax事件

Ajax请求产生许多不同的事件,您可以订阅这些事件。有两种类型的事件:Local 事件Global 事件。这是Ajax事件的完整列表,按照事件被触发的顺序排列。每个Ajax请求都会触发缩进事件(除非设置了全局选项)。ajaxStart 和 ajaxStop事件是与所有Ajax请求相关的事件。

事件 类型 描述
ajaxStart Global 事件 如果启动了一个Ajax请求,并且当前没有其他Ajax请求正在运行,则会触发此事件。
  • beforeSend
Local 事件 这个事件在Ajax请求启动之前触发,允许您修改XMLHttpRequest对象(如果需要,设置附加的头)。)
  • ajaxSend
Global事件 这个全局事件也是在请求运行之前触发的。
  • success
Local 事件 只有当请求成功时(服务器没有错误,数据没有错误),才会调用此事件。
  • ajaxSuccess
Global 事件 只有当请求成功时,才会调用此事件。
  • error
Local 事件 只有当请求出错时,才会调用此事件(一个请求不能同时有错误和成功的回调)。
  • ajaxError
Global 事件 此全局事件的行为与本地错误事件相同。
  • complete
Local 事件 无论请求是否成功,都会调用此事件。即使是同步请求,您也总是会收到完整的回调。
  • ajaxComplete
Global 事件 该事件的行为与complete事件相同,每次Ajax请求完成时都会被触发。
ajaxStop Global 事件 如果不再有Ajax请求被处理,就会触发这个全局事件。

3. jQuery 中的 Ajax

3.1 概述

从上文我们知道不同的浏览器以不同的方式实现 Ajax API,这意味着开发人员必须考虑所有不同的浏览器以确保 Ajax 可以通用,因此我们开发者更希望有一种统一的Ajax调用方式,恰好 jQuery 提供了 Ajax 支持,可以抽象出令人痛苦的浏览器差异,这就是为什么我们为什么要在这里介绍 jQuery 中的 Ajax。jQuery 既提供了一个功能齐全的$.ajax()方法,也提供了简单的便捷方法,例如$.get()$.getScript()$.getJSON()$.post()$().load()jQuery 对这些 Ajax 的封装分为三个层次:

层次 描述
第1层 $.ajax()
第2层 $.load()$.get()$.post()
第3层 $.getScript()$.getJSON()

3.2 $.ajax() 方法

3.2.1 概述

$.ajax()方法是一种强大而直接的创建 Ajax 请求的方法,是 jQuery 中提供的一个选项式API。它需要一个配置对象,其中包含 jQuery 完成请求所需的所有指令。这种方法提供了指定请求 成功失败 回调的能力,这启发了 ECMAScriptPromise 的诞生。该方法的语法格式如下:

jQuery.ajax( url [, settings ] )
jQuery.ajax( [settings ] )

其中参数:

参数 类型 描述
url string 一个字符串,包含请求发送到的URL。
settings object 配置Ajax请求的一组键/值对。所有设置都是可选的。可以为任何带$的选项设置默认值。ajaxSetup()。有关所有设置的完整列表,请参见下面的jQuery.ajax( settings)。

3.2.2 关于 ajax() 方法的设置

设置项 类型 描述
accepts object 是一组将 给定数据类型 映射到其 MIME类型 的键/值对,在 Accept 请求头 中发送。这个请求头将告诉服务器它将接受什么样的响应作为回报。
注意您需要在 converters 中为此类型指定一个补充条目,这样才能正常工作。
参考【eg2】
async boolean 默认情况下,所有请求都是异步发送的(即默认设置为true)。如果需要同步请求,请将此选项设置为false
跨域请求和数据类型:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。
从jQuery 1.8开始,async: falsejqXHR ( $.Deferred ) 已被否决;您必须使用 success/error/complete 回调选项,而不是 jqXHR 对象的相应方法,如 jqXHR.done()
beforeSend function
( jqXHRjqXHRobject 设置 )
一个请求前回调函数,可用于在发送前修改jqXHR(在jQuery 1.4.x,XMLHTTPRequest中)对象。使用它来设置自定义标题等。
jqXHRsettings 对象作为参数传递。这是一个 Ajax事件。在beforeSend函数中返回false将取消请求。
从jQuery 1.5开始,无论请求的类型是什么,beforeSend选项都会被调用。
cache boolean 如果设置为 false,它将强制浏览器不缓存请求的页面。
【注意】:将cache 设置为 false 只能正确处理 HEADGET 请求。它通过将 “_={timestamp}” 附加到 GET 参数来工作。
除了在 IE8 中当POST 到一个已经被 GET 请求的 URL 时,其他类型的请求不需要该参数。
complete function
( jqXHRjqXHR, 字符串状态文本 )
请求完成时要调用的函数(在执行成功和错误回调后)。
该函数传递两个参数:jqXHR(在jQuery 1.4.x,XMLHTTPRequest中)对象 和 一个对请求状态进行分类的字符串(successnotmodifiednocontenterrortimeoutabortparsererror)。
从jQuery 1.5开始,完整的设置可以接受一组函数。每个函数将被依次调用。这是一个Ajax事件。
contents object 字符串/正则表达式对的对象,在给定响应的内容类型的情况下,确定jQuery将如何解析响应。
contentType booleanstring 向服务器发送数据时,使用此内容类型。
默认为 ”application/x-www-form-urlencoded;charset=UTF-8”,这对于大多数情况来说是合适的。如果你显式地将内容类型传递给 $”.ajax(),那么它总是被发送到服务器(即使没有数据被发送)。
从jQuery 1.6开始,您可以传递false来告诉jQuery不要设置任何内容类型头。
【注意】:
  • W3C XMLHttpRequest规范规定字符集总是UTF-8;指定另一个字符集不会强制浏览器更改编码。
  • 对于跨域请求,将内容类型设置为除 application/x-www-form-urlencodedmultipart/form-datatext/plain 之外的任何内容都会触发浏览器向服务器发送预检选项请求。
    context object 这个对象将是所有Ajax相关回调的上下文。默认情况下,上下文是一个表示调用中使用的Ajax设置的对象( $.ajaxSettings 与传递给 $.ajax 的设置合并)。
    参考:【eg3】
    converters object 包含数据类型到数据类型转换器的对象。每个转换器的值都是一个函数,它返回响应的转换值。
    默认值为:{"* text": window.String, "text html": true, "text json": jQuery.parseJSON, "text xml": jQuery.parseXML}
    crossDomain boolean 如果希望在同一个域上强制跨域请求(如JSONP ),请将crossDomain的值设置为true。例如,这允许服务器端重定向到另一个域。
    对于同源请求,默认为false。对于跨域请求,默认为true
    data objectstring 或者 Array 要发送到服务器的数据。
    如果 HTTP方法 不能有实体,比如GET,那么数据将被附加到URL后面。
    当数据是对象时,jQuery从对象的 键值对 生成数据字符串,除非 processData 选项设置为 false。例如,{ a: "bc", d: "e,f" } 转换为字符串 "a=bc&d=e%2Cf" 。如果值是一个数组,jQuery会根据 traditional 设置的值用相同的键序列化多个值。例如,{ a: [1,2] } 将成为字符串 "a%5B%5D=1&a%5B%5D=2" ,默认设置为 "traditional: false"
    当数据作为字符串传递时,它应该已经使用正确的contentType 编码进行了编码,默认情况下是 application/x-www-form-urlencoded
    dataType: "json"dataType: "jsonp" 的请求中,如果字符串包 含双问号(??) 或 单问号(?) 在查询字符串中,它被jQuery生成的值替换,该值对于页面上的库的每个副本都是唯一的(例如:jQuery21406515378922229067_1479880736745)。
    dataFilter function => any 用于处理XMLHttpRequest的原始响应数据的函数。
    这是一个过滤响应的预过滤功能,你应该返回清理过的数据。该函数接受两个参数:从服务器返回的 原始数据 和 'dataType' 参数。
    dataType string 您期望从服务器返回的数据类型。如果没有指定,jQuery将尝试根据响应的MIME类型进行推断(XML MIME类型将产生XML,在1.4 JSON中将产生JavaScript对象,在1.4 script中将执行脚本,其他任何内容都将作为字符串返回)。
    error function 请求失败时要调用的函数。
    该函数接收三个参数:
    • jqXHR(在jQuery 1.4.x中,XMLHttpRequest)对象
    • 描述所发生错误类型的字符串
    • 和可选的异常对象(如果发生了异常)。
    其中:
    • 第二个参数的可能值(除了null之外)是"timeout""error""abort"、 和 "parsererror"
    • 当HTTP错误发生时,errorThrown 接收HTTP状态的文本部分,如 Not FoundInternal Server Error (在HTTP/2中,它可能是一个空字符串)
    • 从jQuery 1.5开始,错误设置可以接受一个函数数组。每个函数将被依次调用。
    注意:跨域脚本和跨域JSONP请求不会调用此处理程序。这是一个 Ajax事件
    global boolean 是否为此请求触发全局Ajax事件处理程序。默认值为true。
    可通过设置为false以防止触发像ajaxStartajaxStop这样的全局处理程序。这可以用来控制各种 Ajax事件
    headers object 使用 XMLHttpRequest 传输随请求一起发送的附加标头 键值对 的对象。总是添加头X-Requested-With:XMLHttpRequest,但是它的默认XMLHttpRequest 值可以在这里更改。还可以从beforeSend 函数中覆盖 headers 设置中的值。
    ifModified boolean 仅当自上次请求后响应发生变化时,才允许请求成功。这是通过检查最后修改的报头来完成的。默认值为false,忽略header
    在jQuery 1.4中,这种技术还检查服务器指定的"etag"来捕捉未修改的数据。
    isLocal boolean 允许当前环境被识别为"local"(例如文件系统),即使默认情况下jQuery并不这样认为。
    以下协议目前被认为是 local 协议:file*-extension, 和 widget。如果isLocal设置需要修改,建议在$.ajaxSetup()方法中进行。
    jsonp stringboolean 在JSONP请求中覆盖回调函数名。在'callback=?'中将使用该值代替'callback'中查询 url字符串的一部分。因此 {jsonp:'onJSONPLoad'}将导致'onJSONPLoad=?'传递给服务器。
    从jQuery 1.5开始,将jsonp选项设置为false会阻止jQuery添加 "?callback" 字符串到URL或试图使用=?以转换类型。在这种情况下,还应该显式设置 jsonpCallback 设置。比如{ jsonp: false, jsonpCallback: "callbackName" }
    如果你不信任Ajax请求的目标,出于安全原因,可以考虑将jsonp属性设置为false
    jsonpCallback stringfunction 为 JSONP请求 指定回调函数名。将使用该值代替jQuery自动生成的随机名称。
    最好让jQuery生成一个唯一的名称,因为这样可以更容易地管理请求并提供回调和错误处理。
    当您想要启用更好的GET请求的浏览器缓存时,您可能想要指定回调。
    从jQuery 1.5开始,您还可以使用一个函数来进行这种设置,在这种情况下,jsonpCallback 的值被设置为该函数的返回值。
    method string 用于请求的HTTP方法(例如"POST""GET""PUT")。
    默认为 "GET"
    mimeType string 覆盖XHR mime类型的mime类型。
    password string 用于XMLHttpRequest 以响应HTTP访问身份验证请求的密码。
    processData boolean 默认情况下,作为对象传递给data选项的数据(从技术上讲,除了字符串以外的任何数据)将被处理并转换为查询字符串,符合默认的内容类型"application/x-www-form-urlencoded"。如果要发送DOMDocument 或其他未处理的数据,请将此选项设置为false
    默认为true
    scriptAttrs object 定义一个带有附加属性的对象,用于scriptjsonp 请求。键表示属性的名称,值是属性的值。
    如果提供了此对象,它将强制使用脚本标记传输。
    例如,这可用于设置 nonceintegritycrossorigin属性,以满足内容安全策略要求。
    scriptCharset string 仅在使用"script"传输时适用。在请求中使用的脚本标记上设置charset属性。当本地页面上的字符集与远程脚本上的字符集不同时使用。或者,可以在scriptAttrs中指定charset属性,这也将确保使用"script"传输。
    statusCode object 一个由数字HTTP代码和函数组成的对象,当响应具有相应的代码时,将调用这些代码和函数。
    如果请求成功,状态代码函数将采用与成功回调相同的参数;如果它导致一个错误(包括3xx重定向),它们将采用与错误回调相同的参数。
    参考:【eg4】
    success function 请求成功时要调用的函数。
    该函数传递三个参数:
    • 从服务器返回的数据,根据dataType参数或dataFilter回调函数(如果指定)进行格式化;
    • 描述状态的字符串;
    • jqXHR(在jQuery 1.4.x,XMLHttpRequest中)对象。

    从jQuery 1.5开始,success设置可以接受一组函数。每个函数将被依次调用。这是一个Ajax事件。
    timeout number 为请求设置超时时间(以毫秒为单位),值为0表示没有超时。
    这将覆盖任何用 $.ajaxSetup()设置的全局超时。超时期限从发出 $.ajax 调用时开始;
    如果其他几个请求正在进行,而浏览器没有可用的连接,则请求可能会在发送之前超时。
    traditional boolean 如果您希望使用传统样式的参数序列化,请将此项设置为true
    type string 方法的别名。如果您使用的是1.9.0之前的jQuery版本,应该使用type
    url string 一个字符串,包含请求发送到的URL。
    username string 用于XMLHttpRequest以响应HTTP访问身份验证请求的用户名。
    xhr function 用于创建XMLHttpRequest对象的回调。默认为ActiveXObject(如果可用的话),否则为XMLHttpRequest。重写以提供自己的XMLHttpRequest实现或对工厂的增强。
    IE中若可用则默认为ActiveXObject,否则都为XMLHttpRequest
    xhrFields object 要在本机XHR对象上设置的 fieldName-fieldValue 的对象。例如如果需要,可以使用它将跨域请求的withCredentials设置为true
    参考:【eg5】

    3.2.3 更多例子

    【eg1】

    // 使用核心 $.ajax() 方法
    $.ajax({
        // 当前请求的 URL
        url: "post.php",
        // 要发送的数据 (将被转换为查询字符串)
        data: {
            id: 123
        },
        // 无论这是POST还是GET请求
        type: "GET",
        // 我们期望返回的数据类型
        dataType : "json",
    })
      // 请求成功(完成)时运行的代码
      // 响应被传递给该函数
      .done(function( json ) {
         $( "<h1>" ).text( json.title ).appendTo( "body" );
         $( "<div class=\"content\">").html( json.html ).appendTo( "body" );
      })
      // 请求失败时要运行的代码
      // 原始请求和状态代码被传递给该函数
      .fail(function( xhr, status, errorThrown ) {
        alert( "Sorry, there was a problem!" );
        console.log( "Error: " + errorThrown );
        console.log( "Status: " + status );
        console.dir( xhr );
      })
      // 不管成功或失败都要运行的代码
      .always(function( xhr, status ) {
        alert( "The request is complete!" );
      });

    【eg2】:

    $.ajax({
      // 请求头将告诉服务器它将接受什么样的响应作为回应
      accepts: {
        mycustomtype: 'application/x-some-custom-type'
      },
      // 有关如何反序列化 `mycustomtype` 的说明
      converters: {
        'text mycustomtype': function(result) {
          // Do Stuff
          return newresult;
        }
      },
      // 期待一个从服务器返回的 `mycustomtype`
      dataType: 'mycustomtype'
    });

    【eg3】

    指定一个DOM元素作为上下文将使它成为请求的完整回调的上下文:

    $.ajax({
      url: "test.html",
      context: document.body
    }).done(function() {
      $( this ).addClass( "done" );
    });

    【eg4】

    当响应状态为404时,将发出以下警报:

    $.ajax({
      statusCode: {
        404: function() {
          alert( "page not found" );
        }
      }
    });

    【eg5】

    $.ajax({
       url: a_cross_domain_url,
       xhrFields: {
          withCredentials: true
       }
    });

    3.3 $.load() 方法

    3.3.1 概述

    load() 方法用于从web 服务器上获取静态的数据文件,能载入远程 HTML 代码并将其插入到 DOM 中,其语法格式为:

    $.load( url [, data ] [, complete ] )

    其中参数:

    参数 类型 描述
    url string 包含请求发送到的 URL 的字符串
    data objectstring 与请求一起发送到服务器的普通对象或字符串,一般是键值对数据
    complete function (字符串响应文本, 字符串状态文本, jqXHR jqXHR) 请求完成时执行的回调函数,不论成功或者失败都调用

    这个方法是从服务器获取数据的最简单的方法。类似于 $.get(url, data, success), 其区别在于 load() 是一个方法而不是全局函数,并且它有一个 隐式回调函数。当检测到成功响应时(即,当 textStatussuccessnotmodified时)。load() 将匹配元素的HTML内容 置为 返回的数据。如果选择器没有匹配的元素,则Ajax请求将不会被发送。

    使用该方法时,如果传入的 data 为一个对象时将使用POST 请求,否则使用 GET 请求。

    3.3.2 回调函数

    3.3.3 页面片段的加载

    $.get() 不同, .load() 方法允许我们指定要插入的远程文档的一部分。这是通过url参数的特殊语法实现的。如果字符串中包含一个或多个空格字符,则第一个空格后面的字符串部分被认定为 jQuery选择器,它确定要加载的内容。

    jQuery使用浏览器的. innerHTML 属性解析检索到的文档,并将其插入到当前文档中。在这个过程中,浏览器通常会过滤文档中的元素,比如 <html><title><head> 元素。因此,由 .load()方法可能与通过浏览器直接检索的文档不完全相同。

    3.3.4 脚本的执行

    当使用不带后缀选择器表达式的 URL 调用 . load() 时,内容会在删除脚本之前传递到 . html()。这将在脚本块被丢弃之前执行它们。但是,如果调用 .load() 时在 URL 后面附加了一个选择器表达式,那么脚本会在 DOM 更新之前被删除,因此不会被执行。

    比如下面作为文档的一部分加载到#a中的任何JavaScript都将成功执行:

    $( "#a" ).load( "xxx.html" );

    而下面被加载到#b中的文档中的脚本块被剥离并且不被执行:

    $( "#b" ).load( "xxx.html #target" );

    例:将另一页的列表项加载到有序列表中

    <!doctype html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <title>demo</title>
      <script src="/static/js/jquery-3.5.0.js"></script>
      <script>
        $( "#new-projects" ).load( "xxx.html #projects li" );
      </script>
    </head>
    <body>
     <ol id="new-projects"></ol>
    </body>
    </html>

    其中上面用到的,xxx.html 的内容为:

    <!doctype html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <title>xxx Page</title>
    </head>
    <body>
    <h1>Popular jQuery Projects</h1>
    <ul id="projects">
      <li>jQuery</li>
      <li>jQuery UI</li>
      <li>jQuery Mobile</li>
      <li>QUnit</li>
      <li>Sizzle</li>
    </ul>
    </body>
    </html>

    注:由于浏览器安全限制,大多数“Ajax”请求都遵循同源策略。请求无法从不同的域、子域、端口或协议成功检索数据。

    3.4 $.get() 方法 和 $.post() 方法

    这两种在客户端和服务器端进行请求-响应的常用方法是:GET 和 POST。比较而言,GET 和 POST请求方式都可以用来提交数据,只不过不同的是 GET 提交参数一般显示在 URL 上,POST 通过表单提交不会显示在 URL 上,因此 POST 更具隐蔽性。GET 请求保留在浏览器历史记录中,而POST 请求不会保留在浏览器历史记录中。由于GET 提交参数一般显示在 URL 上,因此GET 请求有长度限制,而POST 请求对数据长度没有要求。

    目录
    相关文章
    |
    6月前
    |
    前端开发 JavaScript Java
    使用Ajax进行异步交互:提升Java Web应用的用户体验
    【4月更文挑战第3天】Ajax技术在Web开发中提升UX,通过与服务器异步交互实现页面局部更新,无需完整刷新。核心组件包括XMLHttpRequest、JavaScript、HTML/CSS及服务器端脚本。在Java Web应用中,可使用原生JavaScript或框架如jQuery、AngularJS实现Ajax请求。Ajax减少页面刷新,实现实时数据更新,即时表单验证和动态UI,显著改善用户体验,是现代Web开发不可或缺的一部分。
    85 0
    |
    6月前
    |
    前端开发 JavaScript API
    Ajax技术的秘密揭秘:异步传输,高效交互
    Ajax技术的秘密揭秘:异步传输,高效交互
    |
    3月前
    |
    前端开发 JavaScript Java
    Ajax进行异步交互:提升Java Web应用的用户体验
    Ajax 技术允许在不重载整个页面的情况下与服务器异步交换数据,通过局部更新页面内容,极大提升了 Java Web 应用的响应速度和用户体验。本文介绍 Ajax 的基本原理及其实现方式,包括使用 XMLHttpRequest 对象发送请求、处理响应数据,并在 Java Web 应用中集成 Ajax。此外,还探讨了 Ajax 如何通过减少页面刷新、实时数据更新等功能改善用户体验。
    73 3
    |
    5月前
    |
    XML 移动开发 前端开发
    JS设置Ajax为同步或异步
    JS设置Ajax为同步或异步
    67 0
    |
    5月前
    1.ajax同步和异步区别 2.post和get区别
    1.ajax同步和异步区别 2.post和get区别
    31 0
    |
    6月前
    |
    XML JSON 前端开发
    学习Ajax使用异步对象发送请求
    Ajax,全称Asynchronous JavaScript and XML(异步JavaScript和XML),是一种用于创建更好、更快以及交互性更强的Web应用程序的技术。
    68 3
    |
    6月前
    |
    前端开发 JavaScript PHP
    【PHP开发专栏】jQuery与PHP实现Ajax通信
    【4月更文挑战第30天】本文介绍了使用jQuery和PHP实现Ajax通信的步骤。首先,讲解了Ajax的基础和jQuery简化Ajax操作的概念。接着,展示了如何使用jQuery的`$.get()`、`$.post()`和`$.ajax()`方法发送GET和POST请求,以及如何控制请求细节。在PHP端,讨论了接收和响应Ajax请求的方法,包括处理数据、设置响应类型和错误处理。结合jQuery与PHP,开发者能实现高效、无缝的异步数据传输,提升Web应用的用户体验。
    124 1
    |
    6月前
    |
    JSON 前端开发 JavaScript
    探秘 AJAX:让网页变得更智能的异步技术(下)
    探秘 AJAX:让网页变得更智能的异步技术(下)
    探秘 AJAX:让网页变得更智能的异步技术(下)
    |
    6月前
    |
    XML 前端开发 JavaScript
    探秘 AJAX:让网页变得更智能的异步技术(上)
    探秘 AJAX:让网页变得更智能的异步技术(上)
    探秘 AJAX:让网页变得更智能的异步技术(上)
    |
    前端开发 JavaScript 关系型数据库
    宝塔设置PHP定时任务实战记录(定时任务、ajax异步刷新API、shell脚本、访问url)
    宝塔设置PHP定时任务实战记录(定时任务、ajax异步刷新API、shell脚本、访问url)
    748 0