同源
这些站点是同源,没有办法分服务器
四个,可以不在一个服务器上
200 304都是成功的
事件
最好别用,因为这个兼容性不好,是2.0的
超时
兼容性不好
超时写法
//原生post请求
var xhr,
t=null;
if (window.XMLHttpRequest) {//判断XMLHttpRequest对象是否存在
xhr = new XMLHttpRequest();
} else {
xhr = new ActiveXObject('Microsoft.XMLHTTP');//ie5/ie6兼容
}
// console.log(xhr.readyState);
// xhr.onload=function(){
// console.log('load');
// }
// xhr.onerror=function(){
// console.log('error');
// }
// xhr.onabort=function(){
// console.log('abort')
// }
// xhr.onloadend=function(){
// console.log('loadend');
// }
// xhr.ontimeout=function(){
// xhr.abort();
// xhr=null;
// }
//得到数据,get请求,地址,true异步请求
xhr.open('POST', 'http://localhost/network/class7/server/get_courses.php?status=1', true);
xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
// xhr.timeout=30000;
xhr.send('status=1&flag=2');//发送
//响应
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
// console.log(JSON.parse(xhr.responseText));//返回JSON数据
clearTimeout(t);
t=null;
}
}
t= setTimeout(function() {
xhr.abort();
clearTimeout(t);
t=null;
xhr=null;
},30000)
ajax封装
加上了超时功能
var $ = (function () {
//三元运算符 相当于if else
var o = window.XMLHttpRequest ?
new XMLHttpRequest :
new ActiveXObject('Microsoft.XMLHTTP'),
t=null;
//判断浏览器是否支持ajax请求
if (!o) {
return new Error('您的浏览器不支持异步发起HTTP请求');
}
function _doAjax(opt) {
console.log(opt);
var opt = opt || {},//如果不存在opt,就给它弄个对象,默认值,||后面的是默认值
type = (opt.type || 'GET').toUpperCase(),
// async = opt.async || true,
async = ''+opt.async==='false'?false : true,
url = opt.url,
data = opt.data || null,
timeout=opt.timeout||30000,
error = opt.error || function () { },
success = opt.success || function () { },
complete = opt.complete || function () { };
//处理没有传url的情况
if (!url) {
throw new Error('您没有填写URL');
}
o.onreadystatechange = function () {
// if(o.readyState === 4&&o.status===200){
// success(JSON.parse(o.responseText));
// }
//判断200 4太草率了 因为304也有可能 200 304都能成立
if (o.readyState === 4) {
if (o.readyState >= 200 && o.status < 300 || o.status === 304) {
success(JSON.parse(o.responseText));
}
}
if (o.status === 404) {
error();
}
complete();
clearTimeout(t);
t=null;
o=null;
}
o.open(type, url, async);
//如果type是POST,执行后面语句
type === 'POST' && o.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
o.send(type === 'GET' ? null : formatDatas(data));
t=setTimeout(function(){
complete()
o.abort();
clearTimeout(t);
t=null;
o=null;
},timeout);
}
//把服务器传送的json格式的数据转换成 xx&xx&xx
function formatDatas(obj) {
var str = '';
for (var key in obj) {
str += key += '=' + obj[key] + '&';
}
//把最后一个&去掉
return str.replace(/&$/, '');
}
return {
ajax: function (opt) {
_doAjax(opt);
},
post: function (url, data, callback) {
_doAjax({
type: 'POST',
url: url,
data: data,
success: callback
});
},
get: function (url, callback) {
_doAjax({
type: 'GET',
url: url,
success: callback
})
}
}
})();
// 原生ajax调用方法
$.ajax({
type: 'POST',
url: 'http://localhost/network/class7/server/get_courses.php',
data: {
status: 1,
flag: 2 //假参数 后端不接收此字段
},
success: function (data) {
console.log(data);
}
});
$.post('http://localhost/network/class7/server/get_courses.php', {
status: 1,
flag: 2
}, function (data) {
console.log(data);
});
$.get('http://localhost/network/class7/server/get_courses.php?status=1&flag=2', function (data) {
console.log(data);
})
ajax异步同步
异步
var datas=null;
$.ajax({
url:'http://localhost/network/class7/server/get_courses.php',
type: 'POST',
data:{
status:1,
flag:2
},
async:true,
success:function(data) {
console.log(1)//这是异步的 success中的console与全局顺序执行是同时进行的 比全局慢
datas=data;
}
})
console.log(2);//与下面的console一样是同步的
console.log('datas:'+datas);
是同时进行的,console.log(2)进行的快,所以先打印 ,哪个console.log先完成就打印哪个,success中的最后完成
success与
同步
var datas=null;
$.ajax({
url:'http://localhost/network/class7/server/get_courses.php',
type: 'POST',
data:{
status:1,
flag:2
},
async:false,
success:function(data) {
console.log(1)//这是异步的 success中的console与全局顺序执行是同时进行的 比全局慢
datas=data;
}
})
console.log(2);//与下面的console一样是同步的
console.log('datas:'+datas);
阻塞后续程序的运行
可以多配置,但也可以不配置那么多
ajax封装
自己封装的小,库大,页面的体积大
var $ = (function () {
function _doAjax(opt) {
console.log(opt);
//得在调用ajax时,新建对象,而不是只有一个对象,要不然两次共用一个对象,应该不同的请求用不同的对象,不能两次都用一个对象
//三元运算符 相当于if else
var o = window.XMLHttpRequest ?
new XMLHttpRequest() :
new ActiveXObject('Microsoft.XMLHTTP'),
t = null;
//得new对象
//判断浏览器是否支持ajax请求
if (!o) {
return new Error('您的浏览器不支持异步发起HTTP请求');
}
var opt = opt || {},//如果不存在opt,就给它弄个对象,默认值,||后面的是默认值
type = (opt.type || 'GET').toUpperCase(),
// async = opt.async || true,
async = '' + opt.async === 'false' ? false : true,
dataType = opt.dataType || 'JSON',
url = opt.url,
data = opt.data || null,
timeout = opt.timeout || 30000,
error = opt.error || function () { },
success = opt.success || function () { },
complete = opt.complete || function () { };
//处理没有传url的情况
if (!url) {
throw new Error('您没有填写URL');
}
o.onreadystatechange = function () {
// if(o.readyState === 4&&o.status===200){
// success(JSON.parse(o.responseText));
// }
//判断200 4太草率了 因为304也有可能 200 304都能成立
if (o.readyState === 4) {
if ((o.readyState >= 200 && o.status < 300) || o.status === 304) {
// success(JSON.parse(o.responseText));
switch (dataType.toUpperCase()) {
case 'JSON':
success(JSON.parse(o.responseText));
break;
case 'TEXT':
success(o.responseText);
break;
case 'XML':
success(o.responseXML);
break;
default:
success(JSON.parse(o.responseText))
}
} else {
error()
}
complete();
clearTimeout(t);
t = null;
o = null;
}
// if (o.status === 404) {
// error();
// }
}
o.open(type, url, async);
//如果type是POST,执行后面语句
type === 'POST' && o.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
o.send(type === 'GET' ? null : formatDatas(data));
t=setTimeout(function(){
o.abort();
clearTimeout(t);
t=null;
o=null;
// complete()
throw new Error('This request has been timeout for'+url);//下面的不执行
},timeout);
}
//把服务器传送的json格式的数据转换成 xx&xx&xx
function formatDatas(obj) {
var str = '';
for (var key in obj) {
str += key += '=' + obj[key] + '&';
}
//把最后一个&去掉
return str.replace(/&$/, '');
}
return {
ajax: function (opt) {
_doAjax(opt);
},
post: function (url, data, callback) {
_doAjax({
type: 'POST',
url: url,
data: data,
success: callback
});
},
get: function (url, callback) {
_doAjax({
type: 'GET',
url: url,
success: callback
})
}
}
})();