如何检测iframe何时想要更改

时间:2012-09-27 23:35:11

标签: javascript php jquery iframe

好的,这与'如何检测iframe src更改'问题类似,但不一样,因为iframe 想要更改时。我的意思是,我有一个谷歌iframe(我刚刚开始研究基于网络的操作系统因为我很无聊,请检查http://dextive.com/russellsayshi/os/)但问题是谷歌使用标题来阻止在iframe中显示

到目前为止我解决这个问题的方法是使用这个简单的源代码创建一个PHP页面(请原谅我的PHP noobness):

<?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应用到它?

2 个答案:

答案 0 :(得分:0)

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

  1. 点击链接
  2. 提交表格
  3. 在地址栏中输入
  4. javascript / plugins触发window.location
  5. 元刷新标记
  6. javascript / plugins请求window.open使用target作为_self或_top
  7. 只有上面的一些是“可以覆盖的”,即便如此,它也不完全可靠......这就是为什么我建议你不要继续以你的方式继续 - 除非这个项目只是为了学习或有趣。抓住另一个网站的来源并将其输出到您自己的内容中会导致各种编码问题......更不用说版权和使用条款方面的法律后果了。

    无论如何,本着回答你的问题的精神,你可以通过创建链接覆盖来修复谷歌的“搜索”问题,还可以通过以下方式创建表单提交覆盖:

    $('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 (幸运的是谷歌这样做)发送它的信息,这是可行的。这在下面的链接中讨论(查找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的屏幕图,我会想到一种不同的方式来做您想要的事情。

答案 1 :(得分:0)

你到底想要达到什么目的?我在你的“操作系统”中看到一个弹出“浏览器”..如果你想控制你在浏览器弹出窗口中显示的页面(我假设是违规的iFrame所在的位置)你考虑使用你的服务器端脚本语言(PHP可能)来处理iFrame?

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

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

href="local_handler.php?target=orig_url"

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

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