我的页面上有一个 iframe,用于向第三方页面提交表单。一旦第三方完成计算,它就会重定向回我自己的站点。我想检测 iframe 何时返回我自己的网站。
我目前的方法是使用超时并location.host
每 0.5 秒检查一次 iframe。但是,虽然 iframe 仍在第三方网站上,但我收到了一个 JS 错误,我想避免这种情况。
有没有一种好方法可以确定 iframe 的位置何时回到我自己的服务器上而不会出现 JS 错误?
我的页面上有一个 iframe,用于向第三方页面提交表单。一旦第三方完成计算,它就会重定向回我自己的站点。我想检测 iframe 何时返回我自己的网站。
我目前的方法是使用超时并location.host
每 0.5 秒检查一次 iframe。但是,虽然 iframe 仍在第三方网站上,但我收到了一个 JS 错误,我想避免这种情况。
有没有一种好方法可以确定 iframe 的位置何时回到我自己的服务器上而不会出现 JS 错误?
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 可以消除对计时器的需要。
您可以将支票包装在一个try catch
块中。或者,您可以让主机上的页面“呼叫”父级。(类似于parent.notifyReady()
)这样你就不必使用setInterval
document.referrer
您可以使用该属性将您的逻辑基于是否调用父级
所以在你的第三页你可以有这样的东西:
if(document.referrer.indexOf('otherdomain.com') != -1) {
// script called via otherdomain.com
parent.notifyReady();
}
我认为您当前正在做的是可靠地检测 iframe 是否位于父页面域上托管的页面上的唯一方法。
大多数 iframe 属性是不可访问的(访问时抛出异常),而 iframe 与父级位于不同的域中。异常实际上表明 iframe 不在您的站点上,因此只需捕获异常并重试。如果未引发异常,则 iframe 位于与其父级相同域中的页面上。