从具有不同域的iframe内部进行AJAX调用

时间:2011-08-25 00:23:18

标签: javascript html dom iframe

是否可以从具有不同域源的iframe内部进行AJAX调用?

我已尝试过脚本注入,但它不起作用,因为iframe的源是安全的。 我用加州DMV网站here做了一个简单的小提琴。

我收到DOM异常8错误。这是一个安全问题吗?

2 个答案:

答案 0 :(得分:3)

无法在具有不同域源的iframe中修改或进行JS调用。出于安全原因,这在所有浏览器中都受到限制。

有关帧间安全性如何工作的说明,请参阅“Same Origin Policy”。简而言之,出于安全原因,在不同域上的帧之间允许的通信很少。您不能在不同域上的帧之间进行任何直接的Javascript调用。

有一种方法可以进行跨域ajax调用,它涉及使用JSONP。基本上,您将脚本标记注入到您自己的框架中,该脚本标记指向Web上任何位置的服务器端点。由于脚本标记的src值不受同一原始策略的限制,因此您可以访问该服务器。但是,现在你需要有办法让结果得到回报。这是使用JSONP完成的,您在服务器请求中指定了希望返回的javascript调用的javascript函数。返回javascript可以在其​​中包含javascript数据,然后传递给所需的函数。 JSONP需要客户端代码和服务器代码之间的协作,因为正常的ajax调用可能不支持JSONP的额外部分。但是,通过双方的这种合作,您可以绕过支持JSONP的服务器端点的相同原始策略。

HTML5有一个新的消息传递系统,可以安全地在不同域中的协作帧之间传递数据(而不是直接的JS调用)。有关HTML5消息传递如何工作的说明,请参阅herehere

答案 1 :(得分:1)

是的,这是一个安全问题,因为大多数浏览器强制执行同源策略:http://en.wikipedia.org/wiki/Same_origin_policy

您可以查看专为解决此问题而设计的JSONP http://niryariv.wordpress.com/2009/05/05/jsonp-quickly/