检测iframe何时从跨域网站返回

时间:2012-12-20 21:32:55

标签: javascript iframe cross-domain-policy

我的页面上有一个iframe,用于将表单提交给第三方页面。一旦第三方完成计算,它就会重定向回我自己的网站。我想检测iframe何时返回我自己的网站。

我目前的做法是使用超时并每隔0.5秒检查一次iframe的location.host。但是,虽然iframe仍然在第三方网站上,但我得到一个JS错误,我想避免。

有没有一种很好的方法可以找出iframe的位置何时返回我自己的服务器而不会出现JS错误?

3 个答案:

答案 0 :(得分:3)

function check() {
    try { 
        location.host; // if I error, doStuff() is never hit. 
        doStuff();
    } catch( e ) {
        setTimeout(check, 5000);
    }
}

使用try / catch语句可以为您解决此问题。可能还有其他方法可以解决这个问题,但在审核了您的问题后,这是第一个想到的问题。

另一种方法是从iframe中侦听onload事件。每次iframe页面更改时都会触发(至少在chrome中)。 http://jsfiddle.net/rlemon/DwVJX/1/这是一个快速演示。在iframe中单击jsFiddle徽标返回主页。我明白这并不能告诉你,如果你是在正确的域上,但与try / catch结合使用,这就消除了对计时器的需求。

答案 1 :(得分:2)

您可以将支票包裹在try catch块中。或者,您可以让主持人“呼叫”父母的页面。 (类似于parent.notifyReady())这样就可以避免使用setInterval

您可以根据是否使用document.referrer属性

调用父级来建立逻辑

所以在你的第三页上,你可能会有这样的事情:

if(document.referrer.indexOf('otherdomain.com') != -1) {
    // script called via otherdomain.com
    parent.notifyReady();
}

答案 2 :(得分:0)

我认为您目前正在做的是可靠地检测iframe是否在您父网页域上托管的网页上的唯一方法。

大多数iframe属性都是不可访问的(访问时抛出异常),而iframe位于与父级不同的域上。异常实际上表明iframe不在您的站点上,因此只需捕获异常并再试一次。如果没有抛出异常,则iframe位于与其父级位于同一域中的页面上。