Ajax跨域

一、Ajax介绍:

Ajax是jQuery的一个方法,它的全称是AsynchronousJavascript+XML,即异步的JavaScript和Xml。它通过JavaScript的XMLHttpRequest 对象来直接与服务器进行通信,通过这个对象,JavaScript可是在不重载整个页面的情况下完成Web与服务器的交互。即当一个页面只有局部更改时,使用Ajax提交可以不用刷新整个页面,从而减少对服务器的请求,节省网络带宽。客户端也无须等待整个页面加载完成后再进行其它的操作。

1、浏览器同源策略:

同源策略是浏览器出于安全性而制定的策略。同源是指url中的协议、域名和端口号都相同。若其中有一个不同,比如域名A中的页面要调用域名B中的数据时(即跨域请求),就会被禁止。

2、如何解决跨域请求:

幸运的是,在域名A的页面上引用域名B的js文件是可以的(不仅是js,只要是拥有 “scr” 这个属性的标签都是可以跨域的,比如<img>、<iframe>标签),这样我们可以将请求的数据放在js文件中,以该js文件为载体传递给调用着就可以了。Jsonp正式利用这个特性来解决跨域请求的。

3、Jsonp介绍:

Jsonp是一种非正式的json传输协议,json是一种最常用的数据交换方式,也是跨域之前数据传递最好的选择。

当域A调用域B中的js文件时,可以在ajax中指定一个callback参数发给服务端。服务端将请求的数据放在json文件中,并使用callback定义的参数作为函数名,包裹住json返回给客户端。这样,客户端可以随意指定callback参数(即函数名)来处理请求得到的数据。

如callback参数为data,则请求返回的数据格式为data({'a':'1','b':'2','c':'3'})。

 

Jsonp本质是动态添加<script>标签来调用远程服务器提供的js文件。

Ajax本质是通过XmlHttpRequest获取非本页内容。

 

二、Ajax使用:

 使用Ajax跨域请求的实例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <div id="container"></div>
    <input type="button" value="获取节目" onclick="getdata();">

    <script src="jquery-2.2.4.min.js"></script>

    <script type="text/javascript">
        function getdata(){
            $.ajax({
                url:'http://www.jxntv.cn/data/jmd-jxtv2.html?callback=list&_=1454376870403', //文件内容结构{data:[{k:v},{k:[]}]}
                data:{},
                type:'GET',
                dataType:'jsonp',
                jsonp:'callback',
                jsonpCallback:'list',

                success:function(msg) {                              //msg是一个字典{data:[{k:v},{k:[]}]}
                    $.each(msg.data,function(i){                     //msg.data是一个列表[{k:v}]
                        var item = msg.data[i];                      //i是列表的索引,item是列表里的每个字典
                        var str = "<p>" + item.week + "</p>";        //item.week获取日期
                        $('#container').append(str);                 //container里添加str
                        $.each(item.list, function (j) {             //item.list获取到一个列表
                        var temp = "<a href='" + item.list[j].link + "'>" + item.list[j].name + " </a><br/>";
                        $('#container').append(temp);
                        })
                        $('#container').append("<hr/>");
                    })
                }
            })
        }
    </script>
</body>
</html>

 

posted @ 2016-07-14 18:30  ahaii  阅读(206)  评论(0编辑  收藏  举报