跨域 Ajax 调用总结April 8, 2008

上次提到过跨域 Ajax 的调用问题 ,这次做个总结。众所周知,Javascript 有「同源策略」的限制。但有时候偏偏又要碰到 Ajax 跨域调用的问题,这个时候就需要些「特殊」的方法使脚本正常使用。

总结下目前所能想到的一些策略,具体的可以查看 Yahoo 开发中心的 相关文档

使用 iframe

具体详情,可以 参看这里

实现的原理就是 iframe 与 父页面 进行 Javascript 通信。完全跨域操作没有测试过,但跨子域名是完全可行的。

优势(部分)

  • 全部使用 Javascript 搞定
  • 简单,不用学习其他语言

缺点(部分)

  • 破坏 HTML 结构
  • 客户端的资源占用比较大

服务器端脚本

http://files.gracecode.com/2008_04_07/1207562864.gif

架构可以先「盗用」 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 语言,加上后者对于客户端友好,所以在条件允许的情况下,个人还是比较偏向后者。

§ 6 条评论

  1. iframe完全跨域名是不行的,现在能够完全跨域名的恐怕就是其他域名提供的Web Service,支持的返回格式一般是JSON和XML。如果想让别人访问你的域名的数据,我想最好的办法还是写Web Service。

  2. wiLdGoose wiLdGoose

    web service 很流行, 很强大.
    新换的背景很蓝, 很美丽.

  3. 在这里首先要道个歉,距离上次的“YUI 读码日记” 更新已经差不多快两个月了。期间可能是工作忙(这算不上是借口),或者是其他事情给耽误了,但无论如何作为名 YUI 的初学者还是要继续坚持下去的。

    上次的 跨域调用 问题,最后使用 YAHOO.util.Get 这个组件搞定的。而接下来的几次开发中,也用到了这个组件,所以激起了对其原理窥探的好奇心。

    YAHOO.util.Get = function() {
    script: function(url, opts) {
    return

  4. 你这个在子域名下是可以的不过全部垮不行了正在寻求全部跨域.

  5. @yefs 夸全域名可以考虑 http://www.chencheng.org/blog/2008/10/27/cross-domain-iframe/ 这个解决方案

  6. 我用了 YUI 的 get ,却发现自己找不到返回的 JSON 数据在哪里,好像没有给我传回来

添加评论




* Required (but your email address will never be published)

Yahoo 统计