请教jQuery JSONP跨域原理?

发布于 2022-09-04 12:33:15 字数 201 浏览 15 评论 0

jQuery的$.ajax跨域时发出的请求类型是xhr,并不是script,也没有发现动态生成script标签,也没有发现类似jQuery191011762070982318096_1487035510995这样的函数。(可能是我没有发现而已)
请教jQuery是怎样动态声明callback函数的,怎样下载script文件的?
感谢回答!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

笔芯 2022-09-11 12:33:15

script标签是不受同源限制的、只要能get到的资源文件就可以加载、所以JSONP是get方法用回调请求JSON、

不知道这样解释是否清楚

clipboard.png

关于JSONP的回调肯定是声明在window下的、所以JQ中只需要声明这样一个方法、动态获取你的函数名、声明一下、就可以根据你的设置进行调用了

不顾 2022-09-11 12:33:15

a.js

function callback(data){
  alert(data);
}

b.js

callback({name:'Li', age:13});

你自己已经解答的差不多了,如果我就把这两个文件顺序用script标签引入,会alert出传入callback的实参。

如果先声明了callback函数,然后将b.js以动态script标签引入,因为script的src引入js不受同源限制,所以我们可以请求其他服务器上的文件,其他服务器上可以根据script中的参数动态生成类似于b.js的文件,传到客户端自然会执行。

jsonp跟ajax没任何关系,jQuery只不过把他们封装在了一起,你说xhr,应该使用的是cors跨域。

两点: json是良好的数据传输形式, script标签引入文件不受同源限制

岁月打碎记忆 2022-09-11 12:33:15

1.当前页面预写好一个要执行的函数声明(即你说的回调callback)。
2.页面内资源的src属性不受跨域限制。
3.生成一个src属性是跨域请求地址的<script>标签,插入到当前页面(src中有这个回调的名字,作为参数发送给服务器)。
4.因为你插入了新元素,浏览器就会解析,并发出资源请求(想不明白,就想想插入一个图片,是不是会去请求这个图片)。
5.返回的外链script是对你第一步声明的函数的调用(数据会放在函数调用的参数中callback(data))。然后函数会被执行。

余罪 2022-09-11 12:33:15

1.你浏览器端

var eleScript= document.createElement("script"); 
eleScript.type = "text/javascript"; 
eleScript.src = "http://example2.com/getinfo.php"; 
document.getElementsByTagName("HEAD")[0].appendChild(eleScript); 

创建一个script 请求得到 .php 返回一个函数.

2.让我们看看 jquery 里面jsonp

  jQuery(document).ready(function(){ 
        $.ajax({
             type: "get",
             async: false,
             url: "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998",
             dataType: "jsonp",
             jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
             jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
             success: function(json){
                 alert('您查询到航班信息:票价: ' + json.price + ' 元,余票: ' + json.tickets + ' 张。');
             },
             error: function(){
                 alert('fail');
             }
         });
     });

flightHandler这个回调句柄, 当动态scripte 动态加载完成,就执行flightHandler方法

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文