我们可以打开这个网址https://www.w3school.com.cn/ajax/index.asp,里面有关于Ajax的详细介绍。
现在开始我们的正题趴!这里介绍了使用ajax的步骤,以及对于ie浏览器兼容性问题的处理
1.Ajax-get请求
- 建立一个html页面。在这个页面我先添加了基本结构,以及解释了ajax请求的5个步骤
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Ajax_get</title>
<script>
//加载就执行这个函数
window.onload = function (ev) {
//通过选择器找到button
var oBtn = document.querySelector("button");
//绑定button的点击事件(button被点击就发送一个ajax请求)
oBtn.onclick = function (evl) {
//使用Ajax的五个步骤
//1.创建一个异步对象(Ajax的核心对象:XMLHttpRequest)
//2.打开这个对象,设置请求方式和请求地址,参数(请求方式,请求url,异步还是同步)
//3.发送请求
//4.监听状态的变化
//5.处理返回的结果
}
}
</script>
</head>
<body>
<button>发送请求</button>
</body>
</html>
-
添加一个一般处理程序,添加下列内容。
-
现在我们来一步一步的完成ajax请求
(注意:蓝色箭头是添加的注释,红色框是添加的代码)
-
运行结果:
运行程序,点击F12,然后点击控制台,发现控制台已经打印出了信息,注意红色的小箭头,发现这里显示3,说明这句话打印了三次,就说明状态改变了三次。
在官方文档上,我们可以看到:
我们需要关注的是: 4 -请求完成这个状态。所以我们修改代码:
然后我们运行程序(只打印了一次),说明请求完成而且响应就绪。
现在这里有一个小问题,当我们修改把正确的URL修改成一个错误的地址,会产生错误。但是仍然可以打印出来上面那句话。这是因为我们只判断了它的请求状态,当请求完成就打印。所以我们应该再做一个判断(请求成功还是失败)。
先来了解一下状态码吧!
https://baike.baidu.com/item/HTTP%E7%8A%B6%E6%80%81%E7%A0%81/5053660?fr=aladdin -
修改代码,先把url改成错误的
运行程序:
-
现在我把url改成正确的,然后贴上完整代码(这就是一个ajax发送get请求的完整过程,为了方便查看,就先删掉注释啦)
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Ajax_get</title>
<script>
window.onload = function (ev) {
var oBtn = document.querySelector("button");
oBtn.onclick = function (evl) {
var xhr = new XMLHttpRequest();
xhr.open('GET', "Handler.ashx", true);
xhr.send();
xhr.onreadystatechange = function (ev2) {
if(xhr.readyState === 4)
{
if (xhr.status >= 200 && xhr.status <= 300 || xhr.status === 304)
{
console.log("接收到服务器返回的数据");
}
else {
console.log("没有接收到服务器的数据");
}
}
}
}
}
</script>
</head>
<body>
<button>发送请求</button>
</body>
</html>
在这里我们发现,我们并没有拿到Handler.ashx返回的数据,怎么拿到呢?
现在我们只需要修改代码:
运行程序(以弹框的形式输出了我们返回的值):
2.在ie中的使用问题:
- 所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。所以我们在使用XMLHTTPRequest时要先判断浏览器支不支持它。
在官方文档上,我们会看到怎么处理兼容性问题
所以我们只需要稍作添加即可:
- 在IE浏览器中,如果通过Ajax发送Get请求,那么IE浏览器认为同一个URL只有一个结果。所以我们需要保证url的值每一次都不一样。
比如:你可能会发现下面的情况,当你访问百度主页时,地址后面可能会跟一长串数字,这就是百度了为了让用户每次都能够正常请求到服务器的数据所做的处理。
为了解决这个问题,我们只需要在url后面增加一些内容即可。怎么实现呢
时间戳是一个很好的选择。
运行程序,仍然会出现刚刚已经出现的弹框!
这样我们就处理好啦!
唔完整的代码~
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Ajax_get</title>
<script>
window.onload = function (ev) {
var oBtn = document.querySelector("button");
oBtn.onclick = function (evl) {
var xhr;
if (window.XMLHttpRequest) {
// code for IE7+, Firefox, Chrome, Opera, Safari
xhr = new XMLHttpRequest();
}
else {
// code for IE6, IE5
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open('GET', "Handler.ashx?t=" + (new Date().getTime()), true);
xhr.send();
xhr.onreadystatechange = function (ev2) {
if(xhr.readyState === 4)
{
if (xhr.status >= 200 && xhr.status <= 300 || xhr.status === 304)
{
alert(xhr.responseText);
}
else {
console.log("请求失败");
}
}
}
}
}
</script>
</head>
<body>
<button>发送请求</button>
</body>
</html>