Ajax

原生Ajax

基于XMLHttpRequest对象

  1. // 跨浏览器支持
  2. /*
  3. XmlHttpRequest
  4. IE7+, Firefox, Chrome, Opera, etc.
  5. ActiveXObject("Microsoft.XMLHTTP")
  6. IE6, IE5
  7. */
  8. function GetXHR(){
  9. var xhr = null;
  10. if(XMLHttpRequest){
  11. xhr = new XMLHttpRequest();
  12. }else{
  13. xhr = new ActiveXObject("Microsoft.XMLHTTP");
  14. }
  15. return xhr;
  16. }
  17. // post请求
  18. function XhrPostRequest(){
  19. var xhr = GetXHR();
  20. var formData = new FormData();
  21. formData.append('k1', 'v1');
  22. // 定义回调函数
  23. xhr.onreadystatechange = function(){
  24. if(xhr.readyState == 4){
  25. // 已经接收到全部响应数据,执行以下操作
  26. var data = xhr.responseText;
  27. console.log(data);
  28. }
  29. };
  30. // 指定连接方式和地址----文件方式
  31. xhr.open('POST', "/test/", true);
  32. // 设置请求头
  33. // 使用FormData对象不用加该请求头
  34. xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8');
  35. // 发送请求
  36. xhr.send('n1=1;n2=2;');
  37. // formData
  38. xhr.send(formData)
  39. }
  40. // get请求
  41. function XhrGetRequest(){
  42. var xhr = GetXHR();
  43. // 定义回调函数
  44. xhr.onreadystatechange = function(){
  45. if(xhr.readyState == 4){
  46. // 已经接收到全部响应数据,执行以下操作
  47. var data = xhr.responseText;
  48. console.log(data);
  49. }
  50. };
  51. // 指定连接方式和地址----文件方式
  52. xhr.open('get', "/test/", true);
  53. // 发送请求
  54. xhr.send();
  55. }

jQuery Ajax

内部基于原生Ajax

  1. $.ajax({
  2. url: '',
  3. type: 'POST',
  4. data: {'a1': '', 'a2': ''}
  5. success: function(res){
  6. }
  7. })

伪Ajax

  • 非XMLHttpRequest
  • <iframe>标签,不刷新发送http请求
  1. <form id='f1' method='POST' action='' target='ifr'>
  2. <iframe id='ifr' name='ifr' style='display:none'></iframe>
  3. <input type='text' name='user'>
  4. <a onclick='submitForm()'>提交</a>
  5. </form>
  6. <script>
  7. function submitForm(){
  8. document.getElementById('ifr').onload=loadIframe;
  9. document.getElementById('f1').submit();
  10. }
  11. function loadIframe(){
  12. var content = document.getElementById('ifr').contentWindow.document.body.innerText;
  13. }
  14. </script>

Ajax跨域,JSONP

只能发送get请求

Ajax:访问其他域名URL被阻止

浏览器:同源策略

  • 禁止:Ajax跨域发送请求时,再回来时浏览器拒绝接受
  • 允许:script标签没有禁止
  1. <button onclick='send()'>发送</button>
  2. <script>
  3. function list(arg){
  4. console.log(arg);
  5. }
  6. function send(){
  7. var tag = document.createElement('script');
  8. tag.src = 'http://xxxxxx?callback=list';
  9. // http://xxxxxx 返回是数据必须是 liat(数据);这个格式
  10. document.head.appendElement(tag);
  11. }
  12. </script>

jQuery Jsonp

  1. $.ajax({
  2. url: 'xxx',
  3. type:'GET',
  4. dataType: 'JSONP',
  5. jsonp: 'callback',
  6. jsonpCallback: 'list',
  7. })
  8. function list(args){
  9. console.log(args);
  10. }

CORS

可以发任何请求

简单请求

请求方式:HEAD、GET、POST

添加响应头 Access-Control-Allow-Origin

  1. obj = HttpResponse()
  2. obj['Access-Control-Allow-Origin'] = 'http://xxx.xx' # 允许指定的域名
  3. obj['Access-Control-Allow-Origin'] = '*' # 允许的所有域名

复杂请求

复杂请求需要先预检

  1. if request.method == 'OPTIONS':
  2. obj = HttpResponse()
  3. obj['Access-Control-Allow-Origin'] = '*'
  4. obj['Access-Control-Allow-Methods'] = 'DELETE' # 允许DELETE请求
  5. return obj
  6. obj = HttpResponse('xxx')
  7. obj['Access-Control-Allow-Origin'] = '*'
  8. return obj

Ajax 上传文件

XMLHttpRequest

  1. <input type='file' id='f1'/>
  2. <a onclick='upload1()'>XMLHttpRequest上传</a>
  3. <a onclick='upload2()'>jQuery上传</a>
  4. <script>
  5. function upload1(){
  6. var formData = new FormData();
  7. formData.append('k1', 'v1');
  8. // jQuery 转 document
  9. $('#f1')[0] // jQuery 对象 取第0个元素就是document对象
  10. //document 转 jQuery
  11. $(document.getElementById('f1')) // document 加$
  12. formData.append('imgFile', $('#f1')[0].files[0]);
  13. var xhr = new XMLHttpRequest();
  14. xhr.onreadystatechange = function(){
  15. if(xhr.readyState == 4){
  16. // 等到返回的路径
  17. var file_path = xhr.responseText;
  18. }
  19. }
  20. xhr.open('POST', '/upload/');
  21. xhr.send(formData);
  22. }
  23. function upload2(){
  24. var formData = new FormData();
  25. formData.append('k1', 'v1');
  26. formData.append('imgFile', document.getElementById('f1').files[0]);
  27. $.ajax({
  28. url:'/upload/',
  29. type:'POST',
  30. data: formData,
  31. // 使用FormData需要告诉jQuery对数据无需处理
  32. contentType:false,
  33. processData:false,
  34. success: function(arg){
  35. }
  36. })
  37. }
  38. </script>

伪Ajax

兼容性更好

  1. <form id='form1' method='POST' action='/upload/' target='ifr' enctype='multipart/form-data'>
  2. <iframe id='ifr' name='ifr' style='display:none'></iframe>
  3. <input typpe='file' name='img' />
  4. <button onclick='upload()'>上传</button>
  5. </form>
  6. <script>
  7. function upload(){
  8. document.getElementById('ifr').onload=loadIframe;
  9. document.getElementById('f1').submit();
  10. }
  11. function loadIframe(){
  12. var content = document.getElementById('ifr').contentWindow.document.body.innerText;
  13. }
  14. </script>

图片预览

ajax上传预览

  1. 将图片上传到临时文件夹中, 返回url
  2. 提交时将图片拷贝到存放目录中

本地预览

  1. // 只有高级浏览器支持
  2. var obj = $(this)[0].files[0];
  3. var v = window.URL.createObjectURL(obj);
  4. $('#img').attr('src', v);
  5. //需要手动释放
  6. $('#img').load(function(){
  7. window.URL.revokeObjectURL(v); // 手动释放,需要图片在页面上显示后再释放
  8. }
  9. //-------
  10. // 会自动释放内存
  11. var reader = newFileReader()
  12. reader.readAsDataFile(obj)
  13. reader.onload = function(e){
  14. $('#img').attr('src', this.result)
  15. }

XMLHttpRequest对象

主要方法

  1. void open(String method, String url, Boolean async)
  2. 用于创建请求
  3. 参数:
  4. method: 请求方式(String),如'POST','GET','DELETE'...
  5. url: 要请求的地址(String)
  6. async: 是否异步(Boolean)
  7. void send(String body)
  8. 用于发送请求
  9. 参数:
  10. body:要发送的数据(String)
  11. void setRequestHeader(String header, String Value)
  12. 用于设置请求头
  13. 参数:
  14. header:请求头的key(String)
  15. value: 请求头的value(String)
  16. String getAllResponseHeaders()
  17. 获取所有响应头
  18. 返回值:
  19. 响应头数据(String)
  20. String getResponseHeader(String header)
  21. 获取响应头中指定header的值
  22. 参数:
  23. header: 响应头的key(String)
  24. 返回值:
  25. 响应头中指定的header对应的值
  26. void abort()
  27. 终止请求

主要属性

  1. Number readyState
  2. 状态值(整数)
  3. 0 未初始化, 尚未调用open()方法
  4. 1 启动, 调用了open()方法,未调用send()方法
  5. 2 发送,已经调用send()方法,未接收到响应
  6. 3 接收,已经接收到部分响应数据
  7. 4 完成,已经接收到全部响应数据
  8. Function onreadystatechange
  9. redayState的值改变时自动触发执行其对于的函数(回调函数)
  10. String responseText
  11. 服务器返回的数据(String)
  12. XmlDocument responseXML
  13. 服务器返回的数据(Xml对象)
  14. Number states
  15. 状态码,如 200, 404...
  16. String statesText
  17. 状态文本