我的页面上有一个 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 位于与其父级相同域中的页面上。