前端学习笔记—Ajax和跨域处理

Ajax(Asynchronous JavaScript and XML):是指一种创建交互式的网页开发技术。
Ajax不是一种单一的技术,是多个技术的组合。它是把JavaScript、CSS、DOM和HTML结合起来的一种编程思路和方法的统称。Ajax技术颠覆了以往界面像服务端请求数据,需要重新刷新整个页面对这个数据做出展示的行为;只需要发出异步请求,等请求结果返回客户端后,在回调函数内对需要改变的部分界面进行数据绑定和显示,做到只需要刷新部分页面区域的功能而无需每次刷新整个页面,现在都是最常见的基本操作了。

Ajax的技术核心是XMLHttpRequest对象,而XMLHttpRequest说白了就是一个网络框架。Ajax的含义是使用JavaScript通过XMLHttpRequest对象进行与服务器的通信,返回xml,json,html或者其他任何一种文本格式的数据,然后对数据进行处理,异步显示界面等行为的一种编程操作。

1、网络请求

原生js处理ajax网络请求.png

jQuery处理ajax网络请求.png
//原生JavaScript  ajax网络请求
  var usernameStr = '超人来了';
        var xhrSend = new XMLHttpRequest();
        xhrSend.open('POST', 'http://localhost:8000/muxiInfo', true);
        xhrSend.setRequestHeader('Content-Type', 'application/json');
        xhrSend.send(JSON.stringify({ UserName: usernameStr }));
    //----------同步写法---onload
        xhrSend.onload = function () {
            if (xhrSend.status == 200) {
                console.log('--sendTest-接收:' + xhrSend.responseText);
                var data = JSON.parse(xhrSend.responseText);
                httpShow.innerHTML = data.message;
            } else {
                httpShow.innerHTML = '异常了呢';
            }
        };
   //-----------异步写法----onreadystatechange
  xhr.onreadystatechange = function () {
            if (xhr.readyState == 4) {
                isSending = false;
                if (xhr.status == 200) {
                   console.log('--sendTest-接收:' + xhrSend.responseText);
                    httpShow.innerHTML = xhr.response;
                } else {
                    httpShow.innerHTML = '请求成功,但是返回异常了呢';
                }
            } else {
                //其他状态,时刻监听
            }
        }
ajax1.png
//jQuery框架  ajax网络请求
 $.ajax({
            url: 'http://localhost:8000/muxiInfo',
            //请求参数
            data: { UserName: '李牛Ajax' },
            //请求类型POST/GET,不区分大小写
            type: 'POST',
            //发送server的参数类型
            contentType: 'application/json',
            //期望server响应返回的结果类型
            dataType: 'json',
            //是否异步请求,默认true
            async:true,
           //超时时间
            timeout: 2000,
            //成功回调
            success: function (data) {
                console.log(data);
                httpShow.innerHTML = data.message;
            },
            //失败回调
            error: function (e) {
                httpShow.innerHTML = e
            }
        })

2、跨域问题解决方案:

JSONP利用<script>标签、设置Cors请求头、jQuery通过外链 <script> 来实现、WebSocket通信
  • 方案1:JSONP原生方法实现,利用<script>标签,使用程序员自己实现的巧妙方法“JSONP”跨域,只能处理GET请求
script
script
image.png
  • 方案2:使用jQuery请求实现

jQuery跨域的原理也是通过外链 <script> 来实现的,和JSONP同理,然后在通过回调函数加上回调函数的参数来实现真正的跨域,默认callback函数名,可自定义。
jQuery 在每次跨域发送请求时都会有callback这个参数,其实这个参数的值就是回调函数名称,所以,服务器端在发送json数据时,应该把这个参数放到前面并加上括号,这个参数的值往往是随机生成的,如:jQuery1294734708682,同时也可以通过 $.ajax 方法设置 jsonpcallback 方法的名称。明白了原理后,服务器端应该这样发送数据:

1. jsonp、jsonpcallback,jsonp跨域时可以自定义的两个参数
2. jsonp: 回掉函数名的参数名,默认callback,服务端通过它来获取到回掉函数名
3. jsonpCallback: 回掉函数名,默认jquery自动生成

//前端发送格式
如:http://xxx.html?jsonp=jsonpCallback&xxxx&xxx,默认:http://xxx.html?callback=jQuery13213_564964&xxxx&xxx

//服务端发送格式
string message = "jQuery13213_564964({\"userid\":0,\"username\":\"null\"})";//服务端返回到前端js引擎解析,调用jQuery13213_564964()函数
jq
jq
  • 方案3:设置Cors请求头
    Cors
Cors
  • 方案4:使用WebSocket通信
    image.png
  • 设置代理服务器:通过同一域名端口下设置代理服务器去请求目标服务器返回数据
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、Ajax 基础 传统网站中存在的问题 网速慢的情况下,页面加载时间长,用户只能等待 表单提交后,如果一项内容不...
    AizawaSayo阅读 656评论 0 1
  • 首先说下,这个笔记是学习慕课网视频做的笔记,为了方便自己回顾一下做的笔记。视频出自晓风轻,视频更清楚可以去看。 用...
    ddxueyu阅读 275评论 0 0
  • 跨域的由来 实际上浏览器为了保证安全性,对ajax使用了一种同源策略 同源的意思就是:ajax发送请求的url地址...
    印象rcj阅读 242评论 0 0
  • 关于面试 技术面试 负责人面试 HR面试 面试准备 JD描述分析 业务分析 技术栈准备jquery:源码研究:核心...
    冰淇wbq阅读 3,486评论 0 56
  • AJAX之前 回顾一下最早向服务器发请求的方式 表单发送,最早的发请求方式,可以发各种类型的请求,缺点是每次发送完...
    Criya阅读 298评论 0 1