0

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

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

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

4

3 回答 3

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

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

另一种选择是onload从 iframe 监听事件。每次 iframe 页面更改时都会触发(至少在 chrome 中)。http://jsfiddle.net/rlemon/DwVJX/1/这是一个快速演示。在 iframe 中单击 jsFiddle 徽标返回主页。我知道这并不能告诉您您是否在正确的域中,但是结合 try/catch 可以消除对计时器的需要。

于 2012-12-20T21:38:42.440 回答
2

您可以将支票包装在一个try catch块中。或者,您可以让主机上的页面“呼叫”父级。(类似于parent.notifyReady())这样你就不必使用setInterval

document.referrer您可以使用该属性将您的逻辑基于是否调用父级

所以在你的第三页你可以有这样的东西:

if(document.referrer.indexOf('otherdomain.com') != -1) {
    // script called via otherdomain.com
    parent.notifyReady();
}
于 2012-12-20T21:38:38.817 回答
0

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

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

于 2012-12-20T21:40:17.493 回答