新手学跨域之Jsonp

  • jsonp
  • iframe
    ● document.domain
    ● window.name
    ● location.hash
    ● navigator (IE6 bug)
    ● postMessage
  • CORS
    ● XMLHttpRequest (modern browser)
    ● XDomainRequest (IE8+)
  • 图像Ping (略)
  • flash (略)

Jsonp个人的理解是后端向前端传输JSON格式数据一种方式,形如 callback({"name":"Joy","age":"22","gender":"male"})
callback("a") 这种虽然包裹的数据不是JSON格式的,但应该也算吧?

Jsonp平时主要用在获取一些信息,比如通过公开api获取城市天气啊啥的。刚学的时候一头雾水,理解了就很简单了。


一步一步理解

1.简单的函数声明,调用。这里data为形参,'a'为实参

<script>
function callback(data) { console.log(data) }
callback('a'); // -> a
</script>

2.声明和调用分布在两个script标签里,这里就要注意顺序了, 函数申明要在前

<script>
function callback(data) { console.log(data) }
</script>
<script>
callback('a');
</script>

3.函数调用在外部js文件

// foo.com的foo.html文件
<script>
function callback(data) { console.log(data) }
</script>
<script src="http://bar.com/call.js"></script>
// call.js文件
callback('a');

4.把这里外部js文件call.js替换成用php输出试试

// foo.html文件
<script>
function callback(data) { console.log(data) }
</script>
<script src="http://bar.com/call.php"></script>
//call.php
<?php
echo 'callback("a")';
?>

5.加上参数,参数是看后端需要的是什么,如果不知道后端暴露的接口或者说是API,就没法交换数据

// foo.html文件
<script>
function callback(data) { console.log(data) }
</script>
<script src="http://bar.com/call.php?cb=callback&id=2"></script>
// call.php
<?php
$call = $_GET['cb'];
$id = $_GET['id'];
$arr = array('aaa', 'bbb', 'ccc');
echo $call.'("'. $arr[$id] .'")';
?>

上面就实现了跨域的数据交换,简单来说就是前端声明,后端调用。前端通过script把参数传给后端,后端把参数对应的数据当实参并构造成一个函数调用。如图
jsonp

Jsonp也是这样,只不过他返回的是JSON数据。需要注意的是函数名并不总是自定义的,很多情况下都是后台写死的。

实例,通过Jsonp获取QQ用户头像。
api: http://ptlogin2.qq.com/getface?uin=qq号,可以看出他只要参数QQ号(还有其他参数,不过不是必须的这里就不写了),随便写个QQ号http://ptlogin2.qq.com/getface?uin=123456,浏览器打开,可以看到输出了pt.setHeader({"123456":"http:\/\/q1.qlogo.cn\/g?b=qq&k=xyOnRe5ML3Aw96iaaQ1hh6w&s=40&t=1370250302"});,他这里的函数名已经写死了,所以我们的js代码函数名要按他给的写

var pt = {};
pt.setHeader = function (data) {
    // console.log(data);
    for (var i in data) {
        console.log(data[i]);
    }
}
// 动态创建script,这里QQ号我就不写动态的了
var s = document.createElement('script');
s.src = 'http://ptlogin2.qq.com/getface?uin=88888';
document.head.appendChild(s);

jQuery的Jsonp

jQuery的Jsonp是封装在ajax方法下面的,但和ajax没什么关系,实现方法和上面差不多
例如获取微博的搜索结果
api: http://s.weibo.com/ajax/jsonp/suggestion?_cb=函数名&key=关键字

先用原生js实现

function getResult(o) {
    console.log(o.data);
}
var s = document.createElement('script');
s.src = 'http://s.weibo.com/ajax/jsonp/suggestion?_cb=getResult&key=a';
document.head.appendChild(s);

这里的函数名getResult就可以自定义

jQuery实现

$.ajax({
    url: 'http://s.weibo.com/ajax/jsonp/suggestion?key=a',
    dataType: 'jsonp',
    jsonp: '_cb',
    success: function (o.data) {
        console.log(o.data)
    }
});

可以看到jQuery不用自己再声明一个命名函数,而是直接在succss里回调。通过请求可以看到,jQuery默默的给_cb传递了一个jQuery2xxx..的参数,而succss回调就是这个jQuery2xxx...的命名函数。当然如果要自定义也可以通过jsonpCallback设置,具体看jQuery的api

基于粒子群优化算法的p-Hub选址优化(Matlab代码实现)内容概要:本文介绍了基于粒子群优化算法(PSO)的p-Hub选址优化问题的研究与实现,重点利用Matlab进行算法编程和仿真。p-Hub选址是物流与交通网络中的关键问题,旨在通过确定最优的枢纽节点位置和非枢纽节点的分配方式,最小化网络总成本。文章详细阐述了粒子群算法的基本原理及其在解决组合优化问题中的适应性改进,结合p-Hub中转网络的特点构建数模型,并通过Matlab代码实现算法流程,包括初始化、适应度计算、粒子更新与收敛判断等环节。同时可能涉及对算法参数设置、收敛性能及不同规模案例的仿真结果分析,以验证方法的有效性和鲁棒性。; 适合人群:具备一定Matlab编程基础和优化算法理论知识的高校研究生、科研人员及从事物流网络规划、交通系统设计等相关领的工程技术人员。; 使用场景及目标:①解决物流、航空、通信等网络中的枢纽选址与路径优化问题;②习并掌握粒子群算法在复杂组合优化问题中的建模与实现方法;③为相关科研项目或实际工程应用提供算法支持与代码参考。; 阅读建议:建议读者结合Matlab代码逐段理解算法实现逻辑,重点关注目标函数建模、粒子编码方式及约束处理策略,并尝试调整参数或拓展模型以加深对算法性能的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值