利用jsonp解决ajax的跨域请求问题

AJAX对于我们来说可能已经不是陌生的事情了,但如果你的是跨域请求,那么AJAX已经无能为力,其实这个也是可以弥补的,就是利用 jsonp。其实也不是什么技术,只是利用JS标签里面的跨域特性进行跨域数据访问,服务器返回的JS代码在客户端浏览器再次执行得到我们想要的效果,利 用jsonp可以做到防AJAX实现跨域请求,但是我们并不需要创建XMLHttpRequest,当然也得不到readyState,因为这并不是 AJAX了。
下面举一个例子来说明:
假设需要在域名www.a.com下请求www.111cn.net /ajax.php,相比AJAX服务器端的代码没有什么太大的改变,关键是客户端代码,例如在ajax.php中随便写点代码:
<?php
$arr =array(
    'x' => array('id'=>10,'user'=>'zhangsan'),
    '3'=>array('id'=>11,'user'=>'lisi'),
    '8' =>array('id'=>14,'user'=>'wangwu')
);
$jsondata = json_encode($arr);
echo $_GET['callback'] . "($jsondata);";
?>
则www.a.com下的客户端代码可以是:
<html>
<head>
<script>
function ck(data){
        var str = '';
        for(i in data){
            str += data[i].id + '___' + data[i].user + '<br/>';
        }
        document.getElementById('content').innerHTML=str;
}
function test(){
        var s = document.createElement('script');
        s.src = "http://www.111cn.net /ajax.php?callback=ck";
        head=document.getElementsByTagName('head').item(0);
        head.appendChild(s);
}
</script>
</head>
<body>
<div id="content" style="border:1px solid red;width:300px;height:200px;"></div>
 <input type="button" value="test" onclick="test()" />
</body>
</html>

其 中test()函数的作用是创建script标签,动态请求www.111cn.net /ajax.php并传入回调函数名ck,服务器会返回js代码,就像我们 看到的输出执行函数的代码,并且将json数据作为参数传入回调函数,和AJAX中使用的回调函数一样,实现我们想要的效果。
如果使用jquery则代码简洁并且更像AJAX的用法,代码示例:

<script src="jquery.js"></script>
<script>
function test(){
 $.ajax({
        url:'http://www.111cn.net /ajax.php',
        type:'GET',
        data:{name:'xxx'},
        dataType:'jsonp',
        jsonp:'callback',
        success:function(data){
           var str = '';
           for(i in data){
            str += data[i].id + '___' + data[i].user + '<br/>';
            }
            $('#content').html(str);
        }
    });
}
</script>
<div id="content" style="border:1px solid red;width:300px;height:200px;"></div>
<input type="button" value="test" onclick="test()" />

  在jquery中还有一个方法是,使用起来更简洁一点,只需要将函数内的代码更改为:

$.getJSON("http://www.111cn.net /ajax.php?callback=?",
            function(data){
                var str = '';
                for(i in data){
                    str += data[i].id + '___' + data[i].user + '<br/>';
                }
                $('#content').html(str);
        });

        最后要说的一点是jsonp和ajax不同,是利用script标签的跨域请求,应该是这个原因测试POST提交方式没有成功,如果有那位朋友测试POST方式成功并且代码不繁琐,请给我留言

时间: 2024-09-18 05:34:11

利用jsonp解决ajax的跨域请求问题的相关文章

jquery+ajax实现跨域请求的方法

 这篇文章主要介绍了jquery+ajax实现跨域请求的方法,详细介绍了前台及后台的处理方法,是非常实用的技巧,需要的朋友可以参考下     本文实例讲述了jquery+ajax实现跨域请求的方法.分享给大家供大家参考.具体实现方法如下: 说明:这里的dataType 为 "jsonp" :type 只能为 GET 前台请求代码如下: 代码如下: $.ajax({ type: "GET", url: "http://www.xxx.com/Rest/Val

jquery+ajax实现跨域请求的方法_jquery

本文实例讲述了jquery+ajax实现跨域请求的方法.分享给大家供大家参考.具体实现方法如下: 说明:这里的dataType 为  "jsonp"  :type 只能为 GET 前台请求代码如下: 复制代码 代码如下: $.ajax({  type: "GET",  url: "http://www.xxx.com/Rest/ValidAccountsExists.aspx?accounts=admin",  dataType: "j

利用CORS实现POST方式跨域请求数据

CORS全名Cross-Origin Resource Sharing,顾名思义:跨域分享资源,这是W3C制定的跨站资源分享标准. 目前包括IE10+.chrome.safari.FF都提供了XMLHttpRequest对象对该标准的支持,在更老的IE8中则提供了xDomainRequest对象,部分实现了该标准: 下面是创建request对象的代码: var url = "http://www.111cn.net /1.php"; if (XMLHttpRequest) {    

深入浅析Jsonp解决ajax跨域问题

一.介绍 最近跨域问题比较多,而且自己刚好也看到这一块,就总结了一下,关于JSONP的东西百度的话东西确实很多,很多人都是复制别人的,如此下去,其实找的资料就那么几份,关键是我还看不懂,可能是能力问题吧,自己经过很多尝试,所以总结了一下,终究还是弄懂了皮毛.注意一点是,这里是用Jsonp解决ajax的跨域问题,具体的实现其实不是ajax. 1.同源策略 浏览器有一个很重要的概念--同源策略(Same-Origin Policy).所谓同源是指,域名,协议,端口相同.不同源的客户端脚本(JavaS

Ajax跨域请求 JSON JSONP

同源策略和跨域-总结 目录: 1.同源策略 2.跨域 3.几种跨域技术   1.同源策略 什么叫同源? URL由协议.域名.端口和路径组成,如果两个URL的协议.域名和端口相同,则表示他们同源.相反,只要协议,域名,端口有任何一个的不同,就被当作是跨域. e.g. 对于http://store.company.com/dir/page.html进行同源检测: URL 结果 原因 http://store.company.com/dir2/other.html 成功 仅路径不同 http://st

Ajax jsonp跨域请求实现方法_AJAX相关

什么是跨域? 简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即"同源策略".而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果. 具体策略限制情况可看下表:   URL 说明 允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http://www.a.com/script/b.js 同一域名下不同文件夹 允许

探秘ajax跨域请求_AJAX相关

前言 ajax,用苍白的话赞扬:很好. 我们可以使用ajax实现异步获取数据,减少服务器运算时间,大大地改善用户体验:我们可以使用ajax实现小系统组合大系统:我们还可以使用ajax实现前端的优化.(好一个排比) 虽然ajax很好,但在使用起来也会有一定的限制,出于安全考虑,不允许跨域通信.如果尝试从不同的域请求数据,会出现安全错误.(下面例子1可以直观看出) 同源策略限制 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性.也就是说,受到请求的 URL 的域必须与当前 Web 页面

ajax跨域请求学习笔记

原文:ajax跨域请求学习笔记 前言 ajax,用苍白的话赞扬:很好. 我们可以使用ajax实现异步获取数据,减少服务器运算时间,大大地改善用户体验:我们可以使用ajax实现小系统组合大系统:我们还可以使用ajax实现前端的优化.(好一个排比) 虽然ajax很好,但在使用起来也会有一定的限制,出于安全考虑,不允许跨域通信.如果尝试从不同的域请求数据,会出现安全错误.(下面例子1可以直观看出) 同源策略限制 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性.也就是说,受到请求的 UR

探秘ajax跨域请求

前言 ajax,用苍白的话赞扬:很好. 我们可以使用ajax实现异步获取数据,减少服务器运算时间,大大地改善用户体验:我们可以使用ajax实现小系统组合大系统:我们还可以使用ajax实现前端的优化.(好一个排比) 虽然ajax很好,但在使用起来也会有一定的限制,出于安全考虑,不允许跨域通信.如果尝试从不同的域请求数据,会出现安全错误.(下面例子1可以直观看出) 同源策略限制 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性.也就是说,受到请求的 URL 的域必须与当前 Web 页面