Javascript 检测iframe何时从跨域站点返回

Javascript 检测iframe何时从跨域站点返回,javascript,iframe,cross-domain-policy,Javascript,Iframe,Cross Domain Policy,我的页面上有一个iframe,可以向第三方页面提交表单。一旦第三方完成计算,它就会重定向回我自己的站点。我想检测iframe何时返回到我自己的站点 我目前的方法是使用超时,每0.5秒检查一次iframe的location.host。然而,虽然iframe仍然在第三方站点上,但我得到了一个JS错误,我希望避免这个错误 有没有一种好方法可以在没有JS错误的情况下确定iframe的位置何时回到我自己的服务器上?您可以将您的支票包装在try catch块中。或者,您可以让主机上的页面“呼叫”家长。(类似

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

我目前的方法是使用超时,每0.5秒检查一次iframe的
location.host
。然而,虽然iframe仍然在第三方站点上,但我得到了一个JS错误,我希望避免这个错误


有没有一种好方法可以在没有JS错误的情况下确定iframe的位置何时回到我自己的服务器上?

您可以将您的支票包装在
try catch
块中。或者,您可以让主机上的页面“呼叫”家长。(类似于
parent.notifyReady()
)这样就避免了使用
setInterval

通过使用
document.referer
属性,您可以根据是否调用父对象来确定逻辑

所以在你的第三页,你可以有这样的内容:

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

您可以将支票包装在
try catch
块中。或者,您可以让主机上的页面“呼叫”家长。(类似于
parent.notifyReady()
)这样就避免了使用
setInterval

通过使用
document.referer
属性,您可以根据是否调用父对象来确定逻辑

所以在你的第三页,你可以有这样的内容:

if(document.referrer.indexOf('otherdomain.com') != -1) {
    // script called via otherdomain.com
    parent.notifyReady();
}
使用try/catch语句应该可以解决这个问题。可能还有其他方法可以解决这个问题,但是在回顾你的问题之后,这是第一个想到的方法

另一种选择是从iframe侦听
onload
事件。这(至少在chrome中)会在每次iframe页面更改时触发。这里是一个快速演示。在iframe中,单击JSFIDLE徽标返回主页。我知道这不会告诉你是否在正确的域上,但与try/catch结合使用,就不需要计时器了

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


另一种选择是从iframe侦听
onload
事件。这(至少在chrome中)会在每次iframe页面更改时触发。这里是一个快速演示。在iframe中,单击JSFIDLE徽标返回主页。我知道这不会告诉你是否在正确的域上,但与try/catch结合使用,就不需要计时器了

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


当iframe位于与父域不同的域上时,大多数iframe属性都不可访问(访问时引发异常)。异常实际上表示iframe不在您的站点上,因此只需捕获异常并重试。如果没有引发异常,则iframe位于与其父页面位于同一域的页面上。

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


当iframe位于与父域不同的域上时,大多数iframe属性都不可访问(访问时引发异常)。异常实际上表示iframe不在您的站点上,因此只需捕获异常并重试。如果没有引发异常,则iframe位于与其父对象位于同一域的页面上。

我喜欢另一种方法(特别是如果您控制第三个页面上的代码)。哇,这就是我一直在寻找的想法。我将对此进行测试,并让您知道它是否有效(然后接受这个答案)。谢谢你的提示。我喜欢另一种方法(特别是如果你在第三页控制代码的话)。哇,这就是我想要的想法。我将对此进行测试,并让您知道它是否有效(然后接受这个答案)。谢谢你的提示。这也是我的第一个想法,但是我的控制台仍然有一个错误。至少我是用铬做的。它不会停止执行,但我仍然希望避免错误。你能提供一个实例让我们看看吗?我在这里看不到。我甚至没有在
throw“error”
代替
error()
上得到一个错误这里是一个简单的例子。只需单击“开始测试”链接,您就会看到在Chrome中,控制台中出现了一个JS错误,而try/catch块并没有捕捉到这个错误。我想,既然它没有停止执行,你可以说它是一个“警告”而不是一个错误,但它肯定会显示为一个错误,这是我想要避免的。这也是我的第一个想法,但我仍然在控制台中遇到一个错误。至少我是用铬做的。它不会停止执行,但我仍然希望避免错误。你能提供一个实例让我们看看吗?我在这里看不到。我甚至没有在
throw“error”
代替
error()
上得到一个错误这里是一个简单的例子。只需单击“开始测试”链接,您就会看到在Chrome中,控制台中出现了一个JS错误,而try/catch块并没有捕捉到这个错误。我想,既然它没有停止执行,你可以说它是一个“警告”而不是一个错误,但它肯定会显示为一个错误,这是我想要避免的。