一、Ajax的基本用法
同步交互与异步交互
同步交互
指发送一个请求,需要等待返回,然后才能够发送下ー个请求。同步交互相当于排队,轮到下一个的情况会因为前一个而有所不同。
与排队类似。例如学生在食堂买饭,只有等前边同学买完才能轮到自己。 客户端向服务器端发送请求,必须等待结果返回,才能向服务端再次发送请求。
异步交互
所谓异步交互,就是指指发送一个请求,不需要等待返回,随时可以再发送下一个请求。同步交互与异步交互的区别在于同步交互需要等待结果,而异步交互不需要等待。
异步交互相比同步交互的优势主要具有以下几点
- 用户操作无须像同步交互必须等待结果。
- 异步交互只需与服务器端交換必要的数据内容,而不是将所有数据全部更新。
- 异步交互对带宽造成的压力相比同步交互更小。
- 通过Aja实现异步交互不需要任何第三方插件,只要浏览器支持Javascript语言即可实现。
异步交互相比同步交互井不是优势,它也存在一些问题
- 异步交互破坏了浏览器原有的前进和后退机制。
- 如果后面逻辑的行依靠前面逻辑行的结果的话,异步交互可能会造成问题。
- Aja×实现异步交互对搜索引擎支持较弱。
- Ajax实现异步交互会引起一些Web安全问题,例如如SQL注人攻击、跨站点脚本攻击等问题。
Ajax概念
Ajax是什么
Asynchronous JavaScript + XML(异步JavaScript和XML), 其本身不是一种新技术,而是一个在 2005年被Jesse James Garrett提出的新术语,用来描述一种使用现有技术集合的‘新’方法。
当使用结合了这些技术的AJAX模型以后, 网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面。这使得程序能够更快地回应用户的操作。
Ajax涉及的技术
Ajax只是为实现异步交互的手段,不是一种技术,而是多种技术的整合。其中包括以下几种技术
- HTML页面
- CSS
- JavaScript
- DOM
- XML
- XMLHttpRequest对象 实现Ajax异步交互的核心
Ajax的核心对象
实现Ajax异步交互的核心就是XMLHttpRequest对象,该对象为客户端提供了在客户端和服务器之传输数据的功能。
Xmlhttprequestx对象最初由微软设计,随后被Mozilla、Apple和Google采纳。如今,该对象已经被W3C组织标准化。通过该对象,可以很容易地得到一个URL上的资源数据。尽管名字里有XML,但XMLHttpRequest对象可以得到所有类型的数据资源,井不局限于XML格式的数据。
实现Ajax异步交互
实现Ajax的执行步骤
- 创建核心对象XMLHttpRequest
- 通过XMLHttpRequest对象的open方法与服务器建立连接
- 构建请求所需的数据内容,并通过XMLHttpRequest对象的send方法发送出去
- 通过XMLHttpRequest对象提供的onreadystatechange事件监听服务器端的通信状态
- 接收并处理服务器端向客户端响应的数据结果
- 将处理的结构更新到HTML页面中
创建Ajax的核心对象
- 函数式定义 function createXMLHttpRequest() { var httpRequest; if (window.XMLHttpRequest) { // 适用于非IE浏览器 httpRequest = new XMLHttpRequest(); } else if (window.ActiveXObject) { // 适用于IE浏览器 try { // IE 7+ httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { // IE 6- httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } return httpRequest; }
- 为window原型定义方法 Object.defineProperty(window, "createXMLHttpRequest", function () { var httpRequest; if (window.XMLHttpRequest) { // 适用于非IE浏览器 httpRequest = new XMLHttpRequest(); } else if (window.ActiveXObject) { // 适用于IE浏览器 try { // IE 7+ httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { // IE 6- httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } return httpRequest; });
- 匿名函数 (function () { function createXMLHttpRequest() { var httpRequest; if (window.XMLHttpRequest) { // 适用于非IE浏览器 httpRequest = new XMLHttpRequest(); } else if (window.ActiveXObject) { // 适用于IE浏览器 try { // IE 7+ httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { // IE 6- httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } return httpRequest; } window.createXMLHttpRequest = createXMLHttpRequest; })();
任选一种方式即可创建一个Ajax的核心对象。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script src="1. createXMLHttpRequest.js"></script>
<script>
var xhr = createXMLHttpRequest()
console.log(xhr);
</script>
</body>
</html>
实现Ajax的步骤
关于核心对象的方法参考:MDN
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button id="btn">按钮</button>
</body>
<script src="1. createXMLHttpRequest.js"></script>
<script>
var btn = document.getElementById('btn')
btn.addEventListener('click', function () {
// 实现Ajax异步交互
// 1. 创建核心对象
var xhr = createXMLHttpRequest()
// 2. 调用核心对象的open方法
// 作用 - 与服务器建立连接
// 参数参考 https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/open
xhr.open('get', 'https://v1.hitokoto.cn')
// 3. 调用核心对象的send方法
// 作用 - 将客户端页面的数据发送给服务器端
// 参数参考 https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/send
xhr.send(null)
// 4. 利用核心对象的onreadystatechange事件监听服务器端的通信状态
// 当接收到服务器端处理完毕的信号
// 参考连接 https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/readyState
xhr.onreadystatechange = function () {
// 通过核心对象的属性readyState监听通信状态
//readyState=4:响应的内容解析完毕,可以在客户端使用了--完成
if (xhr.readyState === 4) {
// 接收服务器端返回的处理结果(responseText)
console.log(xhr.responseText);
}
}
// 5. 将接收到的结果更新到HTML页面中
})
</script>
</html>
通过Ajax异步交互
响应状态码
通过status
属性判断返回响应的状态码。
xhr.onreadystatechange = function () {
// 通过核心对象的属性readyState监听通信状态
//readyState=4:响应的内容解析完毕,可以在客户端使用了--完成
if (xhr.readyState === 4 && xhr.status === 200) {
// 接收服务器端返回的处理结果(responseText)
console.log(xhr.responseText);
console.log(xhr.status);
}
}
open方法
请求方法分为可以是POST与GET
send方法
当不发送数据时需要传递null
而不是不传参。
如果请求方式为GET
,那么参数只能是null
,将参数添加到请求地址中。
xhr.open('get', 'https://v1.hitokoto.cn?c=a&c=c')
如果请求方式为POST
,那么参数传入请求的参数,并且设置请求头即可。
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
xhr.send("c=a&c=c")
Node.js搭建基础服务
const http = require("http");
const hostname = "127.0.0.1";
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader("Content-Type", "text/plain");
res.end("Hello, World!n");
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
- 使用Java代码通过JDBC连接只启用Sentry的Impala异常分析
- 如何在CDSW中定制Docker镜像
- 干货:排名前 16 的 Java 工具类!
- 危险:会话固定攻击漏洞,你们的系统都堵上了吗?
- 深度学习入门者必看:25个你一定要知道的概念
- 如何在CM中启用YARN的使用率报告
- 如何修改CDSW服务的DNS和HOSTNAME
- 想尝试搭建图像识别系统?这里有一份TensorFlow速成教程
- 如何查看集成Sentry后Hive作业的真实用户
- 如何在Impala中实现拉链表
- 多图见证模拟机器人的逆天成长:论进化策略在强化学习中的应用
- Hue禁止用户下载数据问题分析
- 如何在RedHat6上使用Bind搭建DNS服务
- 如何使用Cloudera Manager升级Spark2.1版本至Spark2.2
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 「查缺补漏」巩固你的RocketMQ知识体系
- springboot之场景启动器
- ICLR2020 | 深度自适应Transformer
- springboot之自动配置
- golang--连接redis数据库并进行增删查改
- golang--redis连接池
- springboot配置之使用application.properties时编码问题
- mybatis动态sql之foreach补充(二)
- golang数据结构之稀疏数组
- mybatis扩展之使用PageHelper插件进行分页(是真好用)
- 动态规划--0,1背包问题(再也不怕类似背包问题了)
- springboot配置之Profile多环境支持
- LeetCode | 102.二叉树的层次遍历
- golang数据结构之队列
- 动态规划--最长上升子序列(LIS)的长度