零JS筆記 | Ajax-基础
核心:
btn.onclick = function () {
var xhr = new XMLHttpRequest()
xhr.open('get', 'hellw.txt', true)
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
alert(xhr.responseText)
}
else {
alert('出错了,' + xhr.status)
}
}
}
}
流程:
打开浏览器--》输入地址--》按Enter--》等待服务器响应;
1)打开浏览器,创建一个ajax对象 之后利用属性send()和方法responseText()去获取内容
IE6下: 以下用的是ActiveXObject('Microsoft.XMLHTTP')
標準下:var xhr = new XMLHttpRequest()
为兼容IE6,首先定义一个null;,然后分别判断处理
2)var xhr = null;
try {
var xhr = new XMLHttpRequest()
}
catch (e) {
var xhr = ActiveXObject('Microsoft.XMLHTTP')
}
2)輸入地址:open('打开方式',url,3是否异步)
异步:非阻塞,前面未完成,後面可開始執行,大部分情況下都用异步
同步:阻塞,当前面未完成時,会阻止后面的比如加载jq,须先加完再执行($)(fun).....
xhr.open( 'get','hellw.txt',true)
3)按Enter,執行操作;相當於Form的submit
4)等服务器响应,即返回的数据 ,返回后存放在属性里,responseText【属性】或responseXML【XML属性】:ajax请求返回的内容,被存放到这个属性下
readyState:ajax工作狀態:0,1,2,3,4
0 (初始化)还没有调用open()方法 1 (载入)已调用send()方法,正在发送请求 2 (载入完成)send()方法完成,已收到全部响应内容 3 (解析)正在解析响应内容 4 (完成)响应内容解析完成,可以在客户端调用了
status状态码;需要做容错处理:
if (xhr.status == 200) {
alert(xhr.responseText)
}
else {
alert('出错了,' + xhr.status)
}
表单的作用:数据提交
action:地址;默认当前页面<br />
method:数据提交方式 get post enctype:提交数据格式: 默认get方式<br />
"Content-Type","application/x-www-form-urlencoded”
get:把数据名称和数据对应的数据值用等号连接起来,如果有多个会&连接,通过url?后面传入指定页面<br />
PHP接收方式要对应:get $_GET ; post $_POST 当然 $_REQUEST
JSON.stringify() 对象转成字符串
JSON.parse()字符串解析成对象
生成新闻例子一:
整个流程走一遍,数据data转换成对像再处理:var data = JSON.parse(xhr.responseText)
之后即拿数据处理append到ul里
var btn = document.getElementById('btn')
btn.onclick = function () {
var xhr = null
try {
var xhr = new XMLHttpRequest()
}
catch (e) {
var xhr = ActiveXObject('Microsoft.XMLHTTP')
}
xhr.open('get', 'getnews.php', true)
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
// console.log(xhr.responseText);
var data = JSON.parse(xhr.responseText) //转换成对像
var html = ''
var _ul = document.getElementById('ul1')
for (var i = 0; i < data.length; i++) {
html += '<li><a href="">' + data[i].title + '</a></li>[<span>' + data[i].data + '</span>]'
}
_ul.innerHTML = html;
}
else {
alert('出错了,' + xhr.status)
}
}
}
}
get方式,1、缓存问题;可使用时间戳解决,&不能丢;2、乱码,使用encodeURI解决,post无此问题
xhr.open('get', '1.get.php?username=' + encodeURI('小时') + '&age=32&' + new Date().getTime(), true)
1.get.php:
<?php
header('content-type:text/html;charset="utf-8"');
error_reporting(0);
$username = $_POST['username'];
$age = $_POST['age'];
echo "欢迎 你的名字:{$username},年龄:{$age}";
所以,post方式应该时,send()方法里传参,并且要设置请求头:
var btn = document.getElementById('btn')
btn.onclick = function () {
var xhr = null
try {
var xhr = new XMLHttpRequest()
}
catch (e) {
var xhr = ActiveXObject('Microsoft.XMLHTTP')
}
//post时参数传这里
xhr.open('post', '1.get.php', true)
//告诉后端发送数据的类型
xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
xhr.send('username=小时&age=30');
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
alert(xhr.responseText)
}
else {
alert('出错了,' + xhr.status)
}
}
}
}
所以粗略的ajax封装为:
function ajax(method, url, data, success) {
var xhr = null
try {
var xhr = new XMLHttpRequest()
}
catch (e) {
var xhr = ActiveXObject('Microsoft.XMLHTTP')
}
if (method == 'get' && data) {
url += '?' + data
} //如果有数据存在并且方法get()
xhr.open(method, url, true)
if (method == 'get') {
xhr.send();
}
else {
xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
xhr.send(data);
}
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
success && success(xhr.responseText) //如果存在执行
}
else {
alert('出错了,' + xhr.status)
}
}
}
}