跨域调用JavaScript

时间:2010-09-22 17:15:19

标签: javascript iframe xmlhttprequest cross-domain

这是目标:

移交引用远程服务器上的JavaScript文件的脚本标记。该JavaScript文件应返回HTML,然后将显示在调用HTML页面上。

我试图通过两种方式解决这个问题:

首先,我尝试在JavaScript中使用XMLHttpRequest来调用此远程服务器。在IE中,它会按预期工作,但FF,Safari和Chrome将返回空响应。我从研究中得到的总体反应是,请求被阻止,因为它尝试访问的服务器与运行的服务器不同(本地主机,但不同的端口)。

其次,我查看了Google Gadgets之类的工作方式,因为它们有效地为您提供了一个引用外部JavaScript的简单脚本标记。从我可以收集到的内容来看,似乎只有使用的基本网址才会进行某种iframe操作(例如下面的例子)。这似乎是要走的路,即使使用iframe不是我最初的想法。我猜测Google代码将iframe作为HTML返回到嵌入了此脚本的HTML文件中。

关于我应该如何进行的任何建议?

<script src="http://www.gmodules.com/ig/ifr?url=http://ralph.feedback.googlepages.com/googlecalendarviewer.xml&amp;synd=open&amp;w=320&amp;h=200&amp;title=&amp;border=%23ffffff%7C3px%2C1px+solid+%23999999&amp;output=js"></script>

2 个答案:

答案 0 :(得分:2)

JSONP是处理same origin policy的常用方法。由于大多数javascript框架(例如jquery)已经支持它,因此您无需了解技术细节即可使用它。
您也可以通过从javascript构建script标记来自行完成操作(如您所述)。 Google Analytics代码段就是这种方法的一个示例:

      var ga = document.createElement('script');
      ga.type = 'text/javascript';
      ga.async = true;
      ga.src = 'url here';
      var s = document.getElementsByTagName('script')[0];
      s.parentNode.insertBefore(ga, s);

至于iframe的想法(如果我现在理解你的话),那就不行了。您可以使用页面上的iframe元素显示来自其他服务器的内容,但浏览器不允许您使用javascript从主页访问它。

修改
此原始提案详细说明了JSONP的用法:
http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/

答案 1 :(得分:1)

x-domain调用需要服务器端代理。

网上有很多可用的实现,或者你可以用你选择的语言掀起一个适合你的堆栈。

此处提供了有关图形和PHP代理的更多信息 - http://developer.yahoo.com/javascript/howto-proxy.html