image.png

同源

image.png
这些站点是同源,没有办法分服务器
image.png
四个,可以不在一个服务器上

image.png
image.png
200 304都是成功的

事件

image.png
最好别用,因为这个兼容性不好,是2.0的

image.png

超时

image.png
兼容性不好

超时写法

  1. //原生post请求
  2. var xhr,
  3. t=null;
  4. if (window.XMLHttpRequest) {//判断XMLHttpRequest对象是否存在
  5. xhr = new XMLHttpRequest();
  6. } else {
  7. xhr = new ActiveXObject('Microsoft.XMLHTTP');//ie5/ie6兼容
  8. }
  9. // console.log(xhr.readyState);
  10. // xhr.onload=function(){
  11. // console.log('load');
  12. // }
  13. // xhr.onerror=function(){
  14. // console.log('error');
  15. // }
  16. // xhr.onabort=function(){
  17. // console.log('abort')
  18. // }
  19. // xhr.onloadend=function(){
  20. // console.log('loadend');
  21. // }
  22. // xhr.ontimeout=function(){
  23. // xhr.abort();
  24. // xhr=null;
  25. // }
  26. //得到数据,get请求,地址,true异步请求
  27. xhr.open('POST', 'http://localhost/network/class7/server/get_courses.php?status=1', true);
  28. xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  29. // xhr.timeout=30000;
  30. xhr.send('status=1&flag=2');//发送
  31. //响应
  32. xhr.onreadystatechange = function () {
  33. if (xhr.readyState === 4 && xhr.status === 200) {
  34. // console.log(JSON.parse(xhr.responseText));//返回JSON数据
  35. clearTimeout(t);
  36. t=null;
  37. }
  38. }
  39. t= setTimeout(function() {
  40. xhr.abort();
  41. clearTimeout(t);
  42. t=null;
  43. xhr=null;
  44. },30000)

ajax封装

加上了超时功能

  1. var $ = (function () {
  2. //三元运算符 相当于if else
  3. var o = window.XMLHttpRequest ?
  4. new XMLHttpRequest :
  5. new ActiveXObject('Microsoft.XMLHTTP'),
  6. t=null;
  7. //判断浏览器是否支持ajax请求
  8. if (!o) {
  9. return new Error('您的浏览器不支持异步发起HTTP请求');
  10. }
  11. function _doAjax(opt) {
  12. console.log(opt);
  13. var opt = opt || {},//如果不存在opt,就给它弄个对象,默认值,||后面的是默认值
  14. type = (opt.type || 'GET').toUpperCase(),
  15. // async = opt.async || true,
  16. async = ''+opt.async==='false'?false : true,
  17. url = opt.url,
  18. data = opt.data || null,
  19. timeout=opt.timeout||30000,
  20. error = opt.error || function () { },
  21. success = opt.success || function () { },
  22. complete = opt.complete || function () { };
  23. //处理没有传url的情况
  24. if (!url) {
  25. throw new Error('您没有填写URL');
  26. }
  27. o.onreadystatechange = function () {
  28. // if(o.readyState === 4&&o.status===200){
  29. // success(JSON.parse(o.responseText));
  30. // }
  31. //判断200 4太草率了 因为304也有可能 200 304都能成立
  32. if (o.readyState === 4) {
  33. if (o.readyState >= 200 && o.status < 300 || o.status === 304) {
  34. success(JSON.parse(o.responseText));
  35. }
  36. }
  37. if (o.status === 404) {
  38. error();
  39. }
  40. complete();
  41. clearTimeout(t);
  42. t=null;
  43. o=null;
  44. }
  45. o.open(type, url, async);
  46. //如果type是POST,执行后面语句
  47. type === 'POST' && o.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  48. o.send(type === 'GET' ? null : formatDatas(data));
  49. t=setTimeout(function(){
  50. complete()
  51. o.abort();
  52. clearTimeout(t);
  53. t=null;
  54. o=null;
  55. },timeout);
  56. }
  57. //把服务器传送的json格式的数据转换成 xx&xx&xx
  58. function formatDatas(obj) {
  59. var str = '';
  60. for (var key in obj) {
  61. str += key += '=' + obj[key] + '&';
  62. }
  63. //把最后一个&去掉
  64. return str.replace(/&$/, '');
  65. }
  66. return {
  67. ajax: function (opt) {
  68. _doAjax(opt);
  69. },
  70. post: function (url, data, callback) {
  71. _doAjax({
  72. type: 'POST',
  73. url: url,
  74. data: data,
  75. success: callback
  76. });
  77. },
  78. get: function (url, callback) {
  79. _doAjax({
  80. type: 'GET',
  81. url: url,
  82. success: callback
  83. })
  84. }
  85. }
  86. })();
  87. // 原生ajax调用方法
  88. $.ajax({
  89. type: 'POST',
  90. url: 'http://localhost/network/class7/server/get_courses.php',
  91. data: {
  92. status: 1,
  93. flag: 2 //假参数 后端不接收此字段
  94. },
  95. success: function (data) {
  96. console.log(data);
  97. }
  98. });
  99. $.post('http://localhost/network/class7/server/get_courses.php', {
  100. status: 1,
  101. flag: 2
  102. }, function (data) {
  103. console.log(data);
  104. });
  105. $.get('http://localhost/network/class7/server/get_courses.php?status=1&flag=2', function (data) {
  106. console.log(data);
  107. })

ajax异步同步

异步

  1. var datas=null;
  2. $.ajax({
  3. url:'http://localhost/network/class7/server/get_courses.php',
  4. type: 'POST',
  5. data:{
  6. status:1,
  7. flag:2
  8. },
  9. async:true,
  10. success:function(data) {
  11. console.log(1)//这是异步的 success中的console与全局顺序执行是同时进行的 比全局慢
  12. datas=data;
  13. }
  14. })
  15. console.log(2);//与下面的console一样是同步的
  16. console.log('datas:'+datas);

image.png
是同时进行的,console.log(2)进行的快,所以先打印 ,哪个console.log先完成就打印哪个,success中的最后完成
success与

同步

  1. var datas=null;
  2. $.ajax({
  3. url:'http://localhost/network/class7/server/get_courses.php',
  4. type: 'POST',
  5. data:{
  6. status:1,
  7. flag:2
  8. },
  9. async:false,
  10. success:function(data) {
  11. console.log(1)//这是异步的 success中的console与全局顺序执行是同时进行的 比全局慢
  12. datas=data;
  13. }
  14. })
  15. console.log(2);//与下面的console一样是同步的
  16. console.log('datas:'+datas);

阻塞后续程序的运行
image.png

image.png
image.png

image.png
可以多配置,但也可以不配置那么多

ajax封装

自己封装的小,库大,页面的体积大

  1. var $ = (function () {
  2. function _doAjax(opt) {
  3. console.log(opt);
  4. //得在调用ajax时,新建对象,而不是只有一个对象,要不然两次共用一个对象,应该不同的请求用不同的对象,不能两次都用一个对象
  5. //三元运算符 相当于if else
  6. var o = window.XMLHttpRequest ?
  7. new XMLHttpRequest() :
  8. new ActiveXObject('Microsoft.XMLHTTP'),
  9. t = null;
  10. //得new对象
  11. //判断浏览器是否支持ajax请求
  12. if (!o) {
  13. return new Error('您的浏览器不支持异步发起HTTP请求');
  14. }
  15. var opt = opt || {},//如果不存在opt,就给它弄个对象,默认值,||后面的是默认值
  16. type = (opt.type || 'GET').toUpperCase(),
  17. // async = opt.async || true,
  18. async = '' + opt.async === 'false' ? false : true,
  19. dataType = opt.dataType || 'JSON',
  20. url = opt.url,
  21. data = opt.data || null,
  22. timeout = opt.timeout || 30000,
  23. error = opt.error || function () { },
  24. success = opt.success || function () { },
  25. complete = opt.complete || function () { };
  26. //处理没有传url的情况
  27. if (!url) {
  28. throw new Error('您没有填写URL');
  29. }
  30. o.onreadystatechange = function () {
  31. // if(o.readyState === 4&&o.status===200){
  32. // success(JSON.parse(o.responseText));
  33. // }
  34. //判断200 4太草率了 因为304也有可能 200 304都能成立
  35. if (o.readyState === 4) {
  36. if ((o.readyState >= 200 && o.status < 300) || o.status === 304) {
  37. // success(JSON.parse(o.responseText));
  38. switch (dataType.toUpperCase()) {
  39. case 'JSON':
  40. success(JSON.parse(o.responseText));
  41. break;
  42. case 'TEXT':
  43. success(o.responseText);
  44. break;
  45. case 'XML':
  46. success(o.responseXML);
  47. break;
  48. default:
  49. success(JSON.parse(o.responseText))
  50. }
  51. } else {
  52. error()
  53. }
  54. complete();
  55. clearTimeout(t);
  56. t = null;
  57. o = null;
  58. }
  59. // if (o.status === 404) {
  60. // error();
  61. // }
  62. }
  63. o.open(type, url, async);
  64. //如果type是POST,执行后面语句
  65. type === 'POST' && o.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  66. o.send(type === 'GET' ? null : formatDatas(data));
  67. t=setTimeout(function(){
  68. o.abort();
  69. clearTimeout(t);
  70. t=null;
  71. o=null;
  72. // complete()
  73. throw new Error('This request has been timeout for'+url);//下面的不执行
  74. },timeout);
  75. }
  76. //把服务器传送的json格式的数据转换成 xx&xx&xx
  77. function formatDatas(obj) {
  78. var str = '';
  79. for (var key in obj) {
  80. str += key += '=' + obj[key] + '&';
  81. }
  82. //把最后一个&去掉
  83. return str.replace(/&$/, '');
  84. }
  85. return {
  86. ajax: function (opt) {
  87. _doAjax(opt);
  88. },
  89. post: function (url, data, callback) {
  90. _doAjax({
  91. type: 'POST',
  92. url: url,
  93. data: data,
  94. success: callback
  95. });
  96. },
  97. get: function (url, callback) {
  98. _doAjax({
  99. type: 'GET',
  100. url: url,
  101. success: callback
  102. })
  103. }
  104. }
  105. })();