1

好的,这与“如何检测 iframe src 何时更改”问题相似但不一样,因为它是 iframe想要更改的时候。我的意思是,我有一个带有 Google 的 iframe(我刚开始使用基于 Web 的操作系统,因为我很无聊,请查看http://dextive.com/russellsayshi/os/)但问题是 google 使用阻止在 iframe 中显示的标头。

到目前为止,我解决它的方法是使用这个简单的源创建一个 PHP 页面(请原谅我的 PHP 菜鸟):

<?php
echo "<base href='".$_GET['url']."'>";

$site=file_get_contents($_GET['url']);

echo $site;
?>

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
<script type="text/javascript">
$("a").click(function() {
    var href = this.href;
    var baseURL = "overridexframe.php?url=";
    window.location = baseURL + href;
    return false;
});
</script>

这很好用,并且将 iframe 源设置为overridexframe.php?url=(url goes here)很好用,直到您尝试搜索。正如您在上面看到的,我有 jQuery 修复链接,但是当它尝试使用 javascript 更改它时,它不会转到我指定的覆盖 URI。有谁知道当 iframe 尝试更改但不能更改时尝试捕获的方法,所以我可以将 JS 应用于它?

4

2 回答 2

0

你到底想在这里实现什么?我在您的“操作系统”中看到一个弹出的“浏览器”。如果您想控制在浏览器弹出窗口中显示的页面(我认为这是有问题的 iFrame 所在的位置),您是否考虑过使用服务器端脚本语言(也许是 PHP)来处理 iFrame?

假设 PHP,它可以像这样工作:

使用 cURL 或 file_get_contents() 获取您要显示的页面。该页面现在在 PHP 中执行查找/替换以操作所有 href 值并将您的 url 更改为如下内容:

href="local_handler.php?target=orig_url"

也为您可能找到的任何表单目标执行此操作。您的“local_handler.php”脚本然后处理所有日志记录。

这样做的结果是您现在可以完全松开 iFrame。外部站点代码现在位于您的原始窗口中 - 您可能会遇到一些样式问题和一些冲突的 JS 问题。

于 2012-09-30T12:40:22.413 回答
0

不,没有官方方法可以检测框架何时仅使用 JavaScript 请求新 URL - 因为如果可以的话,可能会有很多安全后果。实现这一点(并且能够锻炼框架的去向)的唯一方法是在用户可以导航到其他地方的每种可能方式之前介入。有很多方法可以使页面导航到另一个位置:

  1. 点击链接
  2. 提交表格
  3. 在地址栏中输入
  4. javascript / 插件触发 window.location
  5. 元刷新标签
  6. javascript / 插件请求 window.open 使用目标作为 _self 或 _top

以上只有一些是“可覆盖的”,即使那样它也不是完全可靠的......这就是为什么我建议你不要以你的方式进行 - 除非这个项目只是为了学习或娱乐。获取另一个站点的源并将其输出到您自己的内部会导致您遇到各种编码问题……更不用说版权和使用条款方面的法律后果了。

无论如何,本着回答您的问题的精神,您可以通过创建链接覆盖和表单提交覆盖来解决谷歌的“搜索”问题,方法如下:

$('form').submit(function(){

    var form = $(this);

    /// this code will allow you to hijack any forms that try to submit
    /// and stop them submitting, whilst at the same time allowing you
    /// to do something else instead.

    return false;
});

然而,上面的问题是您必须编写 javascript 代码,将提交的表单转换为一个简单的 GET Url,您可以将其附加到您的覆盖路径。如果表单设计为通过 GET 简单地发送其信息,这是可行的(幸运的是,谷歌这样做了)。这在下面的链接中进行了讨论(查找 jQueryform.serializeArray注释,而不是 AJAX,您可以使用它来生成您的 URL)

如何将简单的表单提交转换为 ajax 调用;

如何使用 Javascript 构建查询字符串

但是,如果表单 POST 它是数据,那么如果没有实现一大堆相当复杂的不可靠的东西,您使用的方法将无法工作......如果您考虑一下,您使用什么 URL 来表示 POSTed 表单都是数据?-- 是的,与没有数据的表单完全相同的 URL。

简而言之,如果您希望扩展此系统以覆盖比 Google 的屏幕截图更多的页面,我会想到一种不同的方式来做您想做的事情。

于 2012-09-28T00:15:43.063 回答