【问题标题】:Intercept iframe location change before load在加载前拦截 iframe 位置更改
【发布时间】:2015-05-22 10:26:11
【问题描述】:

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

我对发布请求的唯一解决方法是检查 iframe 加载,新位置参数是否包含“inframe”,如果不包含,那么我将“inframe”添加到该位置并再次加载链接。它可以工作,但是在表单提交后页面加载了两次。我可以在提交时隐藏 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 的变化吗?我要试试看。

【问题讨论】:

  • 你可以控制POST的表格吗?如果是,您可以随时将?iniframe=1 添加到操作中。
  • 我试过了。不幸的是,这与隐藏输入的情况相同。它没有效果。请求的操作不是调用它的文件。所以就像表单在 form.php 上,而动作在 action.php 上。将请求发布到 action.php,action.php 重定向到 form.php,$_POST 为空。我对此无能为力。我无法触摸 post.php 和 action.php。
  • 不确定我是否完全关注你。如果 form.php 加载并确定在 iFrame 中,则将其位置设置为 form.php?iniframe=1 并提交到 action.php?iniframe=1,然后重定向回 form.php?iniframe=1。无论是否是POST 表单提交,您都可以随时在$_GET 上提交。
  • 顺便说一句,看看用pushState 设置位置而不是刷新。
  • 然后重定向回form.php。它实际上是 WordPress,但我真的搜索了很多关于如何通过 post 请求传递 get 参数,但我一无所获。

标签: javascript php jquery iframe


【解决方案1】:

有几个选项。在 PHP 方面,您可以查看引用者 $_SERVER['HTTP_REFERER'] 以查看它是否来自已知的 iframe 加载页面列表。 HTTP_REFERER 可以被击中和错过所以使用它,但不要依赖它。

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

当您在 PHP 端进行重定向时,只需确保 ?iniframe=1 也随之而来。

【讨论】:

  • 推荐人根本没有帮助。一个月前我试过了。你对 pushState 是什么意思?它有什么帮助?如果我只是更改 url 而不重新加载,get 参数将什么都不做。
  • 我想这与您使用?iniframe=1 所做的事情有关。如果它需要实际不同的 PHP 代码,那么是的,做往返服务器,如果不需要,history.pushState() 方法将让您更改 URL 而无需重新加载页面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 2015-07-16
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多