[关闭]
@GivenCui 2017-05-22T08:41:40.000000Z 字数 3486 阅读 720

Ajax进阶

ajax


URL编码(encode)

原生

简单明了区分escape、encodeURI和encodeURIComponent
菜鸟教程

escape <--> unescape()
encodeURI <--> decodeURI
encodeURIComponent <--> decodeURIComponent

  1. // URL编码
  2. 1、如果只是编码字符串,不和URL有半毛钱关系,那么用escape(汉字)。
  3. 2、如果你需要编码整个URL,然后需要使用这个URL,那么用encodeURI
  4. eg.
  5. encodeURI("http://www.cnblogs.com/season-huang/some other thing");
  6. 3、当你需要编码URL中的参数的时候,那么encodeURIComponent是最好方法。
  7. 注意: 针对单独的键或单独的值,因为=也会被转义
  8. eg.
  9. var param = "http://www.cnblogs.com/season-huang?test=&123"; //param为参数
  10. param = encodeURIComponent(param);
  11. var url = "http://www.cnblogs.com?next=" + param;
  12. console.log(url)

js原生Ajax

xhr

xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.onreadystatechange()
xhr.readyState
xhr.status
xhr.responseText
xhr.statusText

  1. // 新建一个XMLHttpRequest的实例
  2. var xhr = new XMLHttpRequest();
  3. // 向远程主机发出一个HTTP请求 (区别GET和POST)
  4. xhr.open('GET', 'example.php');
  5. /*post请求需要设置请求头*/
  6. xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  7. /*~end*/
  8. xhr.send(null); // post: xhr.send(data)
  9. // 等待远程主机做出回应。这时需要监控XMLHttpRequest对象的状态变化,指定回调函数。
  10. xhr.onreadystatechange = function(){
  11.   if ( xhr.readyState == 4 && xhr.status == 200 ) {
  12.     alert( xhr.responseText ); // xhr.responseText就是返回的结果
  13.   } else {
  14.     alert( xhr.statusText ); // xhr.status对应的文字 200 -> OK
  15.   }
  16. };

image_1bgfofil1igs1r9f13l4gch1r5t9.png-62.7kB

  1. /*
  2. * 封装ajax
  3. */
  4. /*
  5. * 分析: 需要5个参数
  6. * 参数分别为:
  7. * method : post或get
  8. * url : 请求路径
  9. * data : url后跟的参数
  10. * successCallBackFn : 响应成功的回调函数
  11. * failCallBackFn : 响应失败的回调函数
  12. */
  13. function ajaxFn (method, url, data, successCallBackFn, failCallBackFn) {
  14. // 创建请求对象
  15. var xhr = createXHR();
  16. // 打开链接 和 发送请求
  17. if (method == "GET"||method=="get") {
  18. // 利用ajax GET请求会有缓存, 为了避免每次访问的路径不一样.
  19. // 解决方法: 在url后面加上Math.random()来解决
  20. xhr.open (method,url + "?" + data + Math.random(), true); // data中包含了&等的字符串
  21. xhr.send(null);
  22. } else if (method == "POST"||method=="post") {
  23. xhr.open(method, url, true);
  24. // post请求需要设置请求头
  25. xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  26. xhr.send(data);
  27. } else{
  28. console.log("请求方式不对!");
  29. }
  30. // 请求响应
  31. xhr.onreadystatechange = function () {
  32. // 问题代码,xhr.readyState会返回2,3,4
  33. /*if (xhr.readyState ==4 && xhr.status == 200) {
  34. // 回调成功的函数
  35. successCallBackFn (xhr.responseText);
  36. } else {
  37. // 失败函数
  38. }*/
  39. if (xhr.readyState ==4 ) {
  40. if (xhr.status == 200) {
  41. // 回调成功的函数
  42. successCallBackFn (JSON.parse(xhr.responseText));
  43. } else {
  44. // 失败函数
  45. failCallBackFn();
  46. }
  47. }
  48. };
  49. return xhr;
  50. }
  51. /*
  52. IE5+ 共用3个版本
  53. new ActiveXObject("MSXML2.XMLHttp.6.0");
  54. new ActiveXObject("MSXML2.XMLHttp.3.0");
  55. new ActiveXObject("MSXML2.XMLHttp");
  56. IE7+,及主流
  57. new XMLHttpRequest();
  58. */
  59. function createXHR () {
  60. // IE7+, 及主流浏览器
  61. if (typeof XMLHttpRequest != "undefined") {
  62. return new XMLHttpRequest();
  63. // IE5, IE6的三个版本
  64. } else if (typeof ActiveXObject != "undefined") {
  65. if ( typeof arguments.callee.activeXString != "string") {
  66. var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"];
  67. for (var i = 0, len = versions.length; i < len; i++) {
  68. try {
  69. new ActiveXObject(versions[i]);
  70. arguments.callee.activeXString = versions[i];
  71. break;
  72. } catch (ex) {
  73. // 跳过
  74. }
  75. }
  76. }
  77. return new ActiveXObject(arguments.callee.activeXString);
  78. // 浏览器不支持XHR
  79. } else {
  80. throw new Error("No XHR object available.");
  81. }
  82. }
  83. /*
  84. 用法:
  85. var xhr = createXHR();
  86. */

xhr2

大熊君学习html5系列之------XHR2(XMLHttpRequest Level 2)

  1. * 可以设置HTTP请求的时限。
  2. * 可以使用FormData对象管理表单数据。
  3. * 可以上传文件。
  4. * 可以请求不同域名下的数据(跨域请求)。
  5. * 可以获取服务器端的二进制数据。
  6. * 可以获得数据传输的进度信息。

jQuery中的Ajax

jQuery API
基于$.ajax实现数据的跨域增删查改
jQuery基础(五)一Ajax应用与常用插件 @慕课网

  1. // 用百度搜索框举例jsonp
  2. // https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&cb=jQ123
  3. $.ajax({
  4. url:'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su', // cb=?,jQuery 将自动替换 ? 为正确的函数名,以执行回调函数
  5. type:'get',
  6. dataType:'jsonp',
  7. jsonp:'cb',
  8. data : 'wd=a,&cb=?',
  9. jsonpCallback:'jQTest123', // 不设置,自动生成
  10. success:function(data){console.log(data.s)}
  11. })

vue-resource中的ajax

vue-resource全攻略

相关http概念

使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注