一.ajax的概念
Ajax,是 Asynchronous JavaScript + XML 的简写。指一种创建交互式网页应用的网页开发的技术。
通过异步模式,提升了用户体验。优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用。Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大量用户下的服务器负载。
Ajax最大的特点就是局部刷新。
Ajax 技术核心是 XMLHttpRequest 对象(简称 XHR)
创建Ajax对象
new XMLHttpRequest();
new ActiveXObject('Microsoft.XMLHTTP')
open()
xhr.open('get', 'demo.php', true);
三个参数: 要发送的请求类型 (get 、post)、请求的 URL 和表示是否异步
Post:xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send(data);
发送请求 send()
接收服务器返回的信息 onreadystatechange
readyState
0 请求未初始化 1 服务器连接己建立
2 请求已接收 3 处理请求,响应中
4 响应就绪
status HTTP 状态码
常见状态码
200 - 请求成功
301 -Moved Permanently 资源(网页等)被永久转移到其它URL
304 -Not Modified 使用缓存文档
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
状态码分类
1**信息,服务器收到请求,需要请求者继续执行操作 2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求 4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误
二.ajax的使用
<script>
if (window.XMLHttpRequest) {
var xhr = new XMLHttpRequest();
} else {
var xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open("get", "data.json", true);
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
console.log(xhr.responseText);
} else {
console.log("加载失败,请重试");
}
}
};
</script>
三.封装ajax
<script>
function ajax(url, fnSuccess, fnError) {
if (window.XMLHttpRequest) {
var xhr = new XMLHttpRequest();
} else {
var xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open("get", url);
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var data = xhr.responseText;
fnSuccess(data);
} else {
fnError();
}
}
};
}
</script>
四.测试封装函数
data.json文件内容是[1,2,3]
ajax.js就是上面三的代码
<ul></ul>
<script src="ajax.js"></script>
<script>
var oUl = document.querySelector("ul");
ajax("data.json", foo, bar);
function foo(a) {
a = JSON.parse(a);
var str = "";
for (var i = 0; i < a.length; i++) {
str += `<li>${a[i]}</li>`;
}
oUl.innerHTML = str;
}
function bar() {
alert("失败了");
}
</script>
五.post请求
<input type="text" name="username" />
<input type="button" value="提交" />
<script>
var aInput = document.querySelectorAll("input");
aInput[1].onclick = function () {
if (window.XMLHttpRequest) {
var xhr = new XMLHttpRequest();
} else {
var xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
xhr.open("post", "05_test.php", true);
xhr.setRequestHeader(
"Content-type",
"application/x-www-form-urlencoded"
);
xhr.send("username=" + aInput[0].value);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
console.log(xhr.responseText);
} else {
console.log("加载失败,请重试");
}
}
};
};
</script>
<?php
$name = $_POST["username"];
echo "hello".$name;
?>
六.ajax完整封装
<script>
function ajax(type, url, data, success, error) {
if (window.XMLHttpRequest) {
var xhr = new XMLHttpRequest();
} else {
var xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
var str = "";
for (var i in data) {
str += i + "=" + data[i] + "&";
}
str = str.replace(/&$/, "");
if (type == "get") {
xhr.open("get", url + "?" + str);
xhr.send();
}
if ((type = "post")) {
xhr.open("post", url);
xhr.setRequestHeader(
"Content-type",
"application/x-www-form-urlencoded"
);
xhr.send(str);
}
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var data = xhr.responseText;
success(data);
} else {
error();
}
}
};
}
</script>
七.测试完整的ajax
<body>
<script src="ajax01.js"></script>
<script>
ajax({
url: "07_test.php",
success: function (data) {
console.log(data);
},
data: { username: "admin" },
type: "get",
});
</script>
</body>
<?php
$name = $_REQUEST["username"];
echo "111".$name;
?>
function ajax(obj) {
if (window.XMLHttpRequest) {
var xhr = new XMLHttpRequest();
} else {
var xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
var str = "";
for (var i in obj.data) {
str += i + "=" + obj.data[i] + "&";
}
str = str.replace(/&$/, "");
if (obj.type.toLowerCase() == "get") {
if (str == "") {
xhr.open("get", obj.url);
} else {
xhr.open("get", obj.url + "?" + str);
}
xhr.send();
}
if (obj.type.toLowerCase() == "post") {
xhr.open("post", obj.url);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send(str);
}
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
var data = xhr.responseText;
obj.success(data);
} else {
if (obj.error) {
obj.error();
}
}
}
};
}
八.回调函数
<script>
function foo(fn) {
fn();
}
function bar() {}
foo(bar);
</script>
九.事件委托
<style>
li {
background-color: red;
margin: 10px 0;
}
</style>
</head>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<input type="button" value="more" />
<script src="ajax01.js"></script>
<script>
let oUl = document.querySelector("ul");
let oBtn = document.querySelector("input");
oUl.onclick = function (e) {
var evt = e || event;
var _target = evt.target || evt.srcElement;
if (_target.tagName.toLowerCase() == "li") {
console.log("a");
}
};
oBtn.onclick = function () {
ajax({
type: "get",
url: "09_data.json",
success: function (data) {
data = JSON.parse(data);
data.forEach((item) => {
let oLi = document.createElement("li");
oLi.innerText = item;
oUl.appendChild(oLi);
});
},
});
};
</script>