在加载前拦截iframe位置更改

时间:2015-05-22 10:26:11

标签: javascript php jquery iframe

我的应用程序使用iframe来显示内容。我需要检测页面是否在iframe中加载。问题是我需要用php做,javascript操作的DOM是不够的,我需要在加载页面之前用php做一些事情。我在iframe中的每个锚点击中注入了诸如inframe = 1之类的参数,它可以工作。但是我找不到发布请求的好方法。我尝试使用隐藏的输入字段,但它在我的情况下不起作用,我不能控制它,因为这个应用程序是另一个的插件。

我对帖子请求的唯一解决方法是检查iframe加载,新位置参数是否包含' inframe',如果它没有,那么我添加' inframe&#39 ;到该位置并再次加载链接。它工作正常,但在表单提交后页面加载两次。我可以在提交时隐藏iframe并在第二次加载页面后显示它,所以看起来它加载了一次,但仍然加载2次明显更慢并且作为解决方案是不可接受的。

所以这是我不太好的解决方案:

this.iframeReload = function($ iframe){// iframe加载的事件监听器

var newSrc=$iframe.get(0).contentWindow.location.href;

if (newSrc.indexOf('inframe')==-1) {
    console.log('redirecting');
    if(newSrc.indexOf('?')==-1) href+='?inframe=1';
    else newSrc+='&inframe=1';
    $iframe.get(0).contentWindow.location=newSrc;
    return 0; //terminate function and reload the iframe with parameter
}
$iframe.ready(function() { /*stuff to do after iframe loads*/ });

}

有更好的方法吗?就像拦截contentWindow.location一样,在页面加载之前将参数添加到它。我在谷歌搜索过,我发现只使用了加载事件,我已经使用了它并且它没有 帮助很多。或者可能有完全不同的解决方案?任何想法都赞赏。我花了近4个小时处理与这个问题有关的事情。

现在我写完之后,变异观察者已经浮现在我脑海中。我不太了解它。它可以跟踪contentWindow.location的变化吗?我试试吧。

1 个答案:

答案 0 :(得分:0)

有几个选择。从PHP方面,您可以查看引荐来源$_SERVER['HTTP_REFERER'],看看它是否来自已知的iframe加载页面列表。 HTTP_REFERER可以被击中和遗漏,所以请使用它,但不要依赖它。

第二个选项是检测它是否在iFrame中你是如何做的,并使用pushState添加?iniframe=1。之后,您可以检测到并更改表单的操作以匹配action="action.php?iniframe=1"。即使表单发送了if (isset($_GET['iniframe'])) {,您仍然可以在PHP端(POST)选择此功能。

当您在PHP方面进行重定向时,请确保?iniframe=1也适合乘坐。