首页 前端知识 jQuery中的ajax

jQuery中的ajax

2024-03-07 08:03:42 前端知识 前端哥 595 453 我要收藏

7.jQuery中的AJAX

1. 体验AJAX

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>查看手机归属地</title>
<script src="js/jquery.min.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<form >
手机号码:<input type="text" id="phone" />
<br><button type="button">查找</button>
</form>
<hr>
<div>
<p>你的手机归属地:<span></span></p>
</div>
<script>
$(":button").click(function(){
var phone = $("#phone").val();
$.ajax({
url:"https://api.asilu.com/phone/",
data:{"phone":phone},
dataType: "jsonp",
success:function(rs){
$("div span").text(rs.province+"省"+rs.city+"市, 运营商:"+rs.sp)
}
})
})
</script>
</body>
</html>
复制

2. 原生AJAX概念

AJAX 全称为“Asynchronous JavaScript And XML”(异步 JavaScript 和 XML),是指一种创建交互 式网页应用的开发技术。

基于web2.0标准,使用XMLHttpRequest进行异步数据交互。

传统的 Web 应用中,用户对页面中的表单进行填写,提交表单后向 Web 服务器发送一个请求,服务 器接收此请求并处理其中的表单,返回一个新的网页。

AJAX的优势

1.无刷新与服务器端进行通信,

2.页面局部刷新

优秀的用户体验 ,提高 Web 程序的性能 ,减轻服务器和带宽的负担

AJAX 的不足

破坏浏览器“前进”、“后退”按钮的正常功能

对搜索引擎的支持不足 (SEO)

跨域问题

2.1 前置基础:

​ 1. 动态DOM操作

​ 2. xml|json

​ 3.http

​ 是一个通信协议

​ 两部份(请求&响应)

​ 请求报文:(4部份组成)

3 次请求

已传输3.3 kB

99.8 kB 条资源

完成:30 ms

DOMContentLoaded:72 ms

加载:70 ms

标头

负载

预览

响应

发起程序

计时

Cookie

  1. 常规
  2. 响应头 (11)
  3. 请求标头已分析视图
请求行:method(请求方法,如:get|post) url(请求地址,如:/s?ie=utf-8) protocol(协议,如HTTP/1.1)
请求头: 主机,如:(Host:baidu.com)
客户端数据,如:(Cookie:userName=mach)
请求内容类型,如:(Content-type:appliction/x-www-form-urlencoded)
引擎标识,如:(User-Agent:Chrome 107
空行:
请求体: 如果是get这里是空的,post是有请求参数的,如:(“userName=admin&password=888)
复制

​ 响应报文:(4部份组成)

响应行:scheme(协议,如HTTP/1.1) 响应状态码(如:200) 响应状态文本(如:OK)
响应头:
Content-type:text/html; charset=utf-8
Content-length:1024
空行:
响应体: 这里是响应内容如:<html>
<head>...</head>
<body>
<p>这是一个页面
</body>
</html>
复制

在这里插入图片描述

2.2 原生AJAX,上代码

准备两个文件

​ 1.TestServer.html

说明:这个AJAX请求的服务器页面,响应的页面类型为text/html;内容如下:

<span>test</span>
复制

​ 2.index.html

说明:这个是主页面,单击“显示”按钮时发生异步请求:

效果1:请求前
在这里插入图片描述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

效果2:请求后:
在这里插入图片描述

关键代码:

<button>显示</button>
<h3>下是请求的内容:</h3>
<div></div>
<script>
window.onload = function () {
document.querySelector("button").onclick=function () {
// 创建XMLHttpRequest对象
var xhr = new XMLHttpRequest();
// 与服务器建立连接TestServer
xhr.open("get", "TestServer.html", true);
// 发送异步请求
xhr.send();
// 设置请求状态变化执行的回调函数
xhr.onreadystatechange = function(){
//如果请求完成且响应成功
if(xhr.readyState==4 && xhr.status==200){
let div = document.querySelector("div");
div.innerHTML += "<br>响应状态码:"+xhr.status;//状码码
div.innerHTML += "<hr><br>响应状态文本:"+xhr.statusText;
div.innerHTML += "<hr><br>所有响应头:"+xhr.getAllResponseHeaders();
div.innerHTML += "<hr><br>响应体的HTML字符串:"+xhr.response;
}
};
};
};
</script>
复制

2.3 使用步骤(4步)

1.创建XMLHttpRequest异步请求

​ 参见上面代码中的createXMLHttpReq()函数。因为兼容问题,不同浏览器,甚至版本不同创建方法不一样。

xhr = new ActiveXObject("Microsoft.XMLHTTP");
复制
2.与服务器建立连接

​ 先简单了解http连接:HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范。HTTP默认使用80端口,这个端口指的是服务端的端口,而客户端使用的端口是动态分配的。当我们没有指定端口访问时,浏览器会默认帮我们添加80端口。我们也可以自己指定访问端口如:http://www.baidu.com:80。 需要注意的是,现在大多数访问都使用了HTTPS协议,而HTTPS的默认端口为443,如果使用80端口访问HTTPS协议的服务器可能会被拒绝。

​ 在搞清楚建立与服务器的连接问题时,我们必须清楚两个重要的基础:

1.请求的方法:

​ 建立http请求的方法有8种,常用的是get和post两种。详细参考:https://www.cnblogs.com/weibanggang/p/9454581.html

2.请求的服务器URL

​ 指的请求的服务器资源,可是一个静态html文件,也要可以是有处理请求和响应能力的动态Servlet或JSP等后端服务器程序。

一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

在这里插入图片描述

参考代码:

xhr.open("get", "TestServer.html", true);
复制
3.向服务器发送数据
xhr.send();
复制

​ 先了解http请求|响应的步骤:

​ 客户端连接到Web服务器->发送Http请求->服务器接受请求并返回HTTP响应->释放连接TCP连接->客户端浏览器解析HTML内容

​ 其实向服务器发送数据很简单,调用XMLHttpRequest对象的send()方法就好了。但我们必须还要了解发送请求时发送了什么内容,服务响应回来的数据有什么内容。

发送HTTP请求

​ 通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

在这里插入图片描述

服务器接受请求并返回HTTP响应

​ Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

下面的图例是如何使用chrom浏览器查看请求与响应的报文信息,注意:

1.圈起的地方,这是我们要查看的请求行,请求行,响应行和响应头信息。

2.箭头指向的地方是你要按下F12打开代码调试检查窗口后要单击的位置,这样你才能看到请求和响应信息。

3.重点要注意,你必须打开调试检查窗口后,再刷新页,才可以看到右边的内容。

在这里插入图片描述

4.在回调函数中针对不同的响应状态进行处理

很明显示,最后是根据请求状态码和响应状态码来处理最后响应回的数据了:

xhr.onreadystatechange = function(){
//如果请求完成且响应成功
if(xhr.readyState==4 && xhr.status==200){
let div = document.querySelector("div");
div.innerHTML += "<br>响应状态码:"+xhr.status;//状码码
div.innerHTML += "<hr><br>响应状态文本:"+xhr.statusText;
div.innerHTML += "<hr><br>所有响应头:"+xhr.getAllResponseHeaders();
div.innerHTML += "<hr><br>响应体的HTML字符串:"+xhr.response;
}
};
复制

ajax请求对象中的onreadychange事件,是指当异常请求对象的readystatus状态发生改变时引发的事件。

readystatus指的是请求过程中,会有5种装状态,分别是从0到4,他们的含义分别是:

0 :请求未初始化;
1:服务器连接已建立;
2:请求已接收;
3:请求处理中;
4:请求已完成,且响应就绪;

HTTP 响应状态码用来表明特定 HTTP 请求是否成功完成。 响应被归为以下五大类:

  1. 信息响应 (100199)
  2. 成功响应 (200299)
  3. 重定向消息 (300399)
  4. 客户端错误响应 (400499)
  5. 服务端错误响应 (500599)

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status

2.4 常用属性和方法

open(method,url,async)

规定请求的类型、URL 以及是否异步处理 请求。

1.method:请求的类型;GET 或 POST

2.url:文件在服务器上的位置

3.async:true(异步)或 false(同步)

send(string)

将请求发送到服务器。

string:仅用于 POST 请求,表示传递的 参数,格式为 key1=val1&key2=val2 的查 询字符串

setRequestHeader(header,value)

向请求添加 HTTP 头。

header: 规定头的名称 value: 规定头的值

onreadystatechange

是一个异步对象的事件绑定,只有当请求状态发生改变时,调用此方法

回调 函 数 ( 或 函 数 名 ) , 每 当 readyState 属性改变时,就会调用该函 数。

readyState

存有 XMLHttpRequest 的状态。

从 0 到 4 发生变化。 0: 请求未初始化 1: 服务器连接已建立 2: 请求已接收3: 请求处理中 4: 请求已完成,且响应已就绪

Status

服务器端响应的状态码,例如 200 表示成 功,404 表示未找到页面

response

​ 响应体

responseText:

.就绪处理程序确定 readyState 为已完成并且请求已成功地完成后,就可以从请求对象中获取响应内 容。

参考:

XMLHttpRequest: https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest

AJAX四种常见请求头与响应类型:

https://www.cnblogs.com/itjeff/p/10240124.html

https://blog.csdn.net/baichoufei90/article/details/84030479

https://blog.csdn.net/u012894692/article/details/88846401

2.5 如何传参

分get和post两种

  1. get,在URL后拼接参数, login?userName=admin&password=888

  2. post,在异步请求对象的send()方法中加参数, xhr.send(“userName=admin&password=888”)

<<<<<<< HEAD
jquery表单序列化:$(“form”).serialize() | new FormData(表单域)

URI编码:encodeURIComponent(url)

URI反编码:decodeURIComponent(url)

关于请求参数的头

  • application/x-www-form-urlencoded: 默认的表单提交
  • multipart/form-data: FormData类型,适用post提交和上传
  • application/json:json格式的参数
  • text/plain :纯文本格式

请求头的类型不同(Content-Type),服务端如何接收参数(请求体)

application/x-www-form-urlencoded:

String value = request.getParameter("参数名");
String[] values = request.getParemeterValues("参数名");
复制

multipart/form-data:

​ 文本同上一样

​ 二进制:

Part part = request.getPart("参数名");
复制

text/plain:

BufferedReader in = request.getReader();
while (in.ready()){
p += in.readLine()+"<br>";
}
复制

7.如何设置请求头

=======

2.6 如何设置请求头

​ setRequestHeader(请求头关键字,请求头值)

2.7 如何处理响应结果

一般情况下,服务器响应用户一个json对象,而不是一个String字符串

后端服务如何返回一个json对象

PrintWriter out = response.getWriter();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
out.print(employeeJsonString);
out.flush();
复制

前端客户如何处理这个一个json对象

1.手动转换

JSON.parse()

2.自动转换

xhr.responseType()

9.JSON

1.什么是JSON

2.JSON语法

3.JavaScript如何使用

<<<<<<< HEAD

2.8 跨域

什么是跨域

同源策略

566384456a94a59d81597c5188c96dee19a33fc0

4.java如何使用

10.同源策略

​ 违背同源策略就是跨域

跨域解决:

1.jsonp,只接收get请求

html本身就具有跨域能力:img,link,iframe, script

2.后端服务Servlet实现允许跨域 (写后端的过滤器)
//允许所有的域名
response.setHeader("Access-Control-Allow-Origin","*");
response.setHeader("Access-Control-Allow-Credentials","*");
response.setHeader("Access-Control-Allow-Methods","*");
response.setHeader("Access-Control-Max-Age","3600");
response.setHeader("Access-Control-Allow-Headers","Authorization,Origin,X-Requested-With,Content-Type,Accept,content-Type,origin,x-requested-with,content-type,accept,authorization,token,id,X-Custom-Header,X-Cookie,Connection,User-Agent,Cookie,*");
response.setHeader("Access-Control-Request-Headers","Authorization,Origin,X-Requested-With,content-Type,Accept");
response.setHeader("Access-Control-Expose-Header","*");
复制

有什么作用?写在那里?

3. jQuery中请求参数相关工具函数

serialize():

将表单元素的值拼接为可提交的参数字符串(表单参数查询字符串)。

结果示例:“userName=zhangsan&age=18”。
用法:

$(表单元素选择器).serialize()
复制

注意:

1.序列化中是不包含表单元素中的文件域对象

2.如果有中文,结果示例:userName=张三&userpwd=bb

为什么会有一串串%xx这类的符号,是因为在将name和value拼接后再进行了URI编码。

URL编码:

为什么要进行编码:

​ 表单提交参数中有些特殊的字符需要传入服务器,如提交的值中有”&“这个符号,&刚好又有参数组分隔符,此时就会将值中的&转为%就可以了。这个转码过程就是URL编码,使用”encodeURI()“。编码的反操作是解码,使用”decodeURI()“.

用法:

encodeURI("name=张三&age=19")//"name=张三&age=19"
decodeURI("name=张三&age=19")//"name=张三&age=19"
复制
serializeArray():

将表单元素的值编译成有name和value的json对象。这个对象同样可以作为请求的参数

结果示例:

[
{name:"userName",value:"zhangsan"},
{name:"age",value:"18"}
]
复制

用法:

$(表单元素选择器).serializeArray();
复制

注意:

serialize()返回的是字符串(String),是一个简单的表单提交参数字符串,这种字符串即适用于Ajax请求的提交参数,也适用于URL地址后查询字符串(xx.html?xxx)。

serializeArray()返回的Json数组对象(Object数组),每个元素都包含name和value。适用于Ajax请求的提交参数

$.param()

将数组或对象拼接为表单提交参数字符串,并且进行URL编码。

用法:

$.param({name:"zhang",hobby:[0,2]})//"name=zhang&hobby[]=0&hobby[]=2"
复制

也可以理解为:

$("form").serialize();
等效代码
$.param($("form").serializeArray())
复制
案例1

下面表单包含:文本框,单选按钮,多选按钮,下拉框

<form>
<input type="text" name="userName">
<br>
<label><input type="radio" name="sex" value="0"></label>
<label><input type="radio" name="sex" value="1"></label>
<br>
<label><input type="checkbox" name="hobby" value="0">读书</label>
<label><input type="checkbox" name="hobby" value="1">游戏</label>
<label><input type="checkbox" name="hobby" value="2">运动</label>
<br>
<select name="education" >
<option value="0">大专</option>
<option value="1">本科</option>
<option value="2">硕士</option>
</select>
<br>
<button type="button">确定</button>
</form>
复制

输入数据后在控制台看看结果:

在这里插入图片描述
在这里插入图片描述

4. jQuery中AJAX请求

load()

load() 方法从服务器加载数据,并把返回的数据放置到指定的元素中。

**注意:**还存在一个名为 load 的 jQuery事件方法。调用哪个,取决于参数。

语法:

$(selector).load( url [, data ] [, complete(responseText, textStatus, XMLHttpRequest) ] )
复制

url:类型: String,一个包含发送请求的URL字符串
data:类型: PlainObject, String,向服务器发送请求的Key/value参数,例如{name:“zhangsan”,age:23}
complete(responseText, textStatus, XMLHttpRequest):类型: Function(),当请求·完成·后执行的回调函数。
responseText- 包含来自请求的结果数据
textStatus- 包含请求的状态(“success”、“notmodified”、“error”、“timeout”、“parsererror”)
XMLHttpRequest- 包含 XMLHttpRequest 对象

. g e t ( ) ∣ .get()| .get().post()

两种在客户端和服务器端进行请求-响应的常用方法是:GET 和 POST。

语法:

$.get(url[,param][,success(responseData,textStatus,jqXhr)][,dataType])
$.post(url[,param][,success(responseData,textStatus,jqXhr)][,dataType])
[{"id":1,"userName":"张三","age":18},{"id":2,"userName":"李四","age":18},{"id":3,"userName":"王五","age":18}]
复制

url:类型: String,一个包含发送请求的URL字符串
param:类型: PlainObject, String,发送给服务器的字符串或Key/value键值对。
responseData:响应体
success(data, textStatus, jqXHR):类型: Function(),当请求成功后执行的回调函数。
dataType:类型: String,从服务器返回的预期的数据类型。默认:智能猜测(xml, json, script, 或 html)

jqXhr

​ 是XMLHttpRequest对象超集。是jQuery 自己的 XMLHttpRequest 对象(一般简称jqXHR)。

​ jqXhr是XMLHttpRequest和Deferred两个对象组合体。 jQuery中Deferred后面再谈。

参考:

​ https://www.cnblogs.com/czf-zone/p/4375323.html

​ http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html

$.ajax()

​ ajax() 方法通过 HTTP 请求加载远程数据。

​ 该方法是 jQuery 底层 AJAX 实现。简单易用的高层实现见 $.get(), $.post()$(selector).load() 等。

​ $.ajax() 在jQuery1.5+之后返回jQueryXMLHttpRequest 对象(jQXhr)。

​ 与常用的 . g e t ( ) , .get(), .get(),.post()相比, $.ajax()用对象参数可以获得更多的灵活性。

​ 语法:

jQuery.ajax( url [, settings ] )
jQuery.ajax( [settings ] )
$.ajax({
url:"",
type:"",
success:function(){
}
})
复制

settings见帮助,此处不全部展开,只说明几种常用属性:

url:类型: String,一个用来包含发送请求的URL字符串。

async (默认: true),类型: Boolean,默认设置下,所有请求均为异步请求(也就是说这是默认设置为 true )。如果需要发送同步请求,请将此选项设置为 false 。跨域请求和 dataType: "jsonp" 请求不支持同步操作。注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。从 jQuery 1.8 开始, jqXHR ($.Deferred)中使用 async: false 已经过时。您必须使用的 success/error/complete 的回调选项代替相应的jqXHR对象的方法,比如jqXHR.done() 或者过时的jqXHR.success()

type (默认: 'GET'),类型: String,请求方式 (“POST” 或 “GET”), 默认为 “GET”。**注意:**其它 HTTP 请求方法,如 PUT 和 DELETE 也可以使用,但仅部分浏览器支持。

contentType (默认: 'application/x-www-form-urlencoded; charset=UTF-8'),类型: String,发送信息至服务器时内容编码类型。默认值是"application/x-www-form-urlencoded; charset=UTF-8",适合大多数情况。如果你明确地传递了一个内容类型(Content-Type)给 $.ajax(),那么他必定会发送给服务器(即使没有数据要发送)。数据将总是使用UTF-8字符集传递给服务器;你必须在服务器端进行适当的解码。

data,类型: [Object, String](https://www.jquery123.com/Types/#Object, String),发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后面。查看 processData 选项说明,以禁止此自动转换。对象必须为"{键:值}"格式。如果这个参数是一个数组,jQuery会按照traditional 参数的值, 将自动转化为一个同名的多值查询字符串(查看下面的说明)。注:如 {foo:[“bar1”, “bar2”]} 转换为 ‘foo=bar1&foo=bar2’。

dataType (默认: Intelligent Guess (xml, json, script, or html)),类型: String,预期服务器返回的数据类型。

complete,类型: Function( jqXHR jqXHR, String textStatus ),请求完成后回调函数 (请求successerror之后均调用)。这个回调函数得到2个参数: jqXHR (在 jQuery 1.4.x中是 XMLHTTPRequest) 对象和一个描述请求状态的字符串("success", "notmodified", "error", "timeout", "abort", 或者 "parsererror") 。从jQuery 1.5开始, complete设置可以接受一个函数的数组。每个函数将被依次调用。这是一个Ajax事件 。

error,类型: Function( jqXHR jqXHR, String textStatus, String errorThrown ),请求失败时调用此函数。有以下三个参数:jqXHR (在 jQuery 1.4.x前为XMLHttpRequest) 对象、描述发生错误类型的一个字符串 和 捕获的异常对象。如果发生了错误,错误信息(第二个参数)除了得到null之外,还可能是"timeout", "error", "abort" ,和 "parsererror"。 当一个HTTP错误发生时,errorThrown 接收HTTP状态的文本部分,比如: “Not Found”(没有找到) 或者 “Internal Server Error.”(服务器内部错误)。 从jQuery 1.5开始, 在error设置可以接受函数组成的数组。每个函数将被依次调用。 **注意:**此处理程序在跨域脚本和JSONP形式的请求时不被调用。这是一个 Ajax Event。

success,类型: Function( Object data, String textStatus, jqXHR jqXHR ),请求成功后的回调函数。这个函数传递3个参数:从服务器返回的数据,并根据dataType参数进行处理后的数据,一个描述状态的字符串;还有 jqXHR(在jQuery 1.4.x前为XMLHttpRequest) 对象 。在jQuery 1.5, *成功设置可以接受一个函数数组。每个函数将被依次调用。*这是一个 Ajax Event

5. 其它

$.ajaxSetup()

为以后要用到的Ajax请求设置默认的值。

$.parseJSON()

接受一个标准格式的 JSON 字符串,返回解析后的Object 对象。

如:

var obj = $.parseJSON('{"name":"zhangsan","age":18}');
console.log(obj);
复制

等效代码

var obj = eval({"name":"zhangsan","age":18});
复制

等效代码

var obj =JSON.parse('{"name":"zhangsan","age":18}');
复制

反操作:

var str = JSON.stringify(obj)
复制
案例2:

请求的目标文件:rs.json

{
"name":"zhangsan",
"age":18,
"sex":"男"
}
复制

源文件的html结构:要求,单击“显示”按钮,将数据显示到

中,且设置class为block。
转载请注明出处或者链接地址:https://www.qianduange.cn//article/3412.html
标签
评论
还可以输入200
共0条数据,当前/页
发布的文章

C/C | 每日一练 (2)

2025-02-24 13:02:49

Linux性能监控工具汇总

2025-02-24 13:02:48

Python常见面试题的详解16

2025-02-24 13:02:48

QQ登录测试用例报告

2025-02-24 13:02:47

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!