• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Ajax和跨域问题深入解析

    什么是ajax

    Ajax(Asynchronous JavaScript and XML),是一种可以向服务器请求额外的数据并且无需刷新页面的技术,ajax的出现带来了更好的用户体验.

    Ajax的核心就是XMLHttpRequest(XHR)对象.XHR为向服务器发送请求和解析服务器响应提供了流畅的接口.可以使用XHR对象获取新数据,通过DOM将新数据插入到页面.虽然名字中包含XML,但是ajax通信和数据格式无关;这种技术就是可以不用刷新就从服务器获取数据,但是不一定是XML数据,也可以是json.

    XMLHttpRequest对象

    XHR的用法

    1.创建一个XMLHttpRequest对象

    2.发送请求

    1).设置请求行 xhr.open()
    2).POST请求需要设置请求头 xhr.setRequestHeader() POST请求头Content-Type的值: application/x-www-form-urlencoded
    3).设置请求体 xhr.send() get请求传null,post根据情况

    3.处理服务器响应

    先判断响应状态码和异步对象是否解析完毕.

    服务器返回的状态码 status

    1xx:消息
    2xx:成功
    3xx:重定向
    4xx:请求错误
    5xx:服务器错误

    异步对象的状态码 readystate

    0:异步对象已经创建
    1:异步对象初始化完成,发送请求
    2:接收服务器返回的原始数据
    3:数据正在解析,解析需要时间
    4:数据解析完成,数据可以使用了

    XML

    XML的特点,出身名门,W3C制定,微软和IBM曾经共同大力推荐过的数据格式.XML 指可扩展标记语言(Extensible Markup Language),被设计用来传输和存储数据,HTML 是设计用来表示页面的.

    语法规则:和HTML差不多,都是通过标记来表示的

    特殊符号:比如>要使用实体-转移字符

    xml的解析需要前后台配合:
    1.后台在返回的时候,在响应头中设置Content-Type的值为 application/xml
    2.前台异步对象在接收后台数据时,记得按照xml的方式来接收,xhr.responseXML,并且它返回的是一个object对象,内容是#document

    JSON

    JSON(JavaScript Object Notation),出身草根,是 Javascript 的子集,专门负责描述数据格式.JSON本身是一个特殊格式的字符串,可以转换成js对象,是网络上用来传输数据使用最广泛的数据格式,没有之一.

    语法规则:数据以 key/value 值对表示,数据由逗号分隔,大括号保存对象,中括号保存数组,名称和值都需要使用双引号包含(这个是和js的一点小区别).
    js中解析/操作JSON:
    1.JSON.parse(json字符串); 将一个json格式的字符串解析成js对象
    2.JSON.stringify(js对象); 将一个js对象转成一个json格式的字符串

    自己封装一个ajax

    function pinjieData(obj) {
     //obj 就相当于 {key:value,key:value}
     //最终拼接成键值对的字符串 "key:value,key:value"
     var finalData = "";
     for(key in obj){
      finalData+=key+"="+obj[key]+""; //key:value,key:value
     }
     return finalData.slice(0,-1);//key:value,key:value
    }
    
    function ajax(obj) {
     var url = obj.url;
     var method = obj.method.toLowerCase();
     var success = obj.success;
     var finalData = pinjieData(obj.data);
     //finalData最终的效果key:value,key:value
    
     //1.创建xhr对象
     var xhr = new XMLHttpRequest();
     //get方法拼接地址,xhr.send(null)
     if (method=='get'){
      url = url + "?"+finalData;
      finalData = null;
     }
    
     //2.设置请求行
     xhr.open(method,url);
    
     // 如果是post请求,要设置请求头
     if (method=='post'){
      xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
     }
    
     //3.发送
     xhr.send(finalData);
    
     //4.监听服务器返回的数据
     xhr.onreadystatechange = function () {
      if (xhr.status==200  xhr.readyState==4){
       var result = null;
       //获取返回的数据类型
       var rType = xhr.getResponseHeader("Content-Type");
       if (rType.indexOf('xml')!=-1){
        result = xhr.responseXML;
       }else if(rType.indexOf('json')!=-1){
        // JSON.parse 的意思是 将 json格式的字符串
        //比如 [{ "src":"./images/nav0.png","content":"商品分类1"}]
        //转成js对象
        result = JSON.parse(xhr.responseText);
       }else{//当成普通的字符串去处理
        result = xhr.responseText;
       }
    
       //将这里解析好的数据交给页面去渲染
       success(result);
      }
     }
    }
    
    

    jQuery中使用ajaxAPI jQuery ajax

    jQuery为我们提供了更便利的ajax封装使用.

    $.ajax({}) 可以配置方式发起ajax请求
    $.get() 以get方式发起ajax请求
    $.post() 以post方式发起ajax请求
    $('form').serialize() 序列化表单(格式化key=val$key=val)

    参数说明

    url :接口地址
    type :请求方式(get/post)
    timeout : 要求为Number类型的参数,设置请求超时时间(毫秒)
    dataType: 应该是客户端传递给服务器一个值,告诉服务器如何进行处理:
    data: 发送请求数据
    beforeSend: 要求为Function类型的参数,发送请求前可以修改XMLHttpRequest对象的函数,例如添加自定义HTTP头。在beforeSend中如果返回false可以取消本次ajax请求.
    success: 成功响应后调用
    error: 错误响应时调用
    complete: 响应完成时调用(包括成功和失败)

     //ajax===get
     $.ajax({
      url:'',
      data:'key=valuekey=value',
      type:'get',
      success:function (result) {
       console.log(result);
      }
     });
    
    //ajax===post
    $.ajax({
      url:'',
      data:'key=valuekey=value',
      type:'post',
      success:function (result) {
       console.log(result);
      }
     });
    
    //$.get
    $.get({
      url:'',
      data:'key=valuekey=value',
      success:function (result) {
      console.log(result);
      }
    });
    
    //$.post
    $.post({
      url:'',
      data:'key=valuekey=value',
      success:function (result) {
      console.log(result);
      }
    });
    //在使用jQuery中ajax发送请求的时候,只需要在 dataType中写上jsonp即可实现ajax的跨域请求
     dataType:'jsonp' 
    
    

    跨域

    通过XHR实现ajax通信的一个主要限制(相同域,相同端口,相同协议),来源于跨服安全策略,默认情况下,XHR只能请求同一域的资源,这是为了防止某些恶意的行为.

    CORS跨域

    CORS(cross-origin resource sharing,跨域源资源共享)定义了在跨域时,浏览器和服务器应该如何沟通.CORS允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。
    CORS支持所有类型的HTTP请求.
    服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。

    JSONP

    JSONP由回调函数和数据组成.JSONP只支持GET请求.JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据.
    JSONP通过动态script>元素来使用,src属性知道一个跨域URL,JSONP是有效的JavaScript代码,浏览器可以跨域请求JS文件.
    优点:简单易用,可以直接访问响应文本,支持在浏览器和服务器之间双向通信.
    缺点:1.JSONP是从其他域加载代码执行,存在不安全风险.2.不好确定JSONP请求是否成败.

    通过修改document.domain来跨子域

    使用window.name来进行跨域

    HTML5中新引进 window.postMessage方法来跨域传送数据

    flash

    iframe

    服务器设置代理页面

    图像Ping

    通过使用标签,利用网页可以从任何网页加载图像原理.
    图像Ping常用于跟踪用户点击页面或动态广告曝光次数.

    2个缺点:1.只支持GET请求.2.无法访问服务器的响应文本.只能用于浏览器与服务器间的单项通信.

    var img = new Image();
    img.onload = img.onerror = function (){
    alert("Done!");
    };
    img.src = "";

    comet

    一种更高级的ajax技术.ajax是页面向服务器请求数据的技术.comet是服务器向页面推送数据的技术.

    SSE (Server-Sent Events) 服务器发送事件

    Web Sockets

    Web Sockets的目标是在一个单独的持久链接上提供全双工,双向通信.

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • 完美解决AJAX跨域问题
    • jquery中ajax处理跨域的三大方式
    • jquery的ajax和getJson跨域获取json数据的实现方法
    • 跨域请求之jQuery的ajax jsonp的使用解惑
    • AJAX跨域请求json数据的实现方法
    • jquery ajax跨域解决方法(json方式)
    • Ajax实现跨域访问的三种方法
    • jquery ajax jsonp跨域调用实例代码
    • JQuery Ajax 跨域访问的解决方案
    • JQuery的Ajax跨域请求原理概述及实例
    上一篇:ajax实现修改功能
    下一篇:通达OA 使用Ajax和工作流插件实现根据人力资源系统数据增加OA账号(图文详解)
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Ajax和跨域问题深入解析 Ajax,和,跨域,问题,深入,