A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 进gege 初级黑马   /  2019-5-31 13:56  /  934 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一、同源
同源是指,域名,协议,端口完全相同。
二、跨域
1、不同源则跨域
1-不允许进行DOM操作
2-不能进行ajax请求
2、设置跨域请求
设置所有域
header( 'Access-Control-Allow-Origin:*' );
设置指定域
header( 'Access-Control-Allow-Origin:http://www.study.com');
三、 JSONP
1、原理剖析

其本质是利用了<script src=""></script>标签具有可跨域的特性,由服务端返回一个预先定义好的Javascript函数的调用,并且将服务器数据以该函数参数的形式传递过来,此方法需要前后端配合完成。

注意:只能以GET方式请求
2、jQuery中的JSONP
jQuery 的$.ajax() 方法当中集成了JSONP的实现,可以非常方便的实现跨域数据的访问。

dataType:'jsonp' 设置dataType值为jsonp即开启跨域访问

jsonp 可以指定服务端接收的参数的“key”值,默认为callback

jsonpCallback 可以指定相应的回调函数,默认自动生成
3、具体代码:
        客户端写法(jQuery)
        $.ajax({
                url : 请求地址,
                data: 请求时要发送的数据,
                dataType: "jsonp",
                //成功后要做的事
                success : function(){ .... }
        })
        客户端写法(原生js)
        function test( data ){
                console.log(data);//处理数据
        }
        var script = document.createElement("script");
        script.src = "xxx.php?callback=test";
        document.body.append(script);
        服务器端:
        <?php
                $callback = $_GET['callback'];
                $arr = array(....);        //数据
                $data = json_encode($arr);
                echo $callback . "(" . $data . ")";
        ?>
四、XMLHttpRequest2.0
1、设置超时
a)    设置超时
xhr.timeout= 2000;

b)    监听超时事件 (如果超时了,怎么处理)
xhr.ontimeout = function () {// code}

当请求超时,此事件就会被触发
2、FormData
a)    提供了一个新的内建对象,可用于管理表单数据
b)    首先要获取一个表单元素form
c)    然后在实例化时 new FormData(form),将表单元素form传进去
d)    会返回一个对象,此对象可以直接做为xhr.send(formData)的参数
e)    此时我们的数据就是以二进制形式传递了
f)     注意我们这里只能以post形式传递,浏览器会自动为我们设置一个合适的请求头
FormData对象:用于一次性收集form表单数据
    var formObj = document.querySelector("form表单");
    var formData = new FormData(formObj);
    //然后直接作为xhr的send参数:
    xhr.send( formData );
    细节:
        2.1)xhr此时只能是post请求
        2.2)xhr此时无需设置请求头
        2.3)FormData还可以追加数据,形式为:
                     formData.append('key', "value");
3、文件上传
a)    我们上传文件是以二进制形式传递的

b)    我们可以通过表单<input type=”file”>获取到一个文件对象

c)    然后file.files[0]可以获取文件信息

d)    然后再利用var formData = new FormData() 实例化

e)    然后再利用formData.append(‘upload’, file.files[0])将文件转成二进制

f)     最后将 formData 做为xhr.send(formData)的参数
4、上传进度
a)    利用XMLHttpRequest我们可以实现文件的上传

b)    并且我们可以通过xhr.upload.onprogress = function (ev) {// code},监听上传的进度

c)    这时我们上传的进度信息会保存在事件对象ev里

d)    ev.loaded 表示已上传的大小,ev.total表示文件整体的大小

e)    var percent = ev.loaded / ev.total
xhr.upload.onprogress = function(e){
        var current = e.loaded;        //已上传 的 数据大小
        var total = e.total;        //要上传的总数据大小
        //然后就可以去根据这两个数据设定进度条的表现了
    }


提示:
        测试大文件,需要去php.in中修改以下两个配置:
        post_max_size,  upload_max_filesize
拓展:
        跨域的几种方式: 1、jsonp 缺点只支持get请求 ;2、proxyTable 反向代理(后期框架里面带有这个,可以配置) ;3、Nginx反向代理(一般后台或者运维配); 4、加入node或php中间层; 5、Nginx正向代理(一般用得很少)6、后端配置cors请求头允许; 还有很多利用标签跨域的,原理都和jsonp差不多

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马