ajax学习笔记

1. 原生ajax

1.1 XML简介

XML,可扩展标记语言,被用来设计和存储数据
与html不同的时,其标签都是自定义的标签
例如:

//表示一个学生数据:name="孙悟空";age="18";gender="男";

<student>
<name>孙悟空</name>
<age>18</age>
<gender></gender>
</student>

但是现在被JSON所代替

1.2 ajax特点

1.2.1 优点

  1. 可以无需页面刷新与服务器进行通信
  2. 允许你根据用户事件来更新部分页面内容

1.2.2 缺点

  1. 没有浏览历史
  2. 存在跨域问题(同源)
  3. SEO不友好(爬虫)

2. HTTP各部分结构

客户端或者浏览器向服务器发送相关信息称为HTTP请求,其内容为请求体,Request
服务器向客户端或者浏览器传回内容称为HTTP响应,其内容称为响应体,Response

2.1 HTTP请求

请求报文

  • 行:POST /?ie=utf-8 HTTP/1.1
  • 头:HOST:baidu
    Cookie:name=gui
    Content-type:application/x-www-form-urlencoded
  • 空行
  • 体:username=admin&passon=123

2.2 HTTP响应

响应报文

  • 行:HTTP/1.1 200 OK
  • 头:Content-type:text/html;charset=utf-8
    Content-length:2048
    Content-encoding:gzip
  • 空行
  • 体:(得到的回应内容,比如JSON字符串等等)

3. 原生的AJAX写法

3.1 ajax小例子(向服务端发送请求,请求的基本操作)

//定义一个按钮来发送请求
<button>点击发送请求</button>

//将得到的请求放在一个div容器内
<div id="result" style="width:200px;height:200px;border:soild 1px #90b"></div>

//开始写ajax代码
<script>
//获取对象
var button=document.getElementByTagName('button')[0];
var div=document.getElementById('result');
//定义点击事件
button.onclick=function(){
//1.创建对象
var xhr=new XMLHttpRequest();
//2. 初始化,设置请求方法和对呀的url(向服务器请求的地址)
xhr.open('GET','http://127.0.0.1:8000/server');
};
//3. 发送
xhr.send();
//4. 事件绑定 处理服务器返回的结果
//onreadystatechange()方法
//解释此单词:
// on..when :当...的时候
// readystate: 是xhr中对象的属性,表示状态0 1 2 3 4
//各状态表示的含义:
// 0=>未初始化,一开始readystate就是0
// 1=>表示open方法已经调用完毕
// 2=>表示send方法已经调用完毕
// 3=>表示服务端返回了一些相应的结果
// 4=>表示服务端返回了所有的结果
//change 改变的时候触发
xhr.onreadystatechange=function(){
//判断
//当服务端返回所有结果时候,才返回全部响应的值,此时readystate是4
if(xhr.readystate===4){
	//判断响应的状态码  200 404 403 500 之类的
	//2开头都表示成功
	if(xhr.status>=200&&xhr.status<300){
		//处理结果 行 头 体 空行 体
		//1.响应行
		console.log(xhr.status);//状态码
		console.log(xhr.statusText);//状态字符串
		//2.响应头
		console.log(xhr.getAllResponseHeaders(){});//所有响应头
		//3.响应体
		console.log(xhr.response);//响应体

		//将响应体放在div盒子里显示
		div.innerHtml=xhr.response;
	}else {
		
		}
  }
}

</script>

3.2 如何设置ajaz请求Url的参数

在open()方法里的对应url里设置
举例:在url里添加参数:a=100和b=200,c=300

xhr.open('GET','http://127.0.0.1:8000/server?a=100&b=200&c=300');
};

在浏览器里看该参数:
参数

3.3 ajax发送POST请求

小例子:
鼠标移动到div里,就会发送一次POST请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #result{
            width: 200px;
            height: 200px;
            border: solid 1px #903;
        }
    </style>
</head>
<body>
    <div id="result"></div>
    <script>
        //获取元素对象
        var result=document.getElementById('result');
        //绑定事件
        result.addEventListener('mouseover',function(){
            //1.创建对象
            var xhr=new XMLHttpRequest();
            //2.初始化,设置类型与URL
            xhr.open('post','http://127.0.0.1:8000/server');
            //3.发送
            xhr.send();
            //4.事件绑定
            xhr.onreadystatechange=function(){
                //判断
                if (xhr.readyState===4) {
                    if (xhr.status>=200&&xhr.status<300) {
                        result.innerHTML=xhr.response;
                    }
                    
                }
            }
            });
    </script>
</body>
</html>

3.4 ajaz设置请求体

send()方法里放置,有很多格式的,最常用的是JSON格式,重要的是服务端有相应的解析
其中,一个请求头为:
Content-Type是设置请求头内容的类型的
比如:

xhr.send('a=100&b=200');
//或者
xhr.send('a:100&b:200');

3.5 ajax设置请求头信息

xhr.setRequestHeader('Content-Type','application/json');

3.6 ajax服务端响应Json数据

1.将对象转化为Json类型的字符串

//定义一个需要转化成json类型的对象
var data={name:'xx'};
//转化为json类型
var j=JSON.stringify(data);

2.将Json类型的字符串转化成一个对象(方法转化或者借助一个响应体自动转换json成对象)

//方法转换
var j={'name':'xx'};
var date=JSON.parse(j);
//然后就可以点出里面的属性了
console.log(date.name);


//借助响应体转换
//设置响应体的类型
xhr.responseType='json';

3.7 ajaz请求超时与网络异常处理

在实际开发项目中,很容易出现服务器响应慢或者网络异常,应该怎么处理呢?

//设置服务器超时2s客户端就自动停止请求响应(时间到了之后自动的取消了请求)
xhr.timeout=2000;

//超时回调
xhr.ontimeout=function(){
	alert('请求超时,请稍后再试');
};

//网络异常问题
xhr.onerror=function(){
	alert('你的网络似乎出了些问题');
};

3.8 ajaz取消请求

手动的取消请求

<button>点击发送</button>
<button>点击取消</button>

<script>
//获取元素对象
var btns=document.querySelectorAll('button');
let x=null;

btn[0].onclick=function(){
	x=new XMLHttpRequest();
	x.open('Get','http://127.0.0.1:80/server');
	x.send();
};

//abort(取消发送)
btn[1].onclick=function(){
	x.abort();
}
</script>

3.9 ajaz请求重复发送问题

利用一个标识符来判断

var btns=document.querySelectorAll('button');
let x=null;
var isSending=false;

btn[0].onclick=function(){
	if(isSending){x.abort();}//如果正在发送则取消正在发送的请求,创建一个新的请求
	x=new XMLHttpRequest();
	isSending=true;
	x.open('Get','http://127.0.0.1:80/server');
	x.send();
	x.onreadystatechange=function(){
		if(x.readystate===4){
			//修改标识变量
			isSending=false;
		}
	}
};

4. JQuary发送ajax写法

通用写法:

<button id="button"></button>
    <script>
        $('button').click(function(){
            $.ajax({
                //url
                url:'http://127.0.0.1:8000',

                //请求的参数
                data:{"a":100,"b":200},

                //请求类型
                type:'GET',

                //响应体结果
                dataType:'json',

                //成功的回调
                success:function(date){
                    alert(date);//date是服务器返回的结果
                },

                //超时时间,超出2s就终止请求
                timeout:2000,

                //失败的回调
                error:function(){
                    alert("出错了")
                }


            })
        });
    </script>

5. Axios发送ajax写法

  1. get写法
axios.get('/user', {
    params: {
      ID: 12345
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });

  1. post写法
axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (error) {
    console.log(error);
  });
  1. 通常写法
// 发送 POST 请求
axios({
  method: 'post',
  url: '/user/12345',
  data: {
    firstName: 'Fred',
    lastName: 'Flintstone'
  }
});
// 获取远端图片
axios({
  method:'get',
  url:'http://bit.ly/2mTM3nY',
  responseType:'stream'
})
  .then(function(response) {
  response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值