JS—ajax及async和defer的区别
###1.ajax “Asynchronous Javascript And XML”(异步 JavaScript 和 XML)
使用:
如不考虑旧版本浏览器兼容性,
// 第一步创建xhr对象
var xhr = new XMLHttpRequest();
// 第二步,定义状态变化监听函数
xhr.onreadystatechange = function(){
// 第五步 通过xhr对象的readyState属性,判断响应过程的当前活动阶段是否全部完成
if(xhr.readyState == 4){ // 属性值为0-4 0:未初始化,尚未调用open方法 1:启动,调用open但未调用send 2:发送,调用send但尚未接受到响应 3:接收,已经接受到部分相应数据 4:完成,已经接收到全部数据
if(xhr.status == 200 || xhr.status == 304 ){
console.log(xhr.responseText);
}
}
}
// 第三步 open一个链接
xhr.open("GET","abc.txt",false) // 请求类型 请求URL true为异步
// 第四步 发送请求
xhr.send(string / null ) // string只适用于POSR请求
setRequestHeader() 设置请求头
###2. xhr对象的相关属性
responseText: 作为响应主体被返回的文本
responseXML: 如果响应的内容类型是“text/xml”或"application/xml",这个属性中将保存包含则相应数据的XML DOM 文档。
status: 响应的HTTP状态(状态码) 成功的状态码为200/304 304表示请求的资源并没有被修改,可以直接使用浏览器中的缓存版本
即判断响应是否成功需进行如下判断
if(xhr.status == 200 || xhr.status == 304){ }
statusText: HTTP状态的说明
abort() : 取消异步请求
###3. HTTP头部信息
setRequestHeader() 设置请求头部信息 必须在open()方法之后且调用send()之前
getResponseHeader() 获取指定请求头
语法: getResponseHeader(name)
getAllResponseHeaders(); 获取所有请求头
语法: getAllResponseHeaders( )
使用:
//post请求
obj.onclick= function(){
var xhr= new XMLHttpRequest();
var obj = {
name: 'zhansgan',
age: 18
};
xhr.open("POST", "http://192.168.1.200:8080/php/test.php", true);
xhr.setRequestHeader("token","header-token-value"); // 可以定义请求头带给后端
xhr.setRequestHeader("dingyi","header-dingyi-value");
xhr.send(JSON.stringify(obj)); // 要发送的参数,要转化为json字符串发送给后端,后端就会接受到json对象
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
console.log(xhr.responseText);
}
}
};
//get请求
obj.onclick= function(){
var xhr= new XMLHttpRequest();
// get方法带参数是将参数写在url里面传过去给后端
xhr.open("GET", "http://192.168.1.200:8080/php/test.php?name='zhansgang'&age=12", true);
xhr.setRequestHeader("token","header-token-value");
xhr.setRequestHeader("dingyi","header-dingyi-value");
xhr.send();
xhr.onreadystatechange = function(){
if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
console.log(xhr.responseText);
}
}
###4. GET请求
使用get请求经常会出现一个错误,就是查询字符串格式有问题。 因此,查询字符串中每个参数的名称和值都必须使用encodeURLcomponent()进行编码,然后才能放到URL的末尾
eg: xhr.open("GET","abc.php?name1=value1&name2=value2",false)
可定义一个addURLParam()函数
function addURLParam(url,name,value){
url += (url.indexOf("?") == -1 ? "?":"&");
url += encodeURLcomponent(name) + "=" + encodeURLcomponent(value);
return url;
}
url = addURLParam("abc.php","userName","Tom")
xhr.open("GET",url,false)
###5. POST请求
###6. async和defer属性
defer属性(defer属性声明这个脚本中将不会有document.write或dom操作)
eg:
<script src="http://xxx.com/path/a.js" defer></script>
async(html5中新增的异步支持)
eg :
var s = document.createElement('script');
s.async = true;
1.<script src="script.js"></script> 没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,
也就是说不等待后续载入的文档元素,读到就加载并执行。
2.<script async src="script.js"></script> 有 async,加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步)。
3.<script defer src="myscript.js"></script> 有 defer,加载后续文档元素的过程将和 script.js 的加载并行进行(异步),
但是 script.js 的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成。
4.蓝色线代表网络读取,红色线代表执行时间,这俩都是针对脚本的;绿色线代表 HTML 解析。
defer属性设置为TRUE时,让浏览器加载js脚本时不等脚本加载完成就开始对该脚本之后的其他图片、文本、HTML代码进行加载了,然后让js脚本自己在慢慢加载,然后再执行。
这种方式加载JS文件能够提高网页的加载速度,特别是对比较大的脚本。
注意:
1、不要在defer型脚本程序段中调用document.write命令,因为document.write将产生直接输出效果。
2、不要在defer型脚本程序段中包括任何立即执行脚本要使用的全局变量或者函数。
JS—ajax及async和defer的区别的更多相关文章
- script标签async和defer的区别及作用
作用: 1.没有 defer 或 async,浏览器会立即加载并执行指定的脚本,也就是说不等待后续载入的文档元素,读到就加载并执行. 2.async 属性表示异步执行引入的 JavaScript,与 ...
- script标签不带属性与带async、defer的区别
<script> 当页面解析到script标签时,会停止解析并下载对应的脚本,并马上执行,执行完毕后再继续解析页面 <script async> async 在下载脚本的同时不 ...
- <script>属性async和defer的区别
async:可选.表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或 等待加载其他脚本.只对外部脚本文件有效. defer:可选.表示脚本可以延迟到文档完全被解析和显示之后再执行.只 ...
- js异步回调Async/Await与Promise区别 新学习使用Async/Await
Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面 ...
- script async 和script defer的区别
浏览器对js文件的操作主要有两部分:下载和执行: js文件下载在有些浏览器中是并行的,在有些浏览器中是串行的,如:IE8.firefox3.chrome2都是串行下载的: 执行在所有浏览器中默认是阻塞 ...
- 脚本引用中的defer和async的用法和区别
之前的博客漫谈前端优化中的引用资源优化曾经提到过脚本引用异步设置defer.async,没有细说,这里展开一下,谈谈它们的作用和区别,先上张图来个针对没用过的小伙伴有个初始印象: 是的,就是在页面脚本 ...
- js之script属性async与defer
概念 默认情况下js的脚本执行是同步和阻塞的,但是 <script> 标签有 defer 和 async 属性, 这可以改变脚本的执行方式,这些都是布尔类型了,没有值,只需要出现在 < ...
- <script>, <script async>, <script defer> 三种标签的区别
<script>, <script async>, <script defer> 三种标签的区别 <script>标签 阻塞html parsing 脚 ...
- 原生js ajax与jquery ajax的区别
原生js ajax的调用: ajax({ type : "get", url : "02_ajax_get.txt", data : { "userN ...
随机推荐
- Spring AOP 术语
- 官网下载Git方法
最近去官网下载Git,奇慢,下到一半直接挂掉,挂VPN也是一样 https://git-scm.com/ 今天学到一个方法,下载速度可以达到2m/s,那就是复制下载地址,用迅雷下载,可能是迅雷有P2 ...
- Linux crm 运行
crm 项目部署 运行 crm 准备代码 django_crm.zip 上传windows中的代码到linux中,可选 lrzsz(只能传单个的文件)或者xftp 使用lrzsz传输,必须压缩代码包 ...
- linux 软连接创建 压缩解压缩 linux的dns服务相关
linux软连接创建 注意用绝对路径,语法如下 ln -s 目标文件绝对路径 软连接名字绝对路径 ln -s /小护士.txt /tmp/hs.txt 修改linux的PS1变量,命令提示符变量 PS ...
- 16.ajax_case04
# 抓取金色财经快讯接口 # https://www.jinse.com/lives import requests import json header = { 'Accept': 'text/ht ...
- 关于HashMap的一些深入探索与理解
在java中.大家差点儿是离不开对集合的使用的,像Map系列,List系列.Set系列.可是非常多人没有了解过或者研究过这些集合类究竟能够用在什么地方,而且有什么注意的地方.因此本文分Map系列和Li ...
- PHP删除数组中空值的方法介绍
这篇文章主要介绍了PHP删除数组中空值的方法介绍,需要的朋友可以参考下 说来惭愧,以前在去掉数组的空值是都是强写foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下: ...
- day 06 元组、字典、集合的定义及其方法
一:元组 1.定义:在()内用多个逗号分隔开多个任意类型的元素 元组用来记录多个值,当值没有改变的需求时,用元组更合适. 元组是有序的.不可变的(虽然数据不可变,但是数据的数据是可以改变的) t = ...
- 转载 (三)surging 微服务框架使用系列之我的第一个服务(审计日志)
(三)surging 微服务框架使用系列之我的第一个服务(审计日志) 前言:前面准备了那么久的准备工作,现在终于可以开始构建我们自己的服务了.这篇博客就让我们一起构建自己的第一个服务---审计日志 ...
- nginx之七:nginx path(root)文件路径配置
nginx指定文件路径有两种方式root和alias,这两者的用法区别,使用方法总结了如下,方便大家在应用过程中,快速响应.root和alias主要区别在于如何解释location后面的uri,这会使 ...