上次提到过跨域 Ajax 的调用问题 ,这次做个总结。众所周知,Javascript 有「同源策略」的限制。但有时候偏偏又要碰到 Ajax 跨域调用的问题,这个时候就需要些「特殊」的方法使脚本正常使用。
总结下目前所能想到的一些策略,具体的可以查看 Yahoo 开发中心的 相关文档 。
使用 iframe
具体详情,可以 参看这里 。
实现的原理就是 iframe 与 父页面 进行 Javascript 通信。完全跨域操作没有测试过,但跨子域名是完全可行的。
优势(部分)
- 全部使用 Javascript 搞定
- 简单,不用学习其他语言
缺点(部分)
- 破坏 HTML 结构
- 客户端的资源占用比较大
服务器端脚本
架构可以先「盗用」 Yahoo 文中 的那张插图。大家也许想到变通的办法了,就是在服务器端编写类似网关的脚本。
比如获取另外个域下的 Json 输出,用 PHP 编写的部分代码如下
header('Content-type: text/javascript');
$url = 'http://x.other.net/json';
if ($content = file_get_contents($url)) {
echo $url;
}
很简单的代码,但对于服务器端而言,没有任何的限制。进一步的扩展,可以使用 CURL 库 。
优势(部分)
- 使用没有任何限制
- 对 Javascript 透明
缺点(部分)
- 必须支持服务器端
- Javascript 程序员必须了解服务器端语言
- 服务器端脚本必须与页面在同个域内
- 可能会加重服务器负载
由于相对比较熟悉 PHP 语言,加上后者对于客户端友好,所以在条件允许的情况下,个人还是比较偏向后者。
iframe完全跨域名是不行的,现在能够完全跨域名的恐怕就是其他域名提供的Web Service,支持的返回格式一般是JSON和XML。如果想让别人访问你的域名的数据,我想最好的办法还是写Web Service。
web service 很流行, 很强大.
新换的背景很蓝, 很美丽.
在这里首先要道个歉,距离上次的“YUI 读码日记” 更新已经差不多快两个月了。期间可能是工作忙(这算不上是借口),或者是其他事情给耽误了,但无论如何作为名 YUI 的初学者还是要继续坚持下去的。
上次的 跨域调用 问题,最后使用 YAHOO.util.Get 这个组件搞定的。而接下来的几次开发中,也用到了这个组件,所以激起了对其原理窥探的好奇心。
YAHOO.util.Get = function() {
script: function(url, opts) { return你这个在子域名下是可以的不过全部垮不行了正在寻求全部跨域.
@yefs 夸全域名可以考虑 http://www.chencheng.org/blog/2008/10/27/cross-domain-iframe/ 这个解决方案
我用了 YUI 的 get ,却发现自己找不到返回的 JSON 数据在哪里,好像没有给我传回来