【问题标题】:How to detect when an iframe wants to change如何检测 iframe 何时想要更改
【发布时间】:2012-09-27 23:35:10
【问题描述】:

好的,这与“如何检测 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 应用于它?

【问题讨论】:

  • 不能真正评论 JS,但你应该保护你的 GET 引用,至少要确保你正在转义值 - 这是一个潜在的安全漏洞。不要试图引发“哪个转义过程最好”的讨论,像 stripslashes($_GET['url']) 总比没有好。
  • 此页面可能有助于转义您的 GET 值:stackoverflow.com/questions/1522313/…
  • 不要把不想被框起来的页面框起来。

标签: javascript php jquery iframe


【解决方案1】:

不,没有官方方法可以检测框架何时仅使用 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 发送它的信息(幸运的是 Google 这样做),这是可行的。这在下面的链接中进行了讨论(查找 jQuery form.serializeArray 注释,您可以使用它来代替 AJAX 来生成您的 URL)

How to convert simple form submit to ajax call;

How to build query string with Javascript

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

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

【讨论】:

  • 好的,谢谢,您对如何以不同的方式进行操作有什么建议吗?另外,谢谢你的回答。
  • 你试图做的是你不能真正做的事情——尤其是。不在纯 JS 和 HTML 中。其他“在线操作系统”通常依赖 3rd-party 插件或可下载的环境来工作——这正是您遇到的原因。或者如果他们只是在浏览器中,他们不会倾向于提供浏览器......考虑到用户已经拥有一个以便访问“操作系统”。基本上你没有办法在你的网站中完全嵌入另一个网站(Google 有直接反对这个的条款),除非网站所有者允许你或者你使用 Flash/Java/Silverlight 之类的东西...跨度>
【解决方案2】:

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

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

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

href="local_handler.php?target=orig_url"

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2012-07-04
    • 1970-01-01
    • 2013-06-14
    • 2020-12-21
    • 2010-10-09
    相关资源
    最近更新 更多