美文网首页
《前端JavaScript面试技巧》学习笔记( 8 ) Ajax

《前端JavaScript面试技巧》学习笔记( 8 ) Ajax

作者: 一杯浊酒 | 来源:发表于2017-09-21 20:37 被阅读64次

    问题

    手动编写一个 ajax ,不依赖第三方库
    跨域的几种实现方式

    知识点

    1: XMLHttpRequestajax 的核心 API
    2: 状态码说明
    3: 跨域


    • XMLHttpRequest
    var xhr = new XMLHttpRequest(); //创建xhr对象
    xhr.open('GET','/api',false);
    xhr.onreadystatechange = function() {
        //这里的函数异步执行,可以参考之前js基础中的 异步模块
        if (xhr.readyState == 4) { //状态的变化
            if (xhr.status == 200) { //服务端返回的状态码
                console.log(responseText) //服务端返回的内容
            }
        }
    }
    xhr.send(null)
    

    IE 低版本使用 ActiveObject, 跟 W3C 标准不一样


    • 状态码说明
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) { //状态的变化
            if (xhr.status == 200) { //服务端返回的状态码
                console.log(responseText) //服务端返回的内容
            }
        }
    }
    

    每次readyState 变化的时候,都会触发onreadystatechange 函数的执行
    readyState

    • 0 (未初始化) 还没有调用send() 方法
    • 1 (载入) 已调用 send() 方法,正在发送请求
    • 2 (载入完成) send() 方法执行完成,已经接受到全部响应内容
    • 3 (交互) 正在解析响应内容
    • 4 (完成) 响应内容解析完成,可以在客户端调用了

    status http状态码

    • 2xx - 成功处理请求。如200
    • 3xx - 需要重定向,浏览器直接跳转
    • 4xx - 客户端请求错误,如404(地址错误)
    • 5xx - 服务器端错误

    • 跨域
    • 什么是跨域? 浏览器有同源策略,不予许 ajax 访问其它域接口
    • 跨域条件: 协议 、域名 、端口, 有一个不同,就算跨域

    可以跨域加载资源的三个标签

    • < img src =xxx >
    • < link href = xxx>
    • < script src = xxx>

    三个标签的场景

    • <img> 用于打点统计,统计网站可能是其它域

    • <link>,<script>可以使用CDN,CDN也是其它域

    • <script>可以用于JSONP

    • JSONP
      JSONP实现原理
      加载http://coding.m.imooc.com/classindex.html,不一定服务器端真的有一个classindex.html文件,服务器可以根据请求动态生成一个文件来返回,同理于<script src='http://coding.m.imooc.com/api.js'>

    • 实现原理
      假如你的网站要跨域访问慕课网的一个接口,慕课网给你一个地址http://coding.m.imooc.com/api.js,返回内容格式如callback({x:100, y:200})(可动态生成)

    <script>
    window.callback=function(data){
    //这是我们跨域得到的信息
    console.log(data);
    }
    </script>
    <script src='http://coding.m.imooc.com/api.js'></script>
    <!-- 以上将返回callback({x:100,y:200}) -->
    

    服务端设置http header
    另外一个解决跨域的简单方法,需要服务器端来做,但是作为交互方,我们必须知道这个方法,是将来解决跨域问题的一个趋势

    /注意:不同后端语言的写法可能不一样
    //第二个参数填写允许跨域的域名称,不建议直接写"*"
    response.setHeader('Access-Control-Allow-Origin','http://a.com,http://b.com');
    response.setHeader('Access-Control-Allow-Headers','X-Request-With');
    response.setHeader('Access-Control-Allow-Methods','PUT,POST,GET,DELETE,OPTIONS');
    //接受跨域的cookie
    response.setHeader('Access-Control-Allow-Credentials','true');
    

    相关文章

      网友评论

          本文标题:《前端JavaScript面试技巧》学习笔记( 8 ) Ajax

          本文链接:https://www.haomeiwen.com/subject/ihbtextx.html