<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml xml:lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/vnd.wap.wml; charset=utf-8"/>
<meta http-equiv="Cache-Control" content="no-cache"/></head>
<card title="跨域 Ajax 调用总结 - Gracecode.com">
<p><a href="http://www.gracecode.com/Archive/Display/1273" title="http://www.gracecode.com/Archive/Display/1273">上次提到过跨域 Ajax 的调用问题</a>，这次做个总结。众所周知，Javascript 有“同源策略”的限制。但有时候偏偏又要碰到 Ajax 跨域调用的问题，这个时候就需要些“特殊”的方法使脚本正常使用。</p>

<p>总结下目前所能想到的一些策略，具体的可以查看 Yahoo 开发中心的<a href="http://developer.yahoo.com/javascript/howto-proxy.html" title="http://developer.yahoo.com/javascript/howto-proxy.html">相关文档</a>。</p>

<h2>使用 iframe</h2><p>具体详情，可以<a href="http://www.freearc.net/article.asp?id=104" title="http://www.freearc.net/article.asp?id=104">参看这里</a>。</p>

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

<h3>优势（部分）</h3><ul>
    <li>全部使用 Javascript 搞定</li>
    <li>简单，不用学习其他语言</li>
</ul>

<h3>缺点（部分）</h3><ul>
    <li>破坏 HTML 结构</li>
    <li>客户端的资源占用比较大</li>
</ul>

<h2>服务器端脚本</h2><p><img src="http://www.gracecode.com/upload/2008_04_07/1207562864.gif" alt="http://www.gracecode.com/upload/2008_04_07/1207562864.gif" title="http://www.gracecode.com/upload/2008_04_07/1207562864.gif" /></p>

<p>架构可以先“盗用” <a href="http://developer.yahoo.com/javascript/howto-proxy.html" title="http://developer.yahoo.com/javascript/howto-proxy.html">Yahoo 文中</a>的那张插图。大家也许想到变通的办法了，就是在服务器端编写类似网关的脚本。</p>

<p>比如获取另外个域下的 Json 输出，用 PHP 编写的部分代码如下</p>

<pre>header('Content-type: text/javascript');
$url = 'http://x.other.net/json';
if ($content  = file_get_contents($url)) {
    echo $url;
}</pre><p>很简单的代码，但对于服务器端而言，没有任何的限制。进一步的扩展，可以使用 <a href="http://cn.php.net/curl" title="http://cn.php.net/curl">CURL 库</a>。</p>

<h3>优势（部分）</h3><ul>
    <li>使用没有任何限制</li>
    <li>对 Javascript 透明</li>
</ul>

<h3>缺点（部分）</h3><ul>
    <li>必须支持服务器端</li>
    <li>Javascript 程序员必须了解服务器端语言</li>
    <li>服务器端脚本必须与页面在同个域内</li>
    <li>可能会加重服务器负载</li>
</ul>

<p>由于相对比较熟悉 PHP 语言，加上后者对于客户端友好，所以在条件允许的情况下，个人还是比较偏向后者。</p>


<p>
<a href="http://www.gracecode.com/wap/">Gracecode.com</a> |
<a href="http://www.gracecode.com/wap/d/1307 ">Permalink</a>(<a href="http://www.gracecode.com/Archive/Display/1307 ">xHTML</a>) |
<a href="http://www.gracecode.com/Trackback/Recieve/1307/tlozj1">Trackback</a> |
<a href="http://rss.gracecode.com">Rss</a>
</p>
</card>
</wml>